爲什麼數組比鏈表查詢速度更快?

爲什麼數組比鏈表查詢速度更快?

  • 數組由於是緊湊連續存儲,可以隨機訪問,通過索引快速找到對應元素,而且相對節約存儲空間。但正因爲連續存儲,內存空間必須一次性分配夠,所以說數組如果要擴容,需要重新分配一塊更大的空間,再把數據全部複製過去,時間複雜度 O(N);而且你如果想在數組中間進行插入和刪除,每次必須搬移後面的所有數據以保持連續,時間複雜度 O(N)。
  • 鏈表因爲元素不連續,而是靠指針指向下一個元素的位置,所以不存在數組的擴容問題;如果知道某一元素的前驅和後驅,操作指針即可刪除該元素或者插入新元素,時間複雜度O(1)。但是正因爲存儲空間不連續,你無法根據一個索引算出對應元素的地址,所以不能隨機訪問;而且由於每個元素必須存儲指向前後元素位置的指針,會消耗相對更多的儲存空間。

另外值得驚醒的一句話是:
數據結構的存儲方式只有兩種:數組(順序存儲)和鏈表(鏈式存儲)

這句話怎麼理解,不是還有散列表、棧、隊列、堆、樹、圖等等各種數據結構嗎?

  • 我們分析問題,一定要有遞歸的思想,自頂向下,從抽象到具體。你上來就列出這麼多,那些都屬於「上層建築」,而數組和鏈表纔是「結構基礎」。因爲那些多樣化的數據結構,究其源頭,都是在鏈表或者數組上的特殊操作,API
    不同而已。
  • 比如說「隊列」、「棧」這兩種數據結構既可以使用鏈表也可以使用數組實現。用數組實現,就要處理擴容縮容的問題;用鏈表實現,沒有這個問題,但需要更多的內存空間存儲節點指針。
  • 「圖」的兩種表示方法,鄰接表就是鏈表,鄰接矩陣就是二維數組。鄰接矩陣判斷連通性迅速,並可以進行矩陣運算解決一些問題,但是如果圖比較稀疏的話很耗費空間。鄰接表比較節省空間,但是很多操作的效率上肯定比不過鄰接矩陣。
  • 「散列表」就是通過散列函數把鍵映射到一個大數組裏。而且對於解決散列衝突的方法,拉鍊法需要鏈表特性,操作簡單,但需要額外的空間存儲指針;線性探查法就需要數組特性,以便連續尋址,不需要指針的存儲空間,但操作稍微複雜些。
    -「樹」,用數組實現就是「堆」,因爲「堆」是一個完全二叉樹,用數組存儲不需要節點指針,操作也比較簡單;用鏈表實現就是很常見的那種「樹」,因爲不一定是完全二叉樹,所以不適合用數組存儲。爲此,在這種鏈表「樹」結構之上,又衍生出各種巧妙的設計,比如二叉搜索樹、AVL樹、紅黑樹、區間樹、B 樹等等,以應對不同的問題。
  • 瞭解 Redis 數據庫的朋友可能也知道,Redis 提供列表、字符串、集合等等幾種常用數據結構,但是對於每種數據結構,底層的存儲方式都至少有兩種,以便於根據存儲數據的實際情況使用合適的存儲方式。

數據結構種類很多,甚至你也可以發明自己的數據結構,但是底層存儲無非數組或者鏈表

轉載自:學習數據結構和算法的高效方法

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