1. 程式人生 > >鏈式雜湊表的實現

鏈式雜湊表的實現

雜湊演算法一般用於快速查詢和加密演算法

chtbl.h

#ifndef CHTBL_H
#define CHTBL_H

#include <stdlib.h>

#include "list.h"

/* Define a structure for chained hash tables. */

typedef struct CHTbl_ {

int                buckets;

int                (*h)(const void *key);
int                (*match)(const void *key1, const
void *key2); void (*destroy)(void *data); int size; List *table; } CHTbl; /* Public Interface. */ int chtbl_init(CHTbl *htbl, int buckets, int (*h)(const void *key), int (*match)(const void *key1, const void *key2), void (*destroy)(void *data)); void
chtbl_destroy(CHTbl *htbl); int chtbl_insert(CHTbl *htbl, const void *data); int chtbl_remove(CHTbl *htbl, void **data); int chtbl_lookup(const CHTbl *htbl, void **data); #define chtbl_size(htbl) ((htbl)->size) #endif

chtbl.m

#include <stdlib.h>
#include <string.h>

#include "list.h"
#include "chtbl.h" /* chtbl_init */ int chtbl_init(CHTbl *htbl, int buckets, int (*h)(const void *key), int (*match)(const void *key1, const void *key2), void (*destroy)(void*data)) { int i; /*Allocate space for the hash table.*/ if ((htbl->table = (List *)malloc(buckets * sizeof(List))) == NULL) return -1; /*Initialize the buckets.*/ htbl->buckets = buckets; for (i = 0; i < htbl->buckets; i++) list_init(&htbl->table[i], destroy); /*Encapsulate the functions.*/ htbl->h = h; htbl->match = match; htbl->destroy = destroy; /*Initialize the number of elements in the table.*/ htbl->size = 0; return 0; } /* chtbl_destroy */ void chtbl_destroy(CHTbl *htbl) { int i; /*Destroy each bucket.*/ for (i = 0; i < htbl->buckets; i++) { list_destroy(&htbl->table[i]); } /*Free the storage allocated for the hash table.*/ free(htbl->table); /*No operations are allowed now, but clear the structure as a precaution.*/ memset(htbl, 0, sizeof(CHTbl)); return; } /* chtbl_insert */ int chtbl_insert(CHTbl *htbl, const void *data) { void *temp; int bucket, retval; /* Do nothing if the data is already in the table. */ temp = (void *)data; if (chtbl_lookup(htbl, &temp) == 0) return 1; /* Hash the key. */ bucket = htbl->h(data) % htbl->buckets; /*Insert the data into the bucket.*/ if ((retval = list_ins_next(&htbl->table[bucket], NULL, data)) == 0) htbl->size++; return retval; } /* chtbl_remove */ int chtbl_remove(CHTbl *htbl, void **data) { ListElmt *element, *prev; int bucket; /*Hash the key.*/ bucket = htbl->h(*data) % htbl->buckets; /*Search for the data in the bucket.*/ prev = NULL; for (element = list_head(&htbl->table[bucket]); element != NULL; element = list_next(element)) { if (htbl->match(*data, list_data(element))) { /*Remove the data from the bucket.*/ if (list_rem_next(&htbl->table[bucket], prev, data) == 0) { htbl->size--; return 0; } else { return -1; } } prev = element; } /*Return that the data was not found.*/ return -1; } /* chtbl_lookup */ int chtbl_lookup(const CHTbl *htbl, void **data) { ListElmt *element; int bucket; /*Hash the key.*/ bucket = htbl->h(*data) % htbl->buckets; /*Search for the data in the bucket.*/ for (element = list_head(&htbl->table[bucket]); element != NULL; element = list_next(element)) { if (htbl->match(*data, list_data(element))) { /*Pass back the data from the table.*/ *data = list_data(element); return 0; } } /*Return that the data was not found.*/ return -1; }

相關推薦

實現

雜湊演算法一般用於快速查詢和加密演算法 chtbl.h #ifndef CHTBL_H #define CHTBL_H #include <stdlib.h> #include "list.h" /* Define a structur

線性資料結構解讀(六)結構-LinkedHashMap

    上一篇文章我和大家一起解讀了HashMap的原理原始碼,各位童鞋可以點選連結檢視線性表資料結構解讀(五)雜湊表結構-HashMap     這次我們一起來看一下LinkedHashMap,它保

基於實現字典和集合

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

C#實現新增學生查詢全部學生資訊

using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tas

OPEN實現單詞本

一、演算法思想 雜湊表是根據關鍵碼值而直接進行訪問的資料結構,也就是說它可以通過對關鍵字進行某種函式對映直接找到其對應的表中的位置,這個對映函式叫做雜湊函式。 由於雜湊表中不需要比較即可找到所需元素,能夠極大節省查詢所需時間,但雜湊表中在儲存的時候可能會出現不同關鍵字通過函

簡單實現

雜湊表定義:     雜湊表又稱散列表,是根據關鍵碼值(key value)而直接訪問的資料結構。它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。   雜湊表既有陣列的特點(定址容易),又有連結串列的特點

(HashTable)的開放定址法和地址法的實現

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

的原理及實現

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

-- C語言實現

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

地址發

鏈地址發     將所有的關鍵字為同義詞的記錄儲存在同一線性連結串列中。     比如,我們對於關鍵字集合{12,67,56,16,25,37, 22,29,15,47,48,34},我們用前面同樣的12為除數,進行除留餘數法: 當雜湊表中的

第十五週專案一及其運算的實現

/*Copyright (c) 2015, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:H1.cpp * 作者:辛志勐 * 完成日期:2015年12月10日 * 版本號:VC6.0 * 問題描述:雜湊表及其運算的實現 * 輸入描述:無 * 程式輸出:雜湊表

-線性探測法/地址法

1.線性探測法 eg.假設散列表的長度是13,三列函式為H(K) = k % 13,給定的關鍵字序列為{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。分別畫出用線性探測法和拉鍊法解決衝突時構造的雜湊表,並求出在等概率情況下,這兩種方法的查詢成功和

自己動手用c++實現

雜湊表 查詢效率約等於1 實現思想介紹 一般的hash思想 未採用模板,簡單的實現 key是int,value是string 把輸入的key值經過hash函式計算,算出它要放入的桶的編號 採用一個指標陣列記錄各個桶 每個桶裡都有50個key_value物件

-- C語言實現

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

三部曲:二:第一部分:C語言實現 靜態

在這個靜態雜湊表中 我們用一個容量為10 的靜態陣列作為雜湊表的底層構造 但是陣列的每一個儲存空間中又分為兩個部分                                 資料區:data                                    

的構造方法、衝突處理方法及拉鍊法的簡單程式碼實現

  由於雜湊表的查詢高效性,在平時的演算法中用的也是比較多。例如:字串、單詞個數的統計,只出現一次字元或者數字的統計,兩個集合相同元素的查詢等等,還有插入刪除的高效(鏈地址法)都可以用雜湊表來解決。所以這裡對其做一個小小的總結。缺點可能是需要佔用額外的記憶體空間。 一、雜湊

[CareerCup] 8.10 Implement a Hash Table 實現一個

8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 這道題讓我們實現一個簡單的雜湊表,我們採用了最簡單的那種取餘映射的方式來實現,我們使用Cell來儲存一對對的

自己動手實現java資料結構(五)

1.雜湊表介紹   前面我們已經介紹了許多型別的資料結構。在想要查詢容器內特定元素時,有序向量使得我們能使用二分查詢法進行精確的查詢((O(logN)對數複雜度,很高效)。  可人類總是不知滿足,依然在尋求一種更高效的特定元素查詢的資料結構,雜湊表/散列表(hash table)就應運而生啦。雜湊表在特定元

的簡單實現例子

Hash // Hash.cpp : Defines the entry point for the console application. // #include "stdafx.h" #inclu

java 陣列實現的構建,查詢,插入,刪除

以下程式碼以陣列儲存方式實現了雜湊表的建立,查詢,插入,刪除等操作,雜湊函式採用除留餘數法,使用開放定址法中的線性探查法處理衝突 public class HashSearch { /*使用陣列實現hashtable的建立,查詢,插入,刪除*/