1. 程式人生 > >資料結構之雜湊表的java實現

資料結構之雜湊表的java實現

雜湊表是一種資料結構,提供快速的插入和查詢功能。雜湊表基於陣列儲存資料,因此能在O(1)時間內定位資料。關鍵字值通過雜湊函式對映為陣列下標。缺點就是陣列建立後容量固定,如果資料較多需要不斷擴充套件其長度。
如何將關鍵字轉換為陣列下標?這個操作是通過雜湊函式完成的。比如,下面就是一個簡單的雜湊函式,
int hash(int key){
return key % array.length;//通過取餘,返回值陣列下標
}
有時候,有些雜湊函式對於不同的鍵值可能會生成相同的雜湊碼值。所以需要解決衝突問題,下面有兩種方法:
1.開放地址法:通過在雜湊表中再找一個空位來解決此問題。
此法又分為三種方法:
1)線性探測,即上面使用的這種方法,雜湊函式將關鍵字範圍壓縮到陣列的範圍,對陣列長度取餘即可,+1,+2,+3…以此類推進行取餘。

2)二次探測的過程是這樣,+1,+2,+4,+9…以此類推。
3)再雜湊,用不同的雜湊函式對關鍵字再做一次雜湊化。

2.鏈地址法:在雜湊表每個單元中設定連結串列。某個資料項的關鍵值仍然對映到雜湊表的單元中,而資料項本身插入這個單元的連結串列中其他同樣對映到這個位置的資料項只需要加入到連結串列中。

package test;
public class HashTable {
    Item[] hashArray;
    int arraySize;//定義陣列長度
    public HashTable(int size){//構造器,初始化
        arraySize = size;
        hashArray = new Item[arraySize];
    }
    //雜湊函式
    public int hash(int key){
        return key % arraySize;
    }
    //插入,這裡假設是陣列未滿,即不能插入大於arraySize的資料數
    public void insert(Item item){
        int key = item.getKey();
        int hashCode = hash(key);
        //若已存在同樣的資料,則向下進一位,直到找到空的位置
        //為了簡單,也可要求不準有重複資料
        while(hashArray[hashCode] != null){
            ++hashCode;
            hashCode %= arraySize;
        }
        hashArray[hashCode] = item;
    }
    //刪除
    public Item delete(int key){
        int hashCode = hash(key);
        while(hashArray[hashCode] != null){
            if(hashArray[hashCode].getKey() == key){
                Item temp = hashArray[hashCode];
                hashArray[hashCode] = null;
                return temp;
            }
            ++hashCode;
            hashCode %= arraySize;
        }
        return null;
    }
    //查詢
    public Item find(int key){
        int hashCode = hash(key);
        while(hashArray[hashCode] != null){
            if(hashArray[hashCode].getKey() == key)
                return hashArray[hashCode];
            ++hashCode;
            hashCode %= arraySize;
        }
        return null;
    }
    //列出全部資料
    public void show(){
        for(int i=0;i<arraySize;i++){
            if(hashArray[i] != null)
                System.out.print(hashArray[i].getKey() + " ");
            else
                System.out.print("* ");
        }
    }
    public static void main(String[] args) {
        HashTable ht = new HashTable(10);
        ht.insert(new Item(1));
        ht.insert(new Item(2));
        ht.insert(new Item(3));
        ht.insert(new Item(4));
        ht.insert(new Item(4));
        ht.show();
        Item i = ht.find(3);
        System.out.println("i = "+i.getKey());
        Item di = ht.delete(3);
        System.out.println("di = "+di.getKey());
        ht.show();
    }
}
//定義雜湊表中存放的資料型別,可以為任意的型別
class Item{
    int idata;
    public Item(int idata){
        this.idata = idata;
    }
    public int getKey(){
        return idata;
    }
}


相關推薦

資料結構java實現

雜湊表是一種資料結構,提供快速的插入和查詢功能。雜湊表基於陣列儲存資料,因此能在O(1)時間內定位資料。關鍵字值通過雜湊函式對映為陣列下標。缺點就是陣列建立後容量固定,如果資料較多需要不斷擴充套件其長度。如何將關鍵字轉換為陣列下標?這個操作是通過雜湊函式完成的。比如,下面就

資料結構與連結串列、陣列

雜湊表 主要描述雜湊表的定義:通過關鍵碼尋找值的資料對映結構,類似於查字典 當存在雜湊衝突時,有兩種常用的方式:開發定址法和鏈地址法 開發定址法通俗的來說就是判斷該地址是否存資料,沒存就放進去,存了就找下一個地址,依次類推,問題是如果空間不足,無法處理衝突。 鏈地

資料結構(HASH)

前言    當我們在程式設計過程中,往往需要對線性表進行查詢操作。在順序表中查詢時,需要從表頭開始,依次遍歷比較a[i]與key的值是否相等,直到相等才返回索引i;在有序表中查詢時,我們經常使用的是二分查詢,通過比較key與a[i]的大小來折半查詢,直到相等時

linux核心分析--核心中使用的資料結構hlist(三)

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

程式設計師,你應該知道的資料結構

雜湊表簡介 雜湊表也叫散列表,雜湊表是一種資料結構,它提供了快速的插入操作和查詢操作,無論雜湊表總中有多少條資料,插入和查詢的時間複雜度都是為O(1),因為雜湊表的查詢速度非常快,所以在很多程式中都有使用雜湊表,例如拼音檢查器。 雜湊表也有自己的缺點,雜湊表是基於陣列的,我們知道陣列建立後擴容成本比較高,所以

資料結構基礎--

雜湊函式 雜湊函式 輸入域無窮大 輸出域有邊界(1<<64) 輸入相同的樣本,一定得到相同的輸出結果 不同的樣本,有可能發生碰撞(結果相同) 在輸入源樣本量足夠大的情況下,結果將在輸出域上均勻分佈。 雜湊函式的離散性,能夠打亂樣本規律。

資料結構鏈式實現--單鏈(C語言)

學習參考: 嚴蔚敏: 《資料結構-C語言版》 基本操作: 單鏈表的建立 新增結點(頭插法) 新增結點(尾插法) 單鏈表的輸出 單鏈表的修改 單鏈表的插入 單鏈表的刪除 單鏈表按

資料結構鏈式實現--單向迴圈連結串列(C語言)

 學習參考: 嚴蔚敏: 《資料結構-C語言版》 單向迴圈連結串列的基本操作 單向迴圈連結串列的建立 單向迴圈連結串列新增結點(頭插法) 單向迴圈連結串列新增結點(尾插法) 單向迴圈連結串列

資料結構(Hash Table)

雜湊表定義 雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過把關鍵碼對映的位置去尋找存放值的地方。 本質是一個數組,陣列中每一個元素稱為一個箱子(bin),箱子中存放的是鍵值對。 雜湊表的儲存過程如下: 根據 key 計算出它的雜湊值 h。 假設箱子的個數

Redis資料結構詳解

簡介 Redis本身是鍵值對資料庫,但是值對應多種資料結構,其中就有雜湊(即鍵值對),值中的鍵值對稱為field和value。 基本命令 命令 命令描述 hset key field

玩轉資料結構(21)--

雜湊表 一、雜湊表基礎 從習題入手【題目連結】 思路:可以不使用樹結構來實現對映,可以直接設定包含 26個 元素的陣列,對陣列中每一位表示某一個字元對應的頻率即可;索引為 0 的位置表示 a ,索引為 1 的位置表示 b ,以此類推。 雜湊表定義:把所關心的鍵通過

資料結構以及衝突的解決方案

前言 基於先前的學習計劃,最近打算深入學習Java的集合類,首先要研究的就是HashMap,在學習HashMap前,我花了幾天時間溫習了一下類中用到的資料結構 (雜湊表,二叉樹),並決定把所學的知識記錄寫成文章,本文講述的就是關於雜湊表的知識。 什麼是雜湊表 在之前的部落格文章裡,我們簡單介紹了資料結構的幾種

資料結構/散列表

本篇博文,旨在介紹雜湊表的基本概念及其用法;介紹了減少雜湊衝突的方法;並用程式碼實現了雜湊表的線性探測和雜湊桶 雜湊表的基本概念 雜湊表是一種儲存結構,它通過key值可以直接訪問該key值在記憶體中

資料結構迴圈單鏈(C++實現)

基本的概念與連結串列相同,不同的是 最後一個鏈結點的指標指向頭部 形成了迴圈連結串列#include <iostream> using namespace std; class Node { public: Node *next; int data;

資料結構桶的基本操作

  順序搜尋和二叉搜尋樹中,元素儲存位置和元素各關鍵碼之間沒有對應的關係,這就導致在查詢一個元素時,必須經過關鍵碼的多次比較。那麼是否有這樣一種資料結構,可以不經過任何比較,直接找到想要搜尋的元素呢?答案是肯定的,那就是通過某種函式(hashFunc)使得元素的儲存位置與它的

資料結構(散列表)

轉自:http://blog.chinaunix.net/uid-26548237-id-3480645.html 一、散列表相關概念     雜湊技術是在記錄的儲存位置和它的關鍵字之間建立一個確定的對應關係f,使得每個關鍵字key對應一個儲存位置f(key)。

淺談演算法和資料結構

在前面的系列文章中,依次介紹了基於無序列表的順序查詢,基於有序陣列的二分查詢,平衡查詢樹,以及紅黑樹,下圖是它們在平均以及最差情況下的時間複雜度: 可以看到在時間複雜度上,紅黑樹在平均情況下插入,查詢以及刪除上都達到了lgN的時間複雜度。 那麼有沒

演算法與資料結構基礎 - (Hash Table)

Hash Table基礎 雜湊表(Hash Table)是常用的資料結構,其運用雜湊函式(hash function)實現對映,內部使用開放定址、拉鍊法等方式解決雜湊衝突,使得讀寫時間複雜度平均為O(1)。   HashMap(std::unordered_map)、HashSet(std::

資料結構 5 /HashMap 、自動擴容、多執行緒會出現的問題

上一節,我們已經介紹了最重要的B樹以及B+樹,使用的情況以及區別的內容。當然,本節課,我們將學習重要的一個數據結構、雜湊表 ## 雜湊表 雜湊也常被稱作是散列表,為什麼要這麼稱呼呢,雜湊、雜湊、其元素分佈較鬆散、經常用來儲存例如`key-value`的資料、這樣有什麼好處呢?我們來細細琢磨一下: -

資料結構hash設計實驗

資料結構實驗,hash表 採用鏈地址法處理hash衝突 程式碼全部自己寫,轉載請留本文連線, 附上程式碼 #include<stdlib.h> #include<stdio.h> #include<string.h> #include<conio.h> #