數組與單鏈表與雙鏈表

數組與鏈表

數組靜態分配內存,鏈表動態分配內存;數組在內存中連續,鏈表不連續;數組利用下標定位,時間複雜度爲O(1),鏈表定位元素時間複雜度O(n);數組插入或刪除元素的時間複雜度O(n),鏈表的時間複雜度O(1)。

數組的優點

隨機訪問性強(通過下標進行快速定位)
查找速度快

數組的缺點

插入和刪除效率低(插入和刪除需要移動數據)
可能浪費內存(因爲是連續的,所以每次申請數組之前必須規定數組的大小,如果大小不合理,則可能會浪費內存)
內存空間要求高,必須有足夠的連續內存空間。
數組大小固定,不能動態拓展

鏈表的優點

插入刪除速度快(因爲有next指針指向其下一個節點,通過改變指針的指向可以方便的增加刪除元素)
內存利用率高,不會浪費內存(可以使用內存中細小的不連續空間(大於node節點的大小),並且在需要空間的時候才創建空間)
大小沒有固定,拓展很靈活。

鏈表的缺點

不能隨機查找,必須從第一個開始遍歷,查找效率低

單鏈表和雙鏈表的區別

單鏈表只有一個指向下一結點的指針,也就是隻能next
雙鏈表除了有一個指向下一結點的指針外,還有一個指向前一結點的指針,可以通過prev()快速找到前一結點,顧名思義,單鏈表只能單向讀取

爲什麼目前市場應用上單鏈表的應用要比雙鏈表的應用要廣泛的多呢

在這裏插入圖片描述
在這裏插入圖片描述

1、刪除單鏈表中的某個結點時,一定要得到待刪除結點的前驅,得到該前驅有兩種方法,第一種方法是在定位待刪除結點的同時一路保存當前結點的前驅。第二種方法是在定位到待刪除結點之後,重新從單鏈表表頭開始來定位前驅。儘管通常會採用方法一。但其實這兩種方法的效率是一樣的,指針的總的移動操作都會有2*i次。而如果用雙向鏈表,則不需要定位前驅結點。因此指針總的移動操作爲i次。

2、查找時也一樣,我們可以借用二分法的思路,從head(首節點)向後查找操作和last(尾節點)向前查找操作同步進行,這樣雙鏈表的效率可以提高一倍。

可是爲什麼市場上單鏈表的使用多餘雙鏈表呢?

從存儲結構來看,每個雙鏈表的節點要比單鏈表的節點多一個指針,而長度爲n就需要 n*length(這個指針的length在32位系統中是4字節,在64位系統中是8個字節) 的空間,這在一些追求時間效率不高應用下並不適應,因爲它佔用空間大於單鏈表所佔用的空間;這時設計者就會採用以時間換空間的做法,這時一種工程總體上的衡量。

如果從時間複雜度上看的話,單鏈表插入的時候時間複雜度可以爲O(1),可以爲O(n),但是如果是雙鏈表的話時間複雜度是O(1)。故引入雙鏈表。但是從空間複雜度上看,雙向鏈表肯定比單鏈表大,所以在一定的內存下犧牲時間事件複雜度來成全空間複雜度我覺得還是比較有效果的。尤其是在這個大數據的時代。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章