实用数据结构基础学习指导(第二版)
上QQ阅读APP看书,第一时间看更新

1.2 典型习题分析

【例1.1】算法与程序的区别。

解:算法与程序既有区别,又有联系。其区别是:

①算法必须满足有穷性,而程序则不一定满足有穷性。例如,启动计算机必须使用操作系统,只要不关机或不受破坏,操作系统就永不终止。即使没有作业运行,它也一直处在一个等待循环中。因此,操作系统是一个不终止的计算过程,但它不满足算法的定义。

②程序中的指令必须用计算机可以接受的语言书写,而算法则无此限制。但是,当用一台计算机可以接受的语言来书写算法时,它就是程序。一般而言,算法比较抽象,而程序则比较具体。

【例1.2】通常一个算法的时间复杂度是指(  )。

A.算法的平均时间复杂度  B.算法在最坏情况下的时间复杂度

C.算法的期望运行时间  D.算法在最好情况下的时间复杂度

分析:如果没有“平均”“最好”“最坏”的修饰语,时间复杂度就是指最坏的时间复杂度。最坏时间复杂度是算法的所有输入可能情况执行时间的上界,所以应选B。解:B。

解:B

【例1.3】当n取1~10时,比较n、2n、n2、n3、2n、n!、nn增长率的变化。

解:表1-1-1所示为当n取1~10时各函数的变化过程,可见当n≥10时,按增长率由小到大排列依次为n、2n、n2、n3、2n、n!、nn

表1-1-1 各函数值增长表

【例1.4】T(n)=nsin n,则用O可以表示为(  )。

A.T(n)=O(n-1)  B.T(n)=O(1)  C.T(n)=O(n)  D.不确定

分析:sin n的取值范围是-1~1,所以T(n)的上界为O(n1),即O(n),所以应选C。

解:C。

【例1.5】设两个算法的执行时间分别为100n2和2n,它们在同一台计算机上运行,要使前者快于后者,n至少要多大?

分析:要使前者快于后者,即求满足100n2<2n的n。由于100n2和2n这两个函数都是单调递增函数,随着n的增大,2n的递增速度比100n2快。在n≥1的整数情况下,可得出当n≥15时,100n2<2n(可以编写一个程序进行测试)。所以,要使前者快于后者,n至少要大于等于15。

解:n≥15。

【例1.6】当n充分大时,按从小到大的次序对下列时间进行排序:

①T1(n)=5n2+10n+6lgn。

②T2(n)=3n2+100n+3lgn。

③T3(n)=8n2+3lgn。

④T4(n)=2n2+6000nlgn。

分析:为了比较两个同数量级算法的优劣,需突出主项的常数因子,而将低次的

项用O表示,则T1(n)=5n2+10n+6lgn=5n2+O(n),T2(n)=3n2+100n+3lgn=3n2+O(n),T3(n)=8n2+3lgn=8n2+O(lgn),T4(n)=2n2+6000nlgn=2n2+O(nlgn)。当n足够大时,T1(n)、T2(n)、T3(n)、T4(n)的时间复杂度都为O(n2),虽然它们的数量级相同,但各自主项的系数还是有区别的。因为T4(n)的主项常数因子<T2(n)的主项常数因子<T1(n)的主项常数因子<T3(n)的主项常数因子,所以从小到大的顺序为T4(n)、T2(n)、T1(n)、T3(n)。

解:T4(n)、T2(n)、T1(n)、T3(n)。

【例1.7】设3个函数f(n)、g(n)、h(n)分别为:f(n)=100n3+n2+100、g(n)=25n3+50n2

h(n)=n1.5+50nlgn,判断下列关系是否成立:

①f(n)=O(g(n))  ②h(n)=O(n1.5)  ③h(n)=O(nlgn)

分析:①lim f(n)/g(n)=lim(100n3+n2+100)/(25n3+50n2)=4,即f(n)和g(n)的数量级相同,所以①f(n)=O(g(n))成立。

②h(n)的数量级取决于n1.5和nlgn,50是与n无关的常数因子,可以忽略。因为n1.5的数量级大于lgn,也大于nlgn,即lim h(n)/n1.5=lim(n1.5+50nlgn)/n1.5=1,所以②h(n)=O(n1.5)成立。

③lim h(n)/nlgn=lim(n1.5+50nlgn)/nlgn=∞,所以③h(n)=O(nlgn)不成立。

解:①成立;②成立;③不成立。

【例1.8】将一维数组中的元素逆置的算法如下,试分析其时间频度及时间复杂度。

【程序代码】

解:时间频度为T(n)=3n/2,当n充分大时,n的系数3/2可以忽略不计,所以其时间复杂度为O(n)。

【例1.9】将n个元素按升序排列的算法如下,试分析其时间频度及时间复杂度。

【程序代码】

解:时间频度为T(n)=1+(n-1)*(1+2+3+…+n-1)+3(n-1)=n2/2+7n/2-3,时间复杂度为O(n2)。

【例1.10】设n为正整数,分析下列程序段中加下画线的语句的程序步数。

【程序代码】

分析:i=1结束时,i=1+n(n+1)/2;i=2结束时,i=(1+n(n+1)/2)+n(n+1)/2=1+2(n(n+1)/2);i=3结束时,i=(1+2(n(n+1)/2))+n(n+1)/2=1+3(n(n+1)/2)。一般来说,i=k结束时,i=1+k(n(n+1)/2)<100+n,求出满足此不等式的k的最大值,语句i=i+j的程序步数为:(k+1)×(n(n+1)/2)。

解:(k+1)×(n(n+1)/2)。