c语言复杂性
⑴ 如何分析c语言复杂类型
C语言声明的复杂性多来自于各各种类型声明的嵌套。最为典型的便是指针、函数以及数组三者之间的混用。要想准确地理解复杂声明的确切含义,就需要一个清晰的条理逻辑。结合网络上的教程,修修补补完成了这篇教程。 网上的范例有很多,如:1、int (*func)(int *p);2、int (*func)( int *p, int (*f )( int*) );3、int func(void) [5]; 在逐个解析之前,要先说明一下解读的方法,比较著名且有效的就是“右左法则”:"The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed." “首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。” 简单来说,可以归纳为:1、先看标识符:从左往右,有小括号括起来的算作一个。
2、再看右边:标识符右边有“[]”的,便为数组;有“()”的,便为函数。
3、最后看左边:根据类型符确定该声明的类型,有“*”说明是指针,需注意是否有括号将“*”和类型符隔开。 以上面的声明为例:1、int (*func)(int *p); int为类型符,(*func)为标识符,且右边跟有(),说明这是函数,该函数的形参是一个整型指针(int *p)。由类型符int可知这是一个返回值为整型的函数。(*func)是一个函数,因此func就是一个指向函数的指针。因此,int (*func)(int *p)是一个以整型指针为形参,返回整型的函数指针。2、int (*func)( int *p, int (*f )( int*) ); 与上例较为类似,不同的只是多了一个形参,多的那个形参即为上例的声明。3、int func(void) [5]; 该声明实际上是一个非法的声明。func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组(即数组名只能用来赋值而不可被赋值),因此函数返回值不能为数组,该声明非法。 在实际的编程过程中,这样的复杂声明并不提倡。
⑵ C语言时间复杂度求解
(1)两层循环,每层执行n次,时间复杂度为O(n^2)
(2)也是两层循环,可以算出总共执行了多少次,其中n的最高次数为2,所以时间复杂度也为O(n^2)
(3)同上,O(n^2)
(4)循环体执行次数为n-1,时间复杂度为O(n)
(5)三层循环,每层执行n次,时间复杂度为O(n^3)
数据结构课程中,对算法进行评估要求不是很高,只需大致算出语句执行了多少次即可,常见的、能写成小段代码考察的一般都是O(n^2)、O(n)、O(n^3),O(log N)的就那么几个,记住就行。
⑶ C语言里面的复杂度是什么
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
1、时间复杂度
(1)时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
(2)时间复杂度
在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,
k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
2、空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作:
S(n)=O(f(n))
⑷ C语言时间复杂度求帮忙
这个题目,建议你去网络搜索下时间复杂度的算法,和证明过程,很容易得出答案的。也可以来私我
⑸ 关于c语言编程的时间复杂度
printf("%d%c",a,c)算是一条语句。
strcmp(svyd,svyy)这个是一条基本计算
时间复杂度通常不这么看。
如果是一个for循环,比如
for(i = 0; i <n; i++)
{
printf("\n");
}
这样算是o(n),是个线性的。
如果for里面又一个for,那么是o(n^2)。
建议看一下数据结构算法相关的知识。
⑹ C语言,时间复杂度与空间复杂度,算法时间公式T(n)=O(f(n)),与空间公式S(n)=O(f(n))
算法的时间复杂度:
为了便于比较同一问题的不同算法,通常从算法中抽取一种或者多种有代表性的基本操作,再以这些基本操作重复执行的次数与问题规模的关系T(n) 作为算法的时间性量度。
如果T(n) 和 f(n) 是n 的函数,当n →∞ 时,有T(n) / f(n) → c (常数c ≠ 0),记作:T(n) = O(f(n)),称O(f(n)) 为算法的渐近时间复杂度,简称时间复杂度。
算法的空间复杂度:
一个算法实现所占存储空间大致包含三方面:
1. 指令、常数、变量所占用的存储空间;
2. 输入数据所占用的存储空间;
3. 算法执行时所需的辅助空间;
前两者是必须的,通常将算法执行时所需的辅助空间作为分析算法空间复杂度的依据:S(n) = O(f(n)),其中f(n)的规则与时间复杂度一致。
⑺ C语言算法过于复杂怎样改进
关于这个问题,并没有一概而论的统一的说法。关键在于熟能生巧,在学习的时候不能满足于解决的问题,而是要多交流,多看别人写的程序,探究怎么样子简化算法?提高算法的效率,降低算法的时间复杂性。
⑻ C语言 时间复杂性
除非n是几个,正常情况下一定是O(nlgn)<<O(2^n),因此O(nlgn)快得多
⑼ 什么是C语言中的时间复杂度如何计算
时间复杂度不是相对于程序而言的,而是指问题的复杂
例如排序,对分查找在最劣情况下也是平方问题,但对于绝大多数问题而言,我们只关心平均效率。
例如稀疏数组,可以降低对空间的要求,但当有用数据超过一定规模,运行速度将急剧下降。
次数超过4的多项式没有平凡解,所以被成为大O的N次方问题,这样的问题总是需要那么多时间才能完成计算,这就是时间的复杂度。
任何数据的压缩都有极限,越是随机的数据,越不能找到良好的数据结构,这就是空间的复杂性。
实际上如果没有好的算法和数据结构,大多数程序是无法真正做到应用的。
⑽ C语言算法的时间复杂度如何计算啊
看看这个 每个循环都和上一层循环的参数有关。 所以要用地推公式: 设i(n)表示第一层循环的i为n时的循环次数,注意到他的下一层循环次数刚好就是n,分别是0,1,2...n-1 所以,把每一层循环设一个函数分别为:j(n),k(n),t(n) 则有 i(n)=j(0)+...+j(n-1) j(n)=k(0)+...+k(n-1) k(n)=t(0)+...+t(n-1) i(0)=j(0)=k(0)=0 t(n)=1 而总循环数是i(0)+i(1)...+i(n-1) 可以根据递推条件得出准确值 所以算法复杂度是O(i(0)+i(1)...+i(n-1))
记得点赞啊