黑馬程式設計師學習筆記 關於時間複雜度計算2

2021-06-21 20:22:49 字數 4484 閱讀 9708

---------------------- 

asp.net+unity開發

、.net培訓

、期待與您交流! ----------------------

以上三條單個語句的頻度均為1,該程式段的執行時間是乙個與問題規模n無關的常數。演算法的時間複雜度為常數階,記作t(n)=o(1)。如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。

o(n^2)

2.1. 交換i和j的內容

sum=0;(一次)

for(i=1;i<=n;i++)       (n次)

for(j=1;j<=n;j++) (n^2次)

sum++;(n^2次)

解:t(n)=2n^2+n+1 =o(n^2)

2.2.   

for (i=1;i

①for(j=0;j<=(2*n);j++)    

x++;       

②}         

解:語句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.3.

a=0;

b=1;                     

①for (i=1;i<=n;i++)

②解:語句1的頻度:2,        

語句2的頻度:n,        

語句3的頻度:n-1,        

語句4的頻度:n-1,    

語句5的頻度:

n-1,                                  

t(n)=2+n+3(n-1)=4n-1=o(n).

o(log2n )

2.4.

i=1;      

①while (i<=n)

i=i*2; ②解:

語句1的頻度是

1,  

設語句2

的頻度是

f(n),  

則:2^f(n)<=n;f(n)<=log2n    

取最大值

f(n)=log2n,

t(n)=o(log2n )

o(n^3)

2.5.

for(i=0;i

解:當i=m, j=k

的時候,

內層迴圈的次數為k當

i=m時

, j

可以取0,1,...,m-1 ,

所以這裡最內迴圈共進行了

0+1+...+m-1=(m-1)m/2

次所以,i從0

取到n,

則迴圈共進行了

: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6

所以時間複雜度為

o(n^3).

我們還應該區分演算法的最壞情況的行為和期望行為。如快速排序的最

壞情況執行時間是

o(n^2)

,但期望時間是

o(nlogn)

。通過每次都仔細

地選擇基準值,我們有可能把平方情況(即

o(n^2)情況)

的概率減小到幾乎等於

0。在實際中,精心實現的快速排序一般都能以

(o(nlogn)

時間執行。

下面是一些常用的記法

①訪問陣列中的元素是常數時間操作,或說

o(1)

操作。

②乙個演算法如果能在每個步驟去掉一半資料元素,如二分檢索,通常它就取

o(logn)

時間。③

用strcmp

比較兩個具有

n個字元的串需要

o(n)

時間。

④常規的矩陣乘演算法是

o(n^3)

,因為算出每個元素都需要將

n對元素相乘並加到一起,所有元素的個數是

n^2。 ⑤

指數時間演算法通常**於需要求出所有可能結果。

例如,n個元素的集合共有

2n個子集

,所以要求出所有子集的演算法將是

o(2n)的。

:-d指數演算法一般說來是太複雜了,除非

n的值非常小,因為,在這個問題中增加乙個元

素就導致執行時間加倍。不幸的是,確實有許多問題

(如著名的

「巡迴售貨員問題

」 ),到目

前為止找到的演算法都是指數的。如果我們真的遇到這種情況,通常應該用尋找近似最佳結果

的演算法替代之。

常見的時間複雜度,按數量級遞增排列依次為:常數階o(1)

、對數階

o(log2n)

、線性階

o(n)

線性對數階

o(nlog2n)

、平方階

o(n^2)

、立方階

o(n^3)、k

次方階o(n^k)

、指數階

o(2^n)

。下面我們通過例子加以說明,讓大家碰到問題時知道如何去解決。 1

、設三個函式

f,g,h

分別為f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn

請判斷下列關係是否成立:(1

)f(n)=o(g(n))(2

)g(n)=o(f(n))(3

)h(n)=o(n^1.5)(4

)h(n)=o(nlgn)

◆(1)

成立。題中由於兩個函式的最高次項都是

n^3,

因此當n→∞

時,兩個函式的比值是

乙個常數,所以這個關係式是成立的。◆(

2)成立。與上同理。◆(

3)成立。與上同理。◆(

4)不成立。由於當

n→∞時

n^1.5

比nlgn

遞增的快,所以

h(n)

與nlgn

的比值不是常數,故不成立。 2

、設n為正整數,利用大

"o"記號,將下列程式段的執行時間表示為

n的函式。

(1) i=1; k=0

while(i

解答:t(n)=n-1

,t(n)=o(n)

,這個函式是按線性階遞增的。

(2) x=n; // n>1

while (x>=(y+1)*(y+1))

y++;

解答:t(n)=n1/2

,t(n)=o(n1/2)

,最壞的情況是

y=0,那麼迴圈的次數是

n1/2

次,這是乙個按平方根階遞增的函式。

(3) x=91; y=100;

while(y>0)

if(x>100)

else x++;

解答:t(n)=o(1)

,這個程式看起來有點嚇人,總共迴圈執行了

1000

次,但是我們看到n沒有

?沒。這段程式的執行是和

n無關的,就算它再迴圈一萬年,我們也不管他,只是乙個常數階的函式。

乙個經驗規則

有如下複雜度關係

c< log2n < n < n * log2n < n^2 < n^3 < 2^n < 3^n < n!其中c

是乙個常量,如果乙個演算法的複雜度為c、

log2n 、n

、n*log2n ,

那麼這個演算法時間效率比較高

,如果是

2^n , 3^n ,n!

,那麼稍微大一些的

n就會令這個演算法不能動了,居於中間的幾個則差強人意。

---------------------- 

asp.net+unity開發

、.net培訓

、期待與您交流! ----------------------詳細請檢視:

黑馬程式設計師 學習筆記

windows phone 7手機開發 net培訓 期待與您交流!filestream sqlconnection實現了idispose介面,用完需要被釋放掉 using sqlconnection conn new sqlconnection 用完被釋放掉了 當close後還可以再進行open,物...

黑馬程式設計師 學習筆記 Math

asp.net android ios開發 net培訓 期待與您交流!math類 看到這個單詞就可以想到這是個跟數學有關係的類,這個類包括了一切計算的方法,四捨五入,隨機數,正切,餘切等等。具體方法參考api 這裡就記錄幾個常用的方法 double w math.ceil 12.1 system.o...

黑馬程式設計師 Java 學習筆記

filewriter 建立乙個filewriter物件,該物件一被初始化就必須明確被操作的檔案,而且該檔案會被建立到指定的目錄下。如果該目錄下已有同名檔案,將被覆蓋。下面的例子是將客戶端的檔案拷貝到伺服器上 客戶端 socket s newsocket 1.1.1.1 10000 定義客戶端的套接字...