842考研----数据结构阶段性总结(2)
目录
第一章 绪论部分总结(2)
1.2算法和算法评价
1.2.1算法的基本概念
1.算法(Algorithm):是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。
2.一个算法还应具有下列5个重要特性:
- 有穷性 确定性 可行性 输入 输出
- eg1:一个算法应该是(B) A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D. A和C
解释:程序不一定满足有穷性,如死循环、操作系统;而算法必须有穷。算法代表的是问题求解步骤的描述,而程序则是算法在计算机上的特定表现。五个基本特性只是算法的必要条件,不是算法的定义
1.2.2算法效率的度量
1.算法效率的度量是通过时间复杂度和空间复杂度来描述的。
2.时间复杂度(自认为就是看循环内的执行次数)
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。算法中基本运算(最深层循环内的语句)的频度与T(n)同数量级,因此通常采用算法中基本运算的频度f(n)来分析算法的时间复杂度。
因此,算法的时间复杂度记为:T(n) = O(f(n))
注:时间复杂度:取f(n)中随n增长最快的项,将其系数置为1作为时间复杂度的度量。例如:f(n)=的时间复杂度为O()。
式中,O的含义是T(n)的数量级,其严格的数学定义是:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正整数C和,使得当n≥时,都满足0≤T(n)≤Cf(n)。
3. 最坏时间复杂度:是指在最坏情况下,算法的时间复杂度;
平均时间复杂度:是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间;
最好时间复杂度:是指在最好情况下,算法的时间复杂度;
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
4.算法的时间复杂度不仅依赖于问题的规模 n,也取决于待输入数据的性质(如输入数据元素的初始状态)。
例如:在数组A[0...n-1]中,查找给定值k的算法大致如下:
(1)i = n - 1 ;
(2)while(i>=0 && (A[i] != k ))
(3)i--;
(4)return i ;
//
该算法中语句3(基本运算)的频度不仅与问题规模n有关,而且与输出实例A的各元素的取值及k的取值有关;
1.若A中没有与k相等的元素,则语句3的频度f(n)= n ;
2.若A中的最后一个元素等于k,则语句3的频度f(n)是常数 0 ;
在分析一个程序的时间复杂度时,有两个规则:加法规则和乘法规则(在此不再介绍);
5.常见的渐近时间复杂度为:
O(1)<O(l)<O(n)<O(n )<O( )<O( )<O( )<O(n!)<O( )
6.空间复杂度
算法的空间复杂度S(n) 定义为该算法所耗费的存储空间,它是问题规模n的函数。记为S(n)=O(g(n))
一个程序在执行时除需要存储空间来存放本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。
算法原地工作是指:算法所需的辅助空间为常量,即O(1)。
1.2.3 时间复杂度习题
1.某算法的时间复杂度为O(),表明该算法的( C )
A.问题规模是 B.执行时间等于 C.执行时间与成正比 D.问题规模与成正比
2.以下算法的时间复杂度为( D )
void fun(int n){ int i=1; while(i<=n) i=i * 2; }
A. O(n) B. O() C. O(n* ) D. O()
解: 设执行次数为t,则 =n ;解得 t = 。 自认为时间复杂度就是循环的次数(不知道我认为的对不对)
3.求整数n(n>=0)的阶乘的算法如下,其时间复杂度是( B )
int fact(int n){ if(n<=1) return 1; return n * fact(n - 1); }
A. O() B. O(n) C. O(n* ) D. O()
解:该题求阶乘n!的递归代码,每次递归调用时 fact( ) 的参数减1,递归出口为 fact (1),一共执行 n 次递归调用 fact ( ),故 T ( n ) = O ( n )。
4.下列程序段的时间复杂度是( C )
count = 0 ; for(k=1;k<=n;k*=2) for(j=1;j<n;j++) count ++ ;
A. O() B. O(n) C. O(n* ) D. O()
解:
内层循环条件 j<= n 与外层循环的变量无关,各自独立,每执行一次 j 自增1,每次内层循环都执行 n 次。外层循环条件 k <= n , 增量定义为 k *= 2 , 可知循环次数 t 满足 k = ≤ n , 即 t <= , 即内层循环的时间复杂度为O(n) , 外层循环的时间复杂度为O()。
对于嵌套循环,根据乘法规则可知,该段程序的时间复杂度 T(n) = T1(n)×T2(n) = O(n)×O() = O(n * )。
5.下列函数的时间复杂度是( B )
int func(int n) { int i= 0 , sum = 0 ; while(sum < n ) sum += ++ i ; return i ; }
A. O(log n ) B. O() C. O( n ) D. O(n·log n )
解:基本运算 sum += ++i ,它等价于 ++i ; sum = sum + i ,每执行一次 i 自增1。
i =1 时,sum=0+1;
i = 2时,sum=0+1+2;
i = 3时,sum=0+1+2+3;
··· ···
以此类推得出 sum=0+1+2+3+4+5+······+ i = [(1+i) * i] / 2 ,可知循环次数 t 满足[(1+ t) * t ] / 2 < n , 因此时间复杂度为B选项 O() 。
6.有以下算法,其时间复杂度是( C )
void fun(int n){ int i = 0; while(i*i*i <=n ) i++; }
A. O( n ) B. O(n·log n) C. O( ) D. O( )
7.程序段如下,其中 n 为正整数,则最后一行语句的频度在最坏情况下是( D )。
for(i=n-1;i>1;i--) for(j=1;j<i;j++) if(A [j] > A [j+1] ) A [j] 与 A [j+1] 对换;
A. O( n ) B. O(n·log n) C. O( ) D. O( )
8.以下算法中加下划线的语句的执行次数为( A )
int m =0,i,j; for(i=1;i<=n;i++) for(j=1;j<=2*i;j++) m++; ____
即:int m =0,i,j; A. n(n+1) B. n C. n+1 D.
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;