1、如何計算演算法的時間複雜度
在計算演算法時間複雜度時有以下幾個簡單的程式分析法則:
1.對於一些簡單的輸入輸出語句或賦值語句,近似認為需要o(1)時間
2.對於順序結構,需要依次執行一系列語句所用的時間可採用大o下"求和法則"
求和法則:是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2(n)
=o(g(n)),則 t1(n)+t2(n)=o(max(f(n), g(n)))
特別地,若t1(m)=o(f(m)), t2(n)=o(g(n)),則 t1(m)+t2(n)=o(f(m) + g(n))
3.對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用
的時間,需注意的是檢驗條件也需要o(1)時間
4.對於迴圈結構,迴圈語句的執行時間主要體現在多次迭代中執行迴圈體以及檢驗
迴圈條件的時間耗費,一般可用大o下"乘法法則"
乘法法則: 是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2
(n)=o(g(n)),則 t1*t2=o(f(n)*g(n))
5.對於複雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法
法則技術整個演算法的時間複雜度
另外還有以下2個運算法則:
(1) 若g(n)=o(f(n)),則o(f(n))+ o(g(n))= o(f(n))
(2) o(cf(n)) = o(f(n)),其中c是乙個正常數
可以用以上法則對下面程式段進行簡單分析
①for (i=0; i② for (j=0; j③ c[i][j] = 0;
④ for (k=0; k⑤ c[i][j]= c[i][j]+ a[i][k]* b[k][j];/ * t5(n) = o(1) */
第①條與②③④⑤是迴圈巢狀t1(n)*t2(n)* (t3(n)+ t4(n)* t5(n))= o(n*n*n)
即為整個演算法的時間複雜度
o(1)2、判斷兩個鍊錶是否相交(來自《程式設計之美》):
在兩個鍊錶沒有環的前提下,如何判斷兩個鍊錶是否相交?
解法一:巢狀迴圈,判斷第二個鍊錶的每個節點是否在第乙個鍊錶中。時間複雜度o(n^2) 也可寫、成(o(len(n1)+len(n2))).
解法三:將第乙個鍊錶的末節點接在第二個鍊錶的頭部。然後從第二個鍊錶開始遍歷看是否能回到第二個鍊錶的頭部,如果能就說明兩個鍊錶相交了。如圖:
時間複雜度:o(n),因為需要儲存第乙個節點的末節點(為了恢復現場)和第二個鍊錶的首節點,空間複雜度是常數o(1)。
解法四:如果兩個鍊錶有相交的話,最後末節點必須相同。所以首先遍歷第乙個節點,記憶末節點;然後遍歷第二節點,判斷末節點是否相同。時間複雜度o(n),而空間的消耗只要存末節點的空間而已。
顯然,以上演算法中解法四相對優異。
如果,問題變為:
1、鍊錶可能有環,該怎麼調整?
鍊錶有環,末節點的下乙個節點肯定在鍊錶內部。所以,不管有沒有環,先斷開末節點的指向,也就是將末節點指向null,然後判斷第二個鍊錶的末節點和第乙個鍊錶是否相同(也即是上面的解法四)。
2、求出第乙個相交的節點
分兩步: a 不管有沒有環,先將末節點指向null變為無環
b 用上面的解法二,找出出現第乙個出現在hash表中的節點。
判斷鍊錶相交 環
程式設計判斷倆個鍊錶是否相交 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?以下是演算法實現部分 如何判斷乙個單鏈表是有環的?注意不能用標誌位,最多只能用兩個...
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...