雜湊之閉雜湊 線性演算法和二次探查法

2021-08-16 01:38:25 字數 3894 閱讀 1094

標頭檔案

#pragma once

#ifndef hash_h_

#define hash_h_

#define size_t unsigned long

typedef enum state;

typedef int value;

//typedef char* value;

typedef struct _datatype

datatype;

typedef int(*phf)(datatype* data);

typedef struct _elem

elem;

typedef struct hashtable

*phash,hash;

int hashfun(size_t key, phash hash);//線性探測

int hashfun2(size_t key, phash hash,int i);//二次探測

//線性探測

void inithash(phash hash, int capacity, phf);

int inserthash(phash hash, value value);

int findhash(phash hash, value value);

int removehash(phash hash, value value);

void destoryhash(phash hash);

size_t size(hash hash);

size_t capacity(hash hash);

int emptyhash(hash hash);

int isfull(hash hash);

void dynamiccapacity(phash hash);

void swap(phash pleft, phash pright);

//二次探測

int inserthash_2(phash hash, value value);

int findhash_2(phash hash, value value);

int removehash_2(phash hash, value value);

#endif //!hash_h_

#pragma once

#include"hash.h"

#ifndef _common_h_

#define _common_h_

#define _primesize 31

#define size_t unsigned long

static

const

unsigned

long _primelist[_primesize] =

;unsigned

long getprimenumber(int capacity);

static size_t bkdrhash(const

char * str);

void inttoint(datatype* data);

void chartoint(datatype* data);

#endif // !_common_h_

原始檔

#include"common.h"

size_t getprimenumber(int capacity)//得到最接近的質數

return _primelist[_primesize];

}static size_t bkdrhash(const

char * str)//字串雜湊演算法

return (hash & 0x7fffffff);

}void inttoint(datatype* data)//整形資料轉整形

void chartoint(datatype* data)//字串資料轉整形

#include

#include

#include

#include

#include"hash.h"

#include"common.h"

//初始化

void inithash(phash hash, int capacity, phf _psetkey)

datatype buynewdata(value value, phash hash)

//插入

int inserthash(phash hash, value value)

int addr = hashfun(new.key, hash);

while (em != hash->_tf[addr]._state && flag < hash->_capacity )

if (hash->_tf[addr]._state == em)

return0;}

//線性探測雜湊函式

int hashfun(size_t key, phash hash)

//搜尋

int findhash(phash hash, value value)

addr++;

flag++;

}return0;}

//刪除元素

int removehash(phash hash, value value)

addr++;

flag++;

}return0;}

//銷毀雜湊表

void destoryhash(phash hash)

//獲取資料總量

size_t size(hash hash)

//獲取容量

size_t capacity(hash hash)

//雜湊表是否為空

int emptyhash(hash hash)

//是否要擴容

int isfull(hash hash)

//擴容

void dynamiccapacity(phash hash)

swap(&hashnew, hash);

free(hashnew._tf);

}void swap(phash pleft, phash pright)

--測試

void test_int

()void test_char

()void test_1

()//二次探測//

int inserthash_2(phash hash, value value)

int addr = hashfun_2(new.key, hash,flag);

while (em != hash->_tf[addr]._state)

if (hash->_tf[addr]._state == em)

return0;}

int findhash_2(phash hash, value value)

flag++;

addr = hashfun_2(new.key, hash, flag);

}return0;}

int removehash_2(phash hash, value value)

flag++;

addr = hashfun_2(new.key, hash, flag);

}return0;}

int hashfun_2(size_t key, phash hash, int i)//二次探測

void test_2

()void main

()

雜湊之閉雜湊(線性探測 二次探測)

hashtable.h include include include include common.h 雜湊表位置的狀態 typedef enum state state typedef int datatype typedef char datatype 轉換int函式指標 typedef si...

雜湊表之線性探測和二次探測

雜湊表又稱雜湊表。雜湊表儲存的基本思想是 以資料表中的每個記錄的關鍵字 k為自變數,通過一種函式h k 計算出函式值。把這個值解釋為一塊連續儲存空間 即陣列空間 的單元位址 即下標 將該記錄儲存到這個單元中。在此稱該函式h為哈函式或雜湊函式。按這種方法建立的表稱為雜湊表或雜湊表。處理衝突的方法 開放...

雜湊的故事 之 二次探測和hashtable

雜湊真的給我留下了巨大的陰影 二次探測 若當前key與原來key產生相同的雜湊位址,則當前key存在該位址後偏移量為 1,2,3 的二次方位址處 key1 hash key 0 key2 hash key 1 2 key3 hash key 2 2 二次探測法中會每乙個空間採用乙個狀態標識來解決直接...