簡體   English   中英

C中未排序與排序的鏈表的效率

[英]Efficiency of an unsorted vs sorted linked list in C

對於一個編程項目,我創建了兩個鏈表程序:一個未排序的鏈表和一個排序的鏈表。 只要未在列表中找到值,未排序的鏈表程序就會將值添加到列表的末尾。 如果在列表中找到該值,則刪除包含該值的節點。 sortedlinked_list程序的唯一區別是,如果列表中未找到值,則該程序將尋找適當的空間來插入該值,而不是僅將值添加到末尾,從而使存儲庫始終保持在已排序狀態訂購。 我有一個“ stepcounter”變量,即使在遍歷鏈表時,每次將程序中的指針重新分配給指向不同指針的點時,該變量基本上都會增加。 我將此變量輸出到屏幕上,以使我對程序的效率有所了解。 奇怪的是,如果我在排序列表和未排序列表上運行相同的操作,則步驟數或未排序列表的工作量比排序列表要多。 這對我來說似乎很違反直覺,但是我檢查了一下代碼,並且確定可以在所有相同的地方進行遞增,因此我無法就為何未排序的鏈表操作需要更多步驟做出解釋比排序。 有什么我想念的嗎?

如果您真的在跟蹤指針分配,那么像

while (p && (p.value != input) && (p.next != NULL)) p = updatePointer(p.next);

(假設updatePointer負責您的計數)對您檢查的每個節點執行其中之一。

  • 要知道某項是否在未排序列表中,您必須查看列表中的每個節點。 (也就是說,您必須使用我上面的代碼)

  • 要做到排序名單上的同樣的事情,你只需要繼續找,直到你通過了空間,該項目的問題會一直 這意味着代碼像

     while (p && (p.value < input) && (p.next != NULL)){ p = updatePointer(p.next); } if (p.value == input) //... 

假設隨機分布(即無序輸入),則您期望第二種情況需要大約1/2的比較。

假設您要在兩個列表中都插入1000個數據,並且該數據是純隨機順序,但其值為1到1000。

另外,假設兩個列表都已經被500個數據項填充,這些數據項是未排序列表的純隨機順序,而在已排序列表的情況下已排序。

對於未排序的列表,您必須檢查每個項目以查找可能的雙精度數,這將導致指針向每個已訪問節點前移。

對於排序的列表,您只需要以這種方式向前搜索,直到列表中第一個元素的值更大。

通過將1000個元素插入到已經填充500個項目的列表中,值達到1到1000的總范圍的可能性是50%。 這將創建所有要替換的操作的50%,與未排序列表相比,該操作可以檢查未排序列表是否有其他項。 使用未排序的列表(1步而不是4步),插入本身會更便宜。

暫無
暫無

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

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