时间复杂度怎么算例题

时间复杂度算例题如下:

(1)递归执行过程

例子:求N!。

这是一个简单的"累乘"问题,用递归算法也能解决。

n!=n*(n-1)!n>1

0!=1,1!=1n=0,1

因此,递归算法如下:

Java代码

fact(intn){

if(n==0||n==1)

return1;

else

returnn*fact(n-1);

}

以n=3为例,看运行过程如下:

fact(3)-----fact(2)-----fact(1)------fact(2)-----fact(3)

递归回溯

递归算法在运行中不断调用自身降低规模的过程,当规模降为1,即递归到fact(1)时,满足停止条件停止递归,开始回溯(返回调用算法)并计算,从fact(1)=1计算返回到fact(2);计算2*fact(1)=2返回到fact(3);计算3*fact(2)=6,结束递归。

算法的起始模块也是终止模块。

(2)递归实现机制

每一次递归调用,都用一个特殊的数据结构"栈"记录当前算法的执行状态,特别地设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回。递归模块的形式参数是普通变量,每次递归调用得到的值都是不同的,他们也是由"栈"来存储。

(3)递归调用的几种形式

一般递归调用有以下几种形式(其中a1、a2、b1、b2、k1、k2为常数)。

<1>直接简单递归调用:f(n){...a1*f((n-k1)/b1);...};

<2>直接复杂递归调用:f(n){...a1*f((n-k1)/b1);a2*f((n-k2)/b2);...};

<3>间接递归调用:f(n){...a1*f((n-k1)/b1);...},

g(n){...a2*f((n-k2)/b2);...}。

2.递归算法效率分析方法

递归算法的分析方法比较多,最常用的便是迭代法。

迭代法的基本步骤是先将递归算法简化为对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和,再估计和的渐进阶。

<1>例:n!

算法的递归方程为:T(n)=T(n-1)+O(1);

迭代展开:T(n)=T(n-1)+O(1)

=T(n-2)+O(1)+O(1)

=T(n-3)+O(1)+O(1)+O(1)

=......

=O(1)+...+O(1)+O(1)+O(1)

=n*O(1)

=O(n)

这个例子的时间复杂性是线性的。

<2>例:如下递归方程:


T(n)=2T(n/2)+2,且假设n=2的k次方。

T(n)=2T(n/2)+2

=2(2T(n/2*2)+2)+2

=4T(n/2*2)+4+2

=4(2T(n/2*2*2)+2)+4+2

=2*2*2T(n/2*2*2)+8+4+2

=...

=2的(k-1)次方*T(n/2的(i-1)次方)+$(i:1~(k-1))2的i次方

=2的(k-1)次方+(2的k次方)-2

=(3/2)*(2的k次方)-2

=(3/2)*n-2

=O(n)

这个例子的时间复杂性也是线性的。

<3>例:如下递归方程:

T(n)=2T(n/2)+O(n),且假设n=2的k次方。

T(n)=2T(n/2)+O(n)

=2T(n/4)+2O(n/2)+O(n)

=...

=O(n)+O(n)+...+O(n)+O(n)+O(n)

=k*O(n)

=O(k*n)

=O(nlog2n)//以2为底


一般地,当递归方程为T(n)=aT(n/c)+O(n),T(n)的解为:

O(n)(a<c&&c>1)

O(nlog2n)(a=c&&c>1)//以2为底

O(nlogca)(a>c&&c>1)//n的(logca)次方,以c为底

上面介绍的3种递归调用形式,比较常用的是第一种情况,第二种形式也有时出现,而第三种形式(间接递归调用)使用的较少,且算法分析

比较复杂。下面举个第二种形式的递归调用例子。

<4>递归方程为:T(n)=T(n/3)+T(2n/3)+n

为了更好的理解,先画出递归过程相应的递归树:

n-------->n

n/32n/3-------->n

n/92n/92n/94n/9-------->n

...............................

--------

总共O(nlogn)

累计递归树各层的非递归项的值,每一层和都等于n,从根到叶的最长路径是:

n-->(2/3)n-->(4/9)n-->(12/27)n-->...-->1

设最长路径为k,则应该有:


(2/3)的k次方*n=1

得到k=log(2/3)n//以(2/3)为底

于是T(n)<=(K+1)*n=n(log(2/3)n+1)

即T(n)=O(nlogn)

由此例子表明,对于第二种递归形式调用,借助于递归树,用迭代法进行算法分析是简单易行的。



  • 甯繖鏁欎笅鎬庝箞姹鏃堕棿鏃堕棿澶嶆潅搴?閮芥湁浜涗粈涔堢被鍨?
    绛旓細瑙o細T(n)=2n^2+n+1 =O(n^2)2.2.for (i=1;i<n;i++){ y=y+1; 鈶 for (j=0;j<=(2*n);j++)x++; 鈶 } 瑙o細 璇彞1鐨勯搴︽槸n-1 璇彞2鐨勯搴︽槸(n-1)*(2n+1)=2n^2-n-1 f(n)=2n^2-n-1+(n-1)=2n^2-2 璇ョ▼搴忕殑鏃堕棿澶嶆潅搴T(n)=O(n^2).O(n)2...
  • 绠楁硶鐨鏃堕棿澶嶆潅搴
    绛旓細绗竴閬撴槸锛屾眰鍜岋紝鐩村埌瓒呰繃s涓烘锛屾寜鐓姹鍚勫叕寮弉*(n+1)/2>S 浜庢槸n涓庢牴鍙穝鐨勬暟閲忕骇锛岋紙鏃堕棿澶嶆潅搴锛屽彧瑕璁$畻鍑哄畠鐨勯噺绾э紝涓嶇鏄笉鏄瓨鍦ㄤ竴浜涘父鏁伴」锛夋瘮濡備綘璁$畻鍑烘潵鐨勬鏁版槸n^2+10000000000000000锛岃櫧鐒秐鍙兘鍙瓑浜10000锛屼絾鏄椂闂村鏉傚害杩樻槸n^2锛屼笉绠¢偅浜涘父鏁伴」銆傜浜岄亾 for(i=0;i<m;i++)for...
  • 绠楁硶鐨鏃堕棿澶嶆潅搴﹁绠闂
    绛旓細绗竴棰橈細璁緁or寰幆璇彞鐨勬墽琛屾鏁颁负T锛坣锛夛紝鍒 i=2T(n)+1<=n-1 T锛坣锛<=n/2-1=O(n)
  • c璇█鏃堕棿澶嶆潅搴杩欎袱涓鎬庝箞绠,甯屾湜澶т浆璇﹁В?
    绛旓細绗7棰 鍋囪t=y+1锛岄偅寰幆缁撴潫鏃堕渶婊¤冻n<t^2锛屽嵆t>鈭歯鍗硑>鈭歯-1锛屾墍浠鏃堕棿澶嶆潅搴鏄疧(鈭歯)銆傜8棰 褰撳惊鐜鍑烘椂蹇呮弧瓒硑=0锛屾墍浠--瑕佹墽琛寉娆★紝鎵浠鎵鍦ㄨ鍙ョ殑鏃堕棿澶嶆潅搴︽槸O(y)銆
  • 绠楁硶璁捐棰:璁$畻鏃堕棿澶嶆潅搴
    绛旓細鍏充簬鏃堕棿澶嶆潅搴鐨璁$畻鏄寜鐓ц繍绠楁鏁版潵杩涜鐨勶紝姣斿1棰橈細sum1(intn){intp=1,sum=0,m;//1娆 for(m=1;m<=n;m++)//n+1娆 {p*=m;//n娆 sum+=p;}//n娆 return(sum);//1娆 } 鏈鍚庢荤殑娆℃暟涓 1+锛坣+1锛+n+n+1+1=3n+3 鎵浠ユ椂闂村鏉傚害f锛坥锛=n锛涳紙鏃堕棿澶嶆潅搴﹀彧绠鐨勬渶...
  • 涓涓畻娉曠殑鏃堕棿澶嶆潅搴涓(n3+n2log2n+14n)/n2,鍏舵暟閲忕骇琛ㄧず涓...
    绛旓細缁撴灉涓猴細O(n)瑙i杩囩▼濡備笅锛氬洜涓鏃堕棿澶嶆潅搴鏄璁$畻n瓒嬩簬鏃犵┓澶ф椂鍊欑殑鏃犵┓澶ч噺鐨勬渶澶ч樁娆 缁撴灉绗竴椤规槸n锛岀2椤规槸log2n锛岀3椤规槸1/n锛屽綋n瓒嬩簬鏃犵┓澶ф椂锛岀浜岄」姣旂涓椤瑰皬锛岀3椤逛负0 鎵浠(n3+n2log2n+14n)/n2锛屽叾鏁伴噺绾ц〃绀轰负O(n)...
  • 濡備綍璁$畻涓涓畻娉曠殑鏃堕棿澶嶆潅搴
    绛旓細姹傝В绠楁硶鐨鏃堕棿澶嶆潅搴鐨勫叿浣撴楠ゆ槸锛氣懘鎵惧嚭绠楁硶涓殑鍩烘湰璇彞锛涚畻娉曚腑鎵ц娆℃暟鏈澶氱殑閭f潯璇彞灏辨槸鍩烘湰璇彞锛岄氬父鏄渶鍐呭眰寰幆鐨勫惊鐜綋銆傗懙璁$畻鍩烘湰璇彞鐨勬墽琛屾鏁扮殑鏁伴噺绾э紱鍙渶璁$畻鍩烘湰璇彞鎵ц娆℃暟鐨勬暟閲忕骇锛岃繖灏辨剰鍛崇潃鍙淇濊瘉鍩烘湰璇彞鎵ц娆℃暟鐨勫嚱鏁颁腑鐨勬渶楂樻骞傛纭嵆鍙紝鍙互蹇界暐鎵鏈変綆娆″箓鍜屾渶楂樻骞...
  • 濡備綍璁$畻涓涓畻娉曠殑鏃堕棿澶嶆潅搴?
    绛旓細姹傝В绠楁硶鐨鏃堕棿澶嶆潅搴鐨勫叿浣撴楠ゆ槸锛1銆佹壘鍑虹畻娉曚腑鐨勫熀鏈鍙ワ細绠楁硶涓墽琛屾鏁版渶澶氱殑閭f潯璇彞灏辨槸鍩烘湰璇彞锛岄氬父鏄渶鍐呭眰寰幆鐨勫惊鐜綋銆2銆璁$畻鍩烘湰璇彞鐨勬墽琛屾鏁扮殑鏁伴噺绾э細锛1锛夊彧闇璁$畻鍩烘湰璇彞鎵ц娆℃暟鐨勬暟閲忕骇锛岃繖灏辨剰鍛崇潃鍙淇濊瘉鍩烘湰璇彞鎵ц娆℃暟鐨勫嚱鏁颁腑鐨勬渶楂樻骞傛纭嵆鍙紝鍙互蹇界暐鎵鏈変綆娆″箓鍜...
  • 绠楁硶鐨鏃堕棿澶嶆潅搴﹁绠闂
    绛旓細绗竴棰:int i=1,k=100杩欐潯璇彞绠楁硶姝ユ暟鏄2姝ワ紝鎵ц棰戠巼鏄1;寰幆涓紝k=k+1;杩欐潯璇彞姣忔绠楁硶姝ユ暟鏄1;鎵ц棰戠巼鏄痭/2-1;i+=2杩欐潯璇彞姣忔绠楁硶姝ユ暟鏄1;鎵ц棰戠巼鏄痭/2-1;鎵浠ョ畻娉澶嶆潅搴涓1*(n/2-1)+1*(n/2-1)+2=n=o(n);
  • ...>=(y+1)*(y+1)) y=y+1;涓婇潰杩欎釜鎬庝箞绠瀹冪殑鏃堕棿澶嶆潅搴鍛
    绛旓細鏃堕棿澶嶆潅搴涓篛(n½)锛屽洜涓簑hile寰幆鍦(y+1)²>n鏃剁粨鏉燂紝鑻ユ牴鍙穘涓烘暣鏁帮紝鍒欏惊鐜牴鍙穘娆★紝鍚﹀垯鎵ц鏍瑰彿n-1娆°備竴涓畻娉曟墽琛屾墍鑰楄垂鐨勬椂闂达紝浠庣悊璁轰笂鏄笉鑳界畻鍑烘潵鐨勶紝蹇呴』涓婃満杩愯娴嬭瘯鎵嶈兘鐭ラ亾銆備絾鎴戜滑涓嶅彲鑳戒篃娌℃湁蹇呰瀵规瘡涓畻娉曢兘涓婃満娴嬭瘯锛屽彧闇鐭ラ亾鍝釜绠楁硶鑺辫垂鐨勬椂闂村锛屽摢涓畻娉曡姳璐圭殑...
  • 扩展阅读:时间复杂度的简单例题 ... 算法时间复杂度证明题 ... 一张图看懂时间复杂度 ... 常见算法的时间复杂度 ... 时间复杂度例题及答案 ... 计算时间的三个公式 ... 时间复杂度计算步骤 ... 算法的时间复杂度例题 ... 时间复杂度经典计算的例题 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网