因爲散列表的內容過於多,所以我打算分爲三篇文章來講解散列表。
本篇的重點是,散列表的概述
1、什麼是散列表?
散列表,又稱爲哈希表(Hash table),採用散列技術將記錄存儲在一塊連續的存儲空間中。
在散列表中,我們通過某個函數f,使得存儲位置 = f(關鍵字),這樣我們可以不需要比較關鍵字就可獲得需要的記錄的存儲位置。
散列技術的記錄之間不存在什麼邏輯關係,它只與關鍵字有關聯。因此,散列主要是面向查找的存儲結構。
2、散列表是如何實現查找的?
上面提到的某個函數,被稱爲散列函數,它負責記錄存儲位置和它的關鍵字之間的對應關係f 。
散列函數,又稱爲哈希(Hash)函數
- 記錄的存儲位置和它的關鍵字之間的對應關係f 被稱作散列函數
- 散列技術是一種新的存儲技術
- 散列技術是在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係f
- 使得每個關鍵字key 對應一個存儲位置f(key)
查找時:
- 根據這個確定的對應關係找到給定值key 的映射f(key)
- 若找到集合中存在這個記錄,則必定在f(key)的位置上。
key 爲關鍵字,f 爲散列函數,f(key)爲存儲位置
3、散列表查找步驟
在存儲時,通過散列函數計算紀錄的散列地址,並按此散列地址存儲該記錄。
假設一個場景,你有一個快遞要寄出去,快遞小哥幫你貼了快遞單號,然後他讓你放到驛站裏面的桌子上。
但是你一進驛站裏面,發現有很多張桌子,你並不知道他說的是哪一張。
此時有一個人上來問你是不是要寄快遞的,並且問你有沒有貼快遞單號,你將單號給他之後,他幫你放到了一個指定的桌子上。
這個就是散列表的存儲過程。快遞單號就是關鍵字,驛站裏的那個人就是散列函數,而快遞放到的桌子就是最終得出的指定地址。
當查找記錄時,我們通過同樣的散列函數計算記錄的散列地址,按此散列地址訪問該記錄。
還是那個場景,但是此時的你不是寄快遞,而是來拿好朋友給你寄來的麻辣鴨翅。
你直接進入了那個放快遞的驛站裏,將快遞單號給了那個人,那個人通過你的快遞單號來找到你的快遞,然後拿給了你。
查找的步驟和存儲的步驟是一樣的,不過我們使用的用途不同而已。我們都是將關鍵字給予散列函數,通過散列函數計算得出的存儲位置來存儲 / 查找。
再簡單來說,散列函數起到的作用就是,通過計算得出將東西存哪去,從哪拿?
4、好的散列函數的兩個原則:
1、計算簡單
散列函數的計算時間不應該超過其他查找技術與關鍵字比較的時間。
2、散列地址分佈均勻
解決衝突最好的辦法就是儘量讓散列地址均勻地分佈在存儲空間中。
保證存儲空間的有效利用,並減少爲處理衝突而耗費的時間。
5、衝突是什麼?
在上面提出的原則裏面,我們看到了一個新詞“衝突”,那麼衝突是什麼?
衝突就是,兩個不同的關鍵字,但是通過散列函數得出來的地址是一樣的。
key1 ≠ key2,但是f(key1)= f(key2)
同義詞
此時的key1 和key2就被稱爲這個散列函數的同義詞
那可不行啊,一件單人間怎麼可以住兩個人呢?
別擔心,這個問題自然已經被神通廣大的大佬們解決了。
待我下篇文章慢慢道來~
6、總結
最後我們總結一下散列表的優缺點:
散列技術最適合的求解問題是查找與給定值相等的記錄:
- 優點:簡化了比較過程,提高了查找效率
- 缺點:不具備很多常規數據結構的能力
- 單個關鍵字不能記錄多條記錄
- 不適合範圍查找
以上就是本篇文章的所有內容了,如果覺得有幫助到你的話,
麻煩動動小手,點贊收藏轉發!!!
你的每一次點贊都是我更新的最大動力~
我們下期再見!