----------------------
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 定義客戶端的套接字...