數據結構與算法-學習筆記(15)

爲何散列表和鏈表常常會一塊兒使用?

數組佔據隨機訪問的優點,卻有須要連續內存的缺點。算法

鏈表具備可不連續存儲的優點,但訪問查找是線性的。數組

散列表和鏈表、跳錶的混合使用,是爲告終合數組和鏈表的優點,規避它們的不足。緩存

咱們能夠得出數據結構和算法的重要性排行榜:連續空間 > 時間 > 碎片空間。數據結構

所以散列表和鏈表會一塊兒來使用。數據結構和算法

舉例

LRU緩存淘汰算法優化

以前用鏈表實現,它的時間複雜度是O(n)。 利用散列表和鏈表能夠優化到O(1)。指針

  1. 首先根據緩存數據的插入順序進行排序,造成一個雙向鏈表。
  2. 根據緩存數據data建立一個散列表,衝突的解決方式採用鏈表的形式。

hnext指針是爲了鏈接散列表中的衝突鏈表; prev和next指針是雙向鏈表的前繼和後繼指針。cdn

這樣在查詢、插入、刪除操做的時間複雜度都是O(1)。對象

Redis有序集合blog

對學生(id、name、score)對象數據集合進行一下操做:

  • 添加一個學生對象;
  • 按照id來刪除學生對象;
  • 按照id來查找學生對象;
  • 按照score區間查找數據,如score在[100,356]之間的學生對象;
  • 按照score從小到大排序學生對象。

這時就能夠結合散列表、雙向鏈表、跳錶來實現。 使用雙向鏈表對學生對象以score進行排序,結合跳錶。在使用id做爲key實現散列表。

iOS YYMemoryCache 利用散列表和雙向鏈表實現內存緩存。 散列表的實現:直接使用系統提供CFMutableDictionaryRef

相關文章
相關標籤/搜索