unordered系列關聯式容器 底層結構

2021-09-28 22:56:54 字數 4404 閱讀 7762

unordered_map

1. unordered_map

是儲存鍵值對的關聯式容器,其允許通過

keys

快速的索引到與其對應的 value。

2. 在unordered_map

中,鍵值通常用於惟一地標識元素,而對映值是乙個物件,其內容與此鍵關聯。鍵 和對映值的型別可能不同。

3. 在內部,unordered_map

沒有對按照任何特定的順序排序

, 為了能在常數範圍內找到

key所 對應的value

,unordered_map

將相同雜湊值的鍵值對放在相同的桶中。

4. unordered_map

容器通過

key訪問單個元素要比

map快,但它通常在遍歷元素子集的範圍迭代方面效率 較低。

5. unordered_maps

實現了直接訪問操作符

(operator)

,它允許使用

key作為引數直接訪問

value。

6. 它的迭代器至少是前向迭代器。

unordered_set

1.unordered_set是不按特定順序儲存唯一元素的容器,並允許根據其值快速檢索單個元素。

2.在unordered_set中,元素的值同時是它的key,可以唯一地標識它。鍵是不可變的,因此,不能在容器中一次修改unordered_set中的元素-儘管可以將它們插入和刪除。

3.在內部,unordered_set中的元素未按任何特定順序排序,而是根據其雜湊值組織到儲存桶中,以允許直接通過其值快速訪問各個元素(平均平均時間複雜度恆定)。

4.儘管unordered_set容器通過其鍵訪問單個元素的速度要比set容器快,但通常通過它們的子集進行範圍迭代的效率較低。 容器中的迭代器至少是前向迭代器。

底層結構

unordered

系列的關聯式容器之所以效率比較高,是因為其底層使用了雜湊結構。

雜湊概念

順序結構以及平衡樹

中,元素關鍵碼與其儲存位置之間沒有對應的關係,因此在

查詢乙個元素時,必須要經

過關鍵碼的多次比較

。順序查詢時間複雜度為

o(n)

,平衡樹中為樹的高度,即

o( )

,搜尋的效率取決 於搜尋過程中元素的比較次數。

理想的搜尋方法:可以

不經過任何比較,一次直接從表中得到要搜尋的元素

。 如果構造一種儲存結構,通過

某種函式

(hashfunc)

使元素的儲存位置與它的關鍵碼之間能夠建立一一對映的關係,那麼在查詢時通過該函

數可以很快找到該元素

當向該結構中:

插入元素

根據待插入元素的關鍵碼,以此函式計算出該元素的儲存位置並按此位置進行存放

搜尋元素

對元素的關鍵碼進行同樣的計算,把求得的函式值當做元素的儲存位置,在結構中按此位置取元素比 較,若關鍵碼相等,則搜尋成功

該方式即為雜湊(雜湊

)方法,

雜湊方法中使用的轉換函式稱為雜湊(雜湊

)函式,構造出來的結構稱為雜湊表

(hash table)(

或者稱雜湊表

)例如:資料集合

雜湊函式設定為:

hash(key) = key % capacity

; capacity為儲存元素底層空間總的大小

用該方法進行搜尋不必進行多次關鍵碼的比較,因此搜尋的速度比較快

雜湊衝突

對於兩個資料元素的關鍵字 和 (i != j)

,有!=

,但有:

hash( ) == hash( )

,即:不同關鍵字通過

相同雜湊哈數計算出相同的雜湊位址,該種現象稱為雜湊衝突或雜湊碰撞

。 把具有不同關鍵碼而具有相同雜湊位址的資料元素稱為

「同義詞

」。雜湊函式

引起雜湊衝突的乙個原因可能是:

雜湊函式設計不夠合理

。 雜湊函式設計原則

: 雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m

個位址時,其值域必須在

0 到m-1

之間雜湊函式計算出來的位址能均勻分布在整個空間中

常見雜湊函式

1.直接定製法

hashkey= a*key + b優點:簡單、均勻 缺點:需要事先知道關鍵字的分布情況 使用場景:適合查詢比較小且連續的情況

2.除留餘數法

設雜湊表中允許的位址數為m,取乙個不大於m,但最接近或者等於m的質數p作為除數,按照雜湊函

數:hash(key) = key% p(p<=m),將關鍵碼轉換成雜湊位址

雜湊衝突解決

解決雜湊衝突

兩種常見的方法是:

閉雜湊和

開雜湊閉雜湊

閉雜湊:也叫開放定址法,當發生雜湊衝突時,如果雜湊表未被裝滿,說明在雜湊表中必然還有空位置,那麼可以把key存放到衝突位置中的下乙個空位置中去。

插入

假設如上圖,我們要插入乙個元素為44先通過雜湊函式計算雜湊位址,

hashaddr為4

,因此44

理論 上應該插在該位置,但是該位置已經放了值為4

的元素,即發生雜湊衝突。

通過雜湊函式獲取待插入元素在雜湊表中的位置如果該位置中沒有元素則直接插入新元素,如果該位置中有元素發生雜湊衝突,使用線性探測找到下乙個空位置,插入新元素

刪除

採用閉雜湊處理雜湊衝突時,不能隨便物理刪除雜湊表中已有的元素,若直接刪除元素會影響其他

元素的搜尋

。比如刪除元素

4,如果直接刪除掉,

44查詢起來可能會受影響。因此

線性探測採用標

記的偽刪除法來刪除乙個元素

開雜湊

開雜湊概念

開雜湊法又叫鏈位址法(開鏈法),首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中

Cpp 關聯式容器 unordered系列

3.unordered set 1.unordered map介紹 2.unordered map的介面說明 2.1 unoedered map的構造 函式宣告 功能介紹 unordered map 構造不同格式的unordered map物件 2.2 unordered map的容量 函式宣告 功...

undordered系列關聯式容器

unordered系列容器是c 11中,新增加的4個關聯式容器,這四個關聯式容器與紅黑樹結構的關聯式容器使用方式基本相同,只是在底層實現的結構不同。unordered map 1.unordered map是儲存鍵值對的關聯式容器,其允許通過key快速的索引到對應的value。2.在unordere...

C unordered系列的關聯式容器

1 unordered系列的關聯式容器 1 unordered map是儲存鍵值對的關聯式容器,其允許通過key快速的索引到與其對應的value。2 在unordered map中,鍵值通常用於唯一地標識元素,而對映值是乙個物件,其內容與此鍵關聯。鍵和對映值的型別可能不同。3 在內部,unorder...