1. 程式人生 > >雜湊表簡介

雜湊表簡介

相信學計算機的同學對雜湊表都不陌生,但由於它的重要性,我還是在這裡介紹一下,算是一個複習。

雜湊表是一種在插入,刪除,搜尋上等操作上具有“常數時間平均時間"(當然是指統計表現上)的資料結構,這種表現不需要依賴元素的隨機性。

雜湊表的核心是對映函式,即雜湊函式,常用的雜湊函式稍後介紹(我見過一些相當奇怪的對映函式,不知道創造的人是怎麼想的,可能我數學基礎還是太差了,無法設計出那種很神奇的對映函式,比如redis的底層資料結構hash中就有用到一種古怪的雜湊函式),我們先來解決另一個問題:碰撞問題(不同的元素被對映到相同的位置,比如採用對映函式y = x^2,那麼-1和1的對映結果是相同的,這就很麻煩了。為了解決碰撞問題,我們常用的方法有如下幾種:

1.開放定址法

這種方法也稱再雜湊法,其基本思想是:當關鍵字key的雜湊地址p=H(key)出現衝突時,以p為基礎,產生另一個雜湊地址p1,如果p1仍然衝突,再以p為基礎,產生另一個雜湊地址p2,…,直到找出一個不衝突的雜湊地址pi ,將相應元素存入其中。這種方法有一個通用的再雜湊函式形式:
          Hi=(H(key)+di)% m   i=1,2,…,n
    其中H(key)為雜湊函式,m 為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同。主要有以下三種:
    線性探測再雜湊
        dii=1,2,3,…,m-1
        這種方法的特點是:衝突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。
    二次探測再雜湊
        di=12,-12,22,-22,…,k2,-k2    ( k<=m/2 )
        這種方法的特點是:衝突發生時,在表的左右進行跳躍式探測,比較靈活。
    偽隨機探測再雜湊
        di=偽隨機數序列。
        具體實現時,應建立一個偽隨機數發生器,(如i=(i+p) % m),並給定一個隨機數做起點

2.開鏈法:這種方法是在每一個表格中分配一個list,然後我們在那個list上執行插入,查詢,刪除,如果list不太長,即同一個位置上的衝突不要發生特別多,速度還是可以接受的。下面是我從網上隨便找的一張形象地描述開鏈法的圖:

 

3.再雜湊法

這種方法是同時構造多個不同的雜湊函式:
    Hi=RH1(key)  i=1,2,…,k
當雜湊地址Hi=RH1(key)發生衝突時,再計算Hi=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

4.建立公共溢位區

這裡對這個方法不做介紹

接下來再來介紹一下Hash表的平均查詢長度

  Hash表的平均查詢長度包括查詢成功時的平均查詢長度和查詢失敗時的平均查詢長度。

  查詢成功時的平均查詢長度=表中每個元素查詢成功時的比較次數之和/表中元素個數;

  下面舉個我從網上借鑑的例子:

  有一組關鍵字{23,12,14,2,3,5},表長為14,Hash函式為key%11,則關鍵字在表中的儲存如下:

  地址     0     1     2     3      4     5    6   7   8    9  10   11   12    13

  關鍵字        23    12   14     2     3    5

 比較次數         1      2    1     3     3     2

  因此查詢成功時的平均查詢長度為(1+2+1+3+3+2)/6=11/6;

  查詢失敗時的平均查詢長度為(1+7+6+5+4+3+2+1+1+1+1+1+1+1)/14=38/14;

  另外再介紹一下負載係數:表中元素個數除以表格大小。

      改天介紹下雜湊表的具體程式碼實現。


相關推薦

簡介(Intorduction to Hash Table)

雜湊表簡介(Intorduction to Hash Table) 作者:Bluemapleman([email protected]) 麻煩不吝star和fork本博文對應的github上的技術部落格專案吧!謝謝大家的支援! 知識無價,寫作辛苦,歡迎轉載,但請註明

簡介

相信學計算機的同學對雜湊表都不陌生,但由於它的重要性,我還是在這裡介紹一下,算是一個複習。雜湊表是一種在插入,刪除,搜尋上等操作上具有“常數時間平均時間"(當然是指統計表現上)的資料結構,這種表現不需要依賴元素的隨機性。雜湊表的核心是對映函式,即雜湊函式,常用的雜湊函式稍後介

字典樹簡介、應用以及與的比較

題目要求: 1、設計並實現N-array trie,包括初始化,查詢,插入,刪除等。 2、應用trie結構實現文字文件的索引化,首先掃描文字文件,然後利用trie結構記錄單詞行號,最後在trie上實現查詢 3、使用者的查詢可以是針對一個單詞,也可以是某些字母開

Hash(/)中衝突處理及命中計算

前言   本片部落格主要講的是雜湊表中簡單的衝突處理的方法,以及命中率計算。原理方面基本沒有講解,基本就講個方法,主要用於知識記錄以及幫助一些刷題玩家瀏覽。   簡而言之,不講技術,只講方法。 引言   寫這篇部落格的契機是在刷pat甲級題遇到了一道寫雜湊的題目,結果英文太次被欺負了。之後靠翻譯讀懂題

查詢演算法 淺談演算法和資料結構: 七 二叉查詢樹 淺談演算法和資料結構: 十一

閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢   查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文

【LeetCode】 hashmap(共88題)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 【1】Two Sum  【3】Longest Substring Without Repeating Characters  【18】4Sum 

記錄一下底層原理

理解HashMap底層,首先應該理解Hash函式 從解決一個問題入手:大量的資料要儲存查詢,構造雜湊表來解決 初步想法 借鑑陣列下標訪問的思路來做,只需知道起始位置和下標值, 不管陣列中有多少個元素,都可以一次訪問到, 將元素和元素位置建立一種一一對應的關係 Hash函式的出現 輸入的元素的範圍

散列表()+衝突的解決方法

轉載http://www.nowamagic.net/academy/detail/3008060 1散列表 1簡單來說就是給一個key,就可以找到對應的key的儲存位置,就像身份證對應一個人一樣 儲存位置 = f(key) 2hashMap的key就是用到散列表 1.1雜湊衝突

九章演算法筆記 8.與堆 Hash & Heap

大綱 cs3k.com 資料結構概述 雜湊表 Hash: a.原理  b.應用 堆 Heap: a.原理    b.應用-優先佇列 Priority Queue  c.替代品-TreeMap   資料結構的兩類問題 cs3k

27-集合--Set及其子類(HashSet+LinkedHashSet+TreeSet)+二叉樹+Comparable+Comparator++HashSet儲存自定義物件+判斷元素唯一的方式

一、Set 1、Set:元素不可以重複,是無序的(存入和取出的順序不一致) 2、Set介面中的方法和Collection中的方法一致 3、Set集合的元素取出方式只有一種:迭代器iterator() Set set = new HashSet(); I

基於實現字典和集合

上一節說到了雜湊表。 我們提到了字典和集合是由雜湊表實現的,具體的實現過程是怎麼樣的呢? 其實很簡單,字典裡面有取值,新增值,正好對應的就是雜湊表中的find和add方法。使用__getitem__和__setitem__代替兩者就可以了。然後對於keys,values取值,只需要遍歷迴圈就行了。 這裡

的原理及實現

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

資料結構基礎之查詢(下):

轉自:http://www.cnblogs.com/edisonchou/p/4706253.html   查詢(下):雜湊表 雜湊(雜湊)技術既是一種儲存方法,也是一種查詢方法。然而它與線性表、樹、圖等結構不同的是,前面幾種結構,資料元素之間都存在某種邏輯關係,可以用連線圖示

構建——優化暴力求解方程

/*  Consider equations having the following form: a*(x1)^2+b*(x2)^2+c*(x3)^2+d*(x4)^2=0 a, b, c, d are integers from the interval [-50,50] and

構造——求前m大的數

Problem Description 給你n個整數,請按從大到小的順序輸出其中前m大的數。 Input 每組測試資料有兩行,第一行有兩個數n,m(0<n,m< 1000000),第二行包含n個各不相同, 且都處於區間[-500000,500

—拉鍊法

public class Link { /** * 有序連結串列連結點 */ public int data; public Link nextLink; public Link(int data){ this.data = data; } publi

二叉樹和的優缺點對比與選擇

二叉樹(binary tree)和雜湊表(hash table)都是很基本的資料結構,但是我們要怎麼從兩者之間進行選擇呢?他們的不同是什麼?優缺點分別是什麼? 回答這個問題不是一兩句話可以說清楚的,原因是在不同的情況下,選擇的依據肯定也不同。首先來回顧一下這兩個資料結構: 雜湊表使用hash functi

-- C語言實現

1 雜湊表原理 這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容(關鍵字),直接計算出存放完整資料的記憶體地址。 試想一下,如果從連結串列中根據關鍵字查詢一個元素,那麼就需要遍歷才能得到這個元素的記憶體地址,如果連結串列長度很大,查詢就需要更多的時間. void*

的儲存自定義物件

雜湊表的儲存自定義物件 /* * HashSet集合的自身特點: * 底層資料結構,雜湊表 * 儲存,取出都比較快 * 執行緒不安全,執行速度快 */ public class HashSetDemo1

的儲存過程

雜湊表的儲存過程      public static void main(String[] args) {         HashSet<String> set =