時間複雜度 鍊錶相交判斷

2021-08-31 10:33:57 字數 1790 閱讀 5290

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...