由雜湊表所聯想到的相關問題

2021-08-03 16:31:34 字數 1587 閱讀 8731

c++的stl中使用了雜湊的容器類有:map、multimap、unordered_map、unordered_

multimap、set、

multi_set、unordered

_set、unordered_

multiset。

map和multimap 將(key/value) 一組當做元素,它們可以根據 key 的排序準則自動將元素排序,內部是由乙個紅黑樹實現。multimap允許重複元素,map不允許重複。

_map和unordered_

multimap同上,只是內部是由乙個雜湊表實現。

set和multi_set則不同於以上兩種,不是乙個字典,而是乙個普通集合,但是其內部也是由乙個紅黑樹實現。

unordered

_set

和unordered_

multiset內部

是由乙個雜湊表實現。

下面首先講一下字典,字典是由一些形如(k,v)的數對所組成的集合,其中k是關鍵字,v是與關鍵字k對應的值(反過來說也可以)。任意兩個數對,其關鍵字都不等。但是其對應的值可以相等,也就是說存在多對一,一對一,但是不存在一對多,類似於函式的對映。其中多對一的情況就是多重字典,典型的例子有**薄。

字典有兩種表示方法,分別是跳表和雜湊。主要介紹雜湊,它用乙個雜湊函式(雜湊函式)把字典的數對對映到乙個雜湊表(雜湊表)的具體位置。

儘管理想的雜湊方法用在許多字典的應用中,但是還是有許多應用,因為關鍵字變化範圍太大,使雜湊表沒有意義或不切實際。所以考慮實際情況就有了以下概念:

1.桶和起始桶

當關鍵字的範圍太大,不能用理想方法表示時,可以採用並不理想的雜湊表和雜湊函式:雜湊表位置的數量比關鍵字的個數少,雜湊函式把若干個不同的關鍵字對映到雜湊表的同乙個位置。雜湊表的每乙個位置叫乙個桶,對關鍵字為k的數對,f(k)是起始桶;桶的數量等於雜湊表的長度或大小。因為雜湊函式可以把若干個關鍵字對映到同乙個桶,所以桶要能夠容納多個數對。

2.除法雜湊函式

在多種雜湊函式中,最常用的是除法雜湊函式,它的形式如下:

f(k)=k%d

其中k是關鍵字,d是雜湊表的長度(即桶的數量),%為求模操作符。

3.衝突和溢位

假設每個桶只能存放乙個數對,當兩個不同的關鍵字所對應的起始桶相同時,就是「衝突『』發生了。因為乙個桶可以儲存多個數對,因此反生碰撞也沒什麼了不起。只要起始桶足夠大、所有對應同乙個起始桶的數對都可儲存在一起。如果儲存桶沒有空間儲存乙個新數對,就是「溢位」發生了。單就衝突而言並不可怕,可怕的是它會帶來溢位,除非乙個桶可以容納無限多個數對,否則插入時的溢位不是那麼容易解決的問題了。當對映到雜湊表中任何乙個桶裡的關鍵字數量大致相等時,衝突和溢位的平均數最少。均勻雜湊函式就是這樣的函式。

4.解決衝突的兩種方法

(1)線性探查法:最簡單的方法就是找打下乙個最近的可用的桶,如果後面的桶都不可用,那就把雜湊表視為環形表,從頭找起。

(2)隨機探查法:在隨機探查中,當溢位發生時,以隨機的方式為新數對尋找插入位置(在實際應用中,用隨機數生成器產生乙個桶的搜尋序列,然後用這個序列去確定插入位置)。

由return聯想到的

大多數函式都包含一條return 語句,return 語句導致函式停止執行。使函式停止執行的還有break,throw,他們叫強制跳轉語句。return語句使函式停止執行,如果 塊裡為 return 或者 沒有return 那麼函式會返回乙個undefined值給呼叫者。另外,在控制台為什麼會返回u...

由修電腦聯想到的

當初學計算機應用這個專業肯定沒想到日後最大的需求是為我周圍的電腦菜菜們的排憂解難,在我看來這個專業應該屬於益工型的專業,假如你說憑他找工作,當個職業幹,基本上想賺錢很難,而且十分瑣碎,頂著個所謂的技術工程師的帽子其實和看門大爺,服務員和水電工區的工作沒有什麼區別。在此我只涉及我接觸過的網管類以及技術...

由遍歷集合所聯想到的一些問題

1 以下一段再平常不過的遍歷 但是與我一樣,好多新手都會在這個地方出問題,例如 for int i 0 i 執行 之前我在剛工作的時候在這個地方犯錯,我們在自測的時候都沒問題。初始化資料之後給客戶演示時,突然蹦出個空指標異常nullpointerexception。於是我們通過debug發現,這個l...