簡體   English   中英

最壞情況下的時間復雜度列表

[英]Worst case time complexity lists

我知道二元搜索的最佳,平均和最壞情況時間復雜度為Best O(1); 平均O(log n); 最差的O(log n); 用於數組實現。 同樣,我知道插入排序的最佳,平均和最壞情況下的時間復雜度為最佳O(n)。 平均O(n ^ 2); 最差的O(n ^ 2); 用於數組實現。

但是,如何計算二進制搜索和單鏈表插入類型的時間復雜性? 雙向鏈表; 和循環鏈表的實現?

一個簡單的答案是查看您的算法完成的計算機步驟。 您可能需要查看算法證明以及BigO,Omega和Theta表示法。 不同的算法具有不同的最壞情況和最佳情況。 給定具有n個給定輸入的函數F(n)。 它具有G(n)個計算機步驟。 假設G(n)= 5x ^ 2 + 3x +1。大多數人通常看着Big-O。 對於Big(O),您刪除所有系數,然后取前導項。 所以你的大O將是x ^ 2

您根本無法使用鏈接列表(單鏈接或其他任何鏈接)都無法執行二進制搜索。 它要求O(1)訪問任何索引,這對於數組而言很簡單,但對於列表而言則不可能。 想一想如何從元素n/2n/4進行傳遞,例如不遍歷中間或從開始的所有元素。

另一方面,插入排序基於連續遍歷元素,這在鏈表中不是問題,因此將保持相同的復雜性。 請注意,即使您必須從頭開始遍歷每個元素的整個列表(對於單個鏈接列表),也仍然是O(N ^ 2),而不是像以前那樣使用數組。 但是,它確實需要修改算法,這向您展示了一個非常基礎的課程-特定算法規定了數據結構,使用不同的數據結構通常將需要對算法進行更改,在某些情況下還需要更改其復雜性。

是否可以使用二進制搜索取決於是否可以隨機訪問項目(即按索引訪問項目)。 您永遠都無法訪問列表中的項目(單鏈接列表; 雙向鏈表; 和循環鏈接列表)按索引,因此您無法在列表上執行二進制搜索。 但是,您可以改用“ 跳過列表” 您可以在“跳過列表”中獲得O(1)(最佳情況)O(lnN)(平均和最差)搜索。

因為,在插入排序時不需要按索引訪問,所以插入排序的數組和列表之間沒有區別。 通常,您需要訪問前一個項目以插入當前項目,但是,您也可以按相反的順序對項目進行排序,並從開頭(即列表的開頭)找到位置,最后對列表進行反向。 它不會改變時間的復雜性。

BinarySearch:需要隨機訪問元素,可以在喜歡的列表中找到它嗎? 不行 (盡管您可以使用額外的空間將其轉換為array,但這克服了您僅需使用鏈表的事實)

插入排序:
您需要訪問特定索引之前的元素,對於單鏈列表,您肯定不能在O(1)中進行操作。
您可以從頭開始遍歷每個元素的列表,但這會使時間復雜度非常高。

在雙向鏈表中,您可以輕松地應用插入排序,因為您可以在O(1)時間訪問上一個元素。

在上面的討論中,您還可以輕松考慮循環列表。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM