資料結構與演算法簡記 雜湊表

2022-06-30 14:09:10 字數 3128 閱讀 7327

1.雜湊表**於陣列,它借助雜湊函式對陣列這種資料結構進行擴充套件,利用的是陣列支援按照下標隨機訪問元素的特性。

2.需要儲存在雜湊表中的資料我們稱為鍵,將鍵轉化為陣列下標的方法稱為雜湊函式,雜湊函式的計算結果稱為雜湊值。

3.將資料儲存在雜湊值對應的陣列下標位置。

1.雜湊函式計算得到的雜湊值是乙個非負整數。

2.若key1=key2,則hash(key1)=hash(key2)

3.若key≠key2,則hash(key1)≠hash(key2)

正是由於第3點要求,所以產生了幾乎無法避免的雜湊衝突問題。

①核心思想:如果出現雜湊衝突,就重新探測乙個空閒位置,將其插入。

②實現:

線性探測法(linear probing):衝突則依次向後查詢空閒位置

二次探測(quadratic probing):線性探測每次探測的步長為1,即在陣列中乙個乙個探測,而二次探測的步長變為原來的平方。

雙重雜湊(double hashing):使用一組雜湊函式,直到找到空閒位置為止。

③用「裝載因子」來表示空位多少,公式:雜湊表裝載因子 = 填入表中的個數 / 雜湊表的長度。

裝載因子越大,說明空閒位置越少,衝突越多,雜湊表的效能會下降。

插入時,通過雜湊函式定位槽位,新增到槽位鍊錶末尾

查詢更新時,通過雜湊函式定位槽位,再遍歷鍊錶比較key

刪除時,定位槽位,遍歷比較key,刪除鍊錶相應節點

1. 假設我們有 10 萬條 url 訪問日誌,如何按照訪問次數給 url 排序?

遍歷 10 萬條資料,以 url 為 key,訪問次數為 value,存入雜湊表,同時記錄下訪問次數的最大值 k,時間複雜度 o(n)。

如果 k 不是很大,可以使用桶排序,時間複雜度 o(n)。如果 k 非常大(比如大於 10 萬),就使用快速排序,複雜度 o(nlogn)。

2. 有兩個字串陣列,每個陣列大約有 10 萬條字串,如何快速找出兩個陣列中相同的字串?

以第乙個字串陣列構建雜湊表,key 為字串,value 為出現次數。再遍歷第二個字串陣列,以字串為 key 在雜湊表中查詢,如果 value 大於零,說明存在相同字串。時間複雜度 o(n)。

不能太複雜:太複雜影響效能

雜湊函式生成的值要盡可能隨機並且均勻分布:最小化雜湊衝突

求餘、取模、直接定址法、平方取中法、摺疊法、隨機數法

資料搬移需要重新計算位置

為了解決一次性擴容耗時過多的情況,我們可以將擴容操作穿插在插入操作的過程中,分批完成。

當裝載因子觸達閾值之後,我們只申請新空間,但並不將老的資料搬移到新雜湊表中。

當有新資料要插入時,我們將新資料插入新雜湊表中,並且從老的雜湊表中拿出乙個資料放入到新雜湊表。每次插入乙個資料到雜湊表,我們都重複上面的過程。

經過多次插入操作之後,老的雜湊表中的資料就一點一點全部搬移到新雜湊表中了。這樣沒有了集中的一次性資料搬移,插入操作就都變得很快了。

初始大小:16

裝載因子和動態擴容:最大裝載因子預設是 0.75,當 hashmap 中元素個數超過 0.75*capacity(capacity 表示雜湊表的容量)的時候,就會啟動擴容,每次擴容都會擴容為原來的兩倍大小。

雜湊衝突解決方法:hashmap 底層採用鍊錶法來解決衝突;jdk1.8 版本中,對 hashmap 做進一步優化,引入了紅黑樹。而當鍊表長度太長(預設超過 8)時,鍊錶就轉換為紅黑樹。我們可以利用紅黑樹快速增刪改查的特點,提高 hashmap 的效能。當紅黑樹結點個數少於 8 個的時候,又會將紅黑樹轉化為鍊錶。因為在資料量較小的情況下,紅黑樹要維護平衡,比起鍊錶來,效能上的優勢並不明顯。

雜湊函式

int hash(object key)

操作

①往快取中新增乙個資料;

②從快取中刪除乙個資料;

③在快取中查詢乙個資料;

④總結:上面3個都涉及到查詢。

只使用鍊錶實現

①需要維護乙個按照訪問時間從大到小的有序排列的鍊錶結構。

②緩衝空間有限,當空間不足需要淘汰乙個資料時直接刪除鍊錶頭部的節點。

③當要快取某個資料時,先在鍊錶中查詢這個資料。若未找到,則直接將資料放到鍊錶的尾部。若找到,就把它移動到鍊錶尾部。

④前面說了,lru快取的3個主要操作都涉及到查詢,若單純由鍊錶實現,查詢的時間複雜度很高為o(n)。若將鍊錶和雜湊表結合使用,查詢的時間複雜度會降低到o(1)。

鍊錶和雜湊表結合使用實現

①使用雙向鍊錶儲存資料,鍊錶中每個節點儲存資料(data)、前驅指標(prev)、後繼指標(next)和hnext指標(解決雜湊衝突的鍊錶指標)。

②雜湊表通過鍊錶法解決雜湊衝突,所以每個節點都會在兩條鏈中。一條鏈是雙向鍊錶,另一條鏈是雜湊表中的拉鍊。前驅和後繼指標是為了將節點串在雙向鍊錶中,hnext指標是為了將節點串在雜湊表的拉鍊中。

③lru快取淘汰演算法的3個主要操作如何做到時間複雜度為o(1)呢?

首先,我們明確一點就是鍊錶本身插入和刪除乙個節點的時間複雜度為o(1),因為只需更改幾個指標指向即可。

接著,來分析查詢操作的時間複雜度。當要查詢乙個資料時,通過雜湊錶可實現在o(1)時間複雜度找到該資料,再加上前面說的插入或刪除的時間複雜度是o(1),所以我們總操作的時間複雜度就是o(1)。

和lru快取淘汰策略實現一模一樣。支援按照插入順序遍歷資料,也支援按照訪問順序遍歷資料。

有序集合的操作有哪些?

舉個例子,比如使用者積分排行榜有這樣乙個功能:可以通過使用者id來查詢積分資訊,也可以通過積分區間來查詢使用者id。這裡使用者id就是key,積分就是score。所以,有序集合的操作如下:

①新增乙個物件;

②根據鍵值刪除乙個物件;

③根據鍵值查詢乙個成員物件;

④根據分值區間查詢資料,比如查詢積分在[100.356]之間的成員物件;

⑤按照分值從小到大排序成員變數。

這時可以按照分值將成員物件組織成跳表結構,其中按照鍵值來刪除、查詢成員物件就會很慢,按照鍵值構建乙個雜湊表,這兩個操作就會變成o(1)

資料結構與演算法簡記 雜湊演算法

將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。md5 md5 message digest algorithm,md5 訊息摘要演算法 sha secure hash algorithm,安全雜湊演算法 借助h...

資料結構與演算法 雜湊表

對映在數學上相當於乙個函式f x a b。雜湊表的核心是乙個雜湊函式 hash function 這個函式規定了集合a中的元素如何對應到集合b中的元素。根據設定的雜湊函式 h key 和處理衝突的方法 將一組關鍵字映像到乙個有限的連續的位址集 區間 上,並以關鍵字在位址集中的 像 作為相應記錄在表中...

資料結構與演算法 雜湊表

雜湊表也叫雜湊表,hash表是一種根據關鍵字值 key value 而直接進行訪問的資料結構。是把記錄的儲存位置和記錄的關鍵字之間建立對應關係的一種儲存結構。雜湊表又叫 雜湊表,速度很快,最常用的一種儲存機構是順序表 鍊錶的結構 主結構是順序表,每個順序表中的元素又對應一張鍊錶。雜湊表的常用資料結構...