公升序鍊錶合併為降序鍊錶的複雜度問題分析

2021-09-25 15:02:28 字數 2265 閱讀 5398

題目

鏈結

解析

這道題答案個人覺得應該為d。雖然確實比較次數最多是m+n次。

1.貢獻時間複雜度的不是「移動」次數,而是「比較」,如果從「移動」的角度上考慮,不管是什麼情況,它都移動了m+n次。08

10^8

108時,o(min(m,n))=o(1),o(max(m,n))=o(1

08)o(10^8)

o(108)

,所以o(m+n)和o(min(m,n))不等價。

但是個人覺得這種方法有點為了「解釋答案」而去解釋,正常人誰能想到還要用夾逼定理去算時間複雜度???

3.所以我覺得直接從本質上考慮就好,這種演算法的本質:就是兩個表進行比較,其中乙個表比較完之後,剩下的直接插入。因此最好的情況,不用想的太複雜,其實就只是短的那個表比較完了:o(min(m,n))。而最壞的情況,就只是長的那個表比較完了:o(max(m,n))。

從編碼的角度看,兩個有序順序表合併乙個新的有序順序表中,核心演算法如下:

while

(iwhile

(i//還剩乙個沒有比較完的順序表

c.data[k++

]=a.data[i++

];while

(jc.data[k++

]=b.data[j++];

c.length=k;

所以從**來看,它的比較次數是上面的while迴圈次數+下面的while迴圈次數,確實是m+n次昂?!

但是這個演算法的時間複雜度應該以上面的那個while為準,它退出迴圈的時候,就只是單單的判斷有乙個表的下標越界了而已,最壞的其實就是max(m,n)。

5.這道題目前的兩派人,無非就是爭執o(m+n)和o(max(m,n)),那麼兩邊好像都有點道理,那問題出在**?

昨天受到乙個學生的啟發,就是下面這個程式的時間複雜度:

for

(i=1

;i<=n;i++

)for

(j=1

;j<=i;j++

)for

(k=1

;k<=j;k++

) x++

;

上面這個的時間複雜度t(n

)=o(

∑i=1

n∑j=

1i∑z

=1jl

)=o(

16n3

)t(n)=o( \sum _^n^i^j}l})=o(\fracn^3 )

t(n)=o

(∑i=

1n​∑

j=1i

​∑z=

1j​l

)=o(

61​n

3),最後從「級數」的角度出發,所以時間複雜度是o(n

3)o(n^3)

o(n3)。

那麼計算次數的時候,具體的n=2的時候,可以看見這個x++;語句運算了4次!!!

那麼從時間複雜度考慮,三個累乘的直接結果是,而帶入n=2時是算不出執行了8次的!

再換句話說,o()的時間複雜度,帶入n的時候,有時候是沒辦法通過「時間複雜度」去算出具體的「執行次數」,原因就是,「時間複雜度」是乙個「變化級數」的層次概念,而不是具體的執行次數的概念。o(10n),o(n+180),o(n-30)…等等都是o(n)級數。

這就是「級數」和「實際執行次數」的中間斷層!!!

那麼max(m,n)就是對應的「級數」層次,而m+n對應的是「實際執行次數」,所以導致出現了這個爭議,兩邊其實都沒有錯!

因此,筆者堅持答案應該是max(m,n),而不是具體的執行次數。

6.這個是2023年的聯考題,原答案是o(max(m,n))。雖然提倡質疑「標準答案」的做法,但是這種全國統一考的試題中,錯誤答案應該是幾乎沒有的。

總結:計算複雜度時優先考慮比較的複雜度,剩下的操作複雜度不做考慮,因為我們設計的演算法就是要解決如何找?如何算?至於像本題剩下的如何移動剩下的不納入演算法複雜度內,也就是老師所說的「級數」層次,所以答案為o(m

ax(n

,m))

o(max(n,m))

o(max(

n,m)

)

兩個公升序鍊錶合併為乙個公升序鍊錶

linklist mergeheaderlinklist linklist l,linklist p else while header2 next null if header1 next null printf 找到比 d大的值 d n header2 next data,header1 nex...

兩公升序鍊錶合併

問題 輸入兩個非遞減序列的序列,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照非遞減排序的,要求使用原來的鍊錶空間。例如 1,3,9 和 2,8 結果為 1,2,3,8,9 分析 分析完畢,看 include includetypedef int datatype typedef struct node...

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回

將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 3 5,2 4 6 輸出 1 2 3 4 5 6 node等價於 struct node pnode等價於struct node 此處用大寫是為了與變數區分,可以讓人容易變出是個資料型別 ...