哈希表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 // HashTable
InitializeTable(int TableSize) {
HashTable H;
int i;
// 為散列表分配空間
// 有些编譯器不支持為struct HashTable 分配空間,聲稱這是一個不完全的結構,// 可使用一个指向HashTable的指針為之分配空間。
// 如:sizeof(Probe),Probe作为HashTable在typedef定義的指針。
H = malloc(sizeof(struct HashTable));
// 散列表大小为一个質数
H->TableSize = Prime;
// 分配表所有地址的空間
H->Cells = malloc(sizeof(Cell) * H->TableSize);
// 地址初始為空
for (i =0; i < H->TableSize; i++)
H->Cells[i].info = Empty;
return H;
}
查找空单元并插入:
// Position
Find(ElementType Key, HashTable H) {
Position Current;
int CollisionNum;
// 冲突次数初始为0
// 通過表的大小對關鍵字進行處理
CollisionNum =0;
Current = Hash( Key, H->TableSize );
// 不為空時進行查詢
while (H->Cells[Current].info != Empty &&
H->Cells[Current].Element != Key) {
Current =++CollosionNum *++CollisionNum;
// 向下查找超過表範圍時回到表的開頭
if (Current >= H->TableSize)
Current -= H->TableSize;
}
return Current;
}
分離連接法
散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。
查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:
1. 散列函数是否均匀;
2. 处理冲突的方法;
3. 散列表的载荷因子(英語:load factor)。
查找效率
载荷因子
取自“https:///w/index.php?title=哈希表&oldid=58006531”
本页面最后修订于2020年2月5日 (星期三) 16:03。
本站的全部文字在知识共享署名-相同方式共享 3.0协议之条款下提供,附加条款亦可能应用。(请参阅使用条款)Wikipedia®和维基百科标志是维基媒体基金会的注册商标;维基™是维基媒体基金会的商标。
维基媒体基金会是按美国国內稅收法501(c)(3)登记的非营利慈善机构。