資料結構之雜湊表

2021-10-14 13:57:53 字數 2694 閱讀 3491

雜湊表(hashtable),也叫雜湊表,是根據關鍵碼值而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,從而加快查詢速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表

上面的基本介紹完了,是不是有些蒙(大佬走開)?我來」通俗「說一下我的理解,不考慮其他東西,雜湊表其實就是乙個陣列,當我們要存放資料時,我們往哪個地方放呢?是按索引順序存放嗎?不是的,此時存放資料的位置的索引就需要計算,具體怎麼計算呢?這時就需要乙個計算方法了即雜湊函式

不曉得你讀到這裡有沒有疑問?為啥要這樣設計呢?

之前我也有這樣的疑惑的,但是我現在貌似想通了。我們都曉得陣列查詢是非常快的,當我們知道了索引後,時間複雜度直接變為o(1)。重點來了!!!我們怎麼曉得某個元素的索引呢?舉個栗子,有乙個存放了全班同學名字的陣列array,當我們想在陣列裡查詢小歡子時,我們如何獲取小歡子的索引呢?此時雜湊函式的作用就來了。當我們在存小歡子時就用雜湊函式計算出小歡子要存的索引並放入,下次查詢時用同樣的雜湊函式計算一下就可得出小歡子的索引!!!通過雜湊函式(雜湊函式)計算元素索引是雜湊表的精髓啊!!!

正如上所述,雜湊表的的查詢速度是非常快的,時間複雜度為o(1)

那雜湊表有沒有缺點呢?肯定有啊,上面說了,不考慮其他因素,雜湊表其實就是乙個陣列,陣列的明顯短板是啥?難以擴充套件啊,所以雜湊表的缺點就是當雜湊表填滿後,需要進行資料遷移,將其遷到一張更大的雜湊表中,這是乙個費時費力的工作~

那雜湊表還有沒有缺點呢?肯定還有啊,上面還說了,當我們計算某個元素對應陣列的索引時需要用到雜湊函式。但是這個函式不是萬能的,你想啊,當我們的總數量很大的時候,肯定會出現不同的元素有相同的計算結果即不同的元素存入雜湊表的位置是相同的,這種情況大佬們稱之為雜湊衝突,出現了雜湊衝突,就需要解決它,方法有開放定址法、拉鍊法、再雜湊法、建立公共溢位區,正因為有了對應的解決辦法,從而使得當雜湊衝突嚴重時,雜湊表的查詢效率急劇下降(後面會仔細講,兄嘚不要急)

這個名字叫的比較"高大上",實際就是將衝突元素放在其他空閒空間~,其他空閒空間如何查詢呢?嘿嘿,根據如何查詢其他空閒空間,開放定址法又分為線性探測、二次探測、偽隨機探測…,有乙個通用的再雜湊函式形式:

hi=(h(key)+di)% m i=1,2,…,n

上面公式di為1,2,3…m-1,-1,-2,-3…h(key),衝突發生時順序檢視下乙個空間單元,直至找到乙個空閒單元或者遍歷完全表

上面公式di為12,-12,22,-22…k,-k(k上面公式di為乙個隨機數,隨機尋找空間單元

雜湊衝突位置存放的不再是單個元素,而是鍊錶,將雜湊衝突的元素掛載在鍊錶上

有多個雜湊函式,當乙個雜湊函式計算出現雜湊衝突後,用另外乙個雜湊函式,直至衝突不再產生

即將雜湊表分為基本表和溢位錶兩部分,將所有雜湊衝突的元素放入溢位表中

上面介紹了四種解決雜湊衝突的方法,但是,當雜湊衝突嚴重後,無論是哪一種我們都無法通過索引一步找到衝突元素,如拉鍊法,我們得深入雜湊衝突位置處的鍊錶中繼續查詢

雜湊表多種不同的實現方式,下面是拉鍊式雜湊表的實現

採用陣列+鍊錶

首先定義節點以及列表

//表示乙個雇員節點

class

emp}

//建立emplinkedlist,表示鍊錶

class

emplinkedlist

else

//當退出迴圈,說明已經遍歷到最後乙個節點的next位置

emptemp.next=emp;}}

//查詢雇員

public

void

getempbyid

(int id)

//用來遍歷鍊錶

emp emptemp=head;

while

(emptemp!=null)

emptemp=emptemp.next;

} system.out.

println

("不存在該id員工");

}//輸出鍊錶資訊

public

void

list()

while

(emptemp!=null)

}}

然後定義我們雜湊表

class

hashtab

}public

void

add(emp emp)

//遍歷所有的鍊錶

public

void

list()

}public

void

getempbyid

(int id)

//雜湊函式

public

inthashfun

(int id)

}

資料結構之雜湊表(雜湊表)

今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...

資料結構之雜湊表

雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...

資料結構之雜湊表

wikipedia上的解釋 下圖示意了雜湊表 hash table 這種資料結構。雜湊表 如上圖所示,首先分配乙個指標陣列,陣列的每個元素是乙個鍊錶的頭指標,每個鍊錶稱為乙個槽 slot 哪個資料應該放入哪個槽中由雜湊函式決定,在這個例子中我們簡單地選取雜湊函式h x x 11,這樣任意資料x都可以...