雜湊表之開雜湊

2021-08-20 11:43:35 字數 2986 閱讀 5402

了解雜湊基本看概念請看這裡:搜尋結構之雜湊

開雜湊完整**:開雜湊

開雜湊每乙個位址的底層實現像乙個個的桶,所以又叫雜湊桶,同乙個桶中存放雜湊衝突的元素。

通常,每個桶對應的鍊錶結點都很少,將n個關鍵碼通過某乙個雜湊函式,存放到雜湊表中的m個桶中,那麼每乙個桶中煉表的平均長度為n/m,以搜尋平均長度為n/m的鍊錶代替搜尋長度為n的順序表,搜尋效率快的多。

應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。事實上:

由於開位址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多,

所以使用鏈位址法反而比開位址法節省儲存空間。

標頭檔案

#pragma once

#include

#include

#include

#include

#define size_t unsigned long

typedef char* datatype;

typedef size_t(*pdt)(datatype data);

typedef struct node

node,*pnode;

//雜湊表

typedef struct hashbucket

hashbucket;

//雜湊桶初始化

void hashinit(hashbucket* ht, int capacity, pdt _setdata);

//資料唯一的插入與刪除

void hashbuctetinsertunique(hashbucket* ht, datatype data);

void hashbucketdeleteunique(hashbucket* ht, datatype data);

//資料不唯一

void hashbuctetinsert(hashbucket* ht, datatype data);

void hashbucketdelete(hashbucket* ht, datatype data);

//查詢

pnode hashbucketfind(hashbucket* ht, datatype data);

//元素個數

int hashbucketsize(hashbucket* ht);

//銷毀

void destroyhashbuctet(hashbucket* ht);

//////

//////

//////

//////

//////

//////

//////

////

//雜湊函式

int hashfunc(hashbucket* ht, int data);

//建立新結點

pnode buynode(datatype data);

//列印

void hashbucketprint(hashbucket* ht);

size_t strtoint(const

char* str);

size_t datatoint(int data);

功能實現部分

#include"hashbucket.h"

//雜湊桶初始化

void

hashinit(hashbucket* ht, int capacity, pdt _setdata)

}//資料唯一的插入

void

hashbuctetinsertunique(hashbucket* ht, datatype

data)

pcur = buynode(data);

pcur->_pnext = ht->_table[hashaddr];

ht->_table[hashaddr] = pcur;

++ht->_size;

}//資料唯一的刪除

void

hashbucketdeleteunique(hashbucket* ht, datatype

data)

while (pcur)

else

}//判斷pcur是否找到了data,退出可能是找到了,或pcur為空

if (pcur)

}//資料不唯一

//資料相同插入

void

hashbuctetinsert(hashbucket* ht, datatype

data)

//刪除所有值為data的元素

void

hashbucketdelete(hashbucket* ht, datatype

data)

//後續不為空

while (pcur)

else

}}//查詢

pnode

hashbucketfind(hashbucket* ht, datatype

data)

return pcur;

}//元素個數

inthashbucketsize(hashbucket* ht)

//銷毀

void

destroyhashbuctet(hashbucket* ht)

}free(ht->_table);

ht->_size = 0;

ht->_capacity = 0;}//

//雜湊函式

inthashfunc(hashbucket* ht, int data)

//建立新結點

pnode

buynode(datatype

data)

//列印

void

hashbucketprint(hashbucket* ht)

else

pcur = pcur->_pnext;

}printf("\n");

}}

雜湊表(開雜湊)

hash table2.h pragma once include define hashmaxsize 1000 typedef int keytype typedef int valtype typedef size t hashfunc keytype key typedef struct h...

雜湊表 開雜湊

開雜湊很簡單。asl的計算忘了,找了兩道題都沒算對,這才是我不寫的真正原因 裡是裝13用的 include using namespace std 雜湊表 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關 鍵碼值對映到表中乙...

雜湊表 開雜湊

開雜湊 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。負載因子a不超過0.5 如果超出必須考慮增容 struct hashbucknode 結點 hashbucknode,pha...