算法导论-第11章-散列表
2014-10-31 08:13
260 查看
转自:http://blog.csdn.net/mishifangxiangdefeng/article/details/7713307
散列表又称哈希表,它有以下几个术语:
1.关键字:元素的存储部分,数据库的元素通过它进行存储,查找等操作(也称作散列关键字)
2,散列表元:散列数组的某个位置,其后跟着另外一个包含其元素的结构
3,散列函数:对关键字和散列表元提供映射的函数
4,完全散列函数:对关键字和整数提供一一映射的函数
下面是一个简单的散列函数的实例
把关键字k映射到槽h(k)上的过程称为散列。
多个关键字映射到同一个数组下标位置称为碰撞。
好的散列函数应使每个关键字都等可能地散列到m个槽位中
(2)除法散列法:h(k) = k mod m
(3)乘法散列法:h(k) = m * (k * A mod 1) (0<A<1)
(4)全域散列:从一组仔细设计的散列函数中随机地选择一个。(即使对同一个输入,每次也都不一样,平均性态较好)
3.冲突解决策略
(1)链接法
(2)开放寻址法
a.线性探测:h(k, i) = (h'(k) + i) mod m
b.二次探测:h(k, i) = (h'(k) + c1*i + c2 *i^2) mod m
c.双重散列:h(k, i) = (h1(k) + i * h2(k)) mod m
(3)完全散列:设计一个较小的二次散列表
一、概念.
我们知道数组能够提供对元素的快速访问但难于扩展;链表易于扩展但不能对其元素进行快速访问。对于大量元素的数据来说,我们当然希望两全其美。散列表提供了达到此目标的一种方法。散列表又称哈希表,它有以下几个术语:
1.关键字:元素的存储部分,数据库的元素通过它进行存储,查找等操作(也称作散列关键字)
2,散列表元:散列数组的某个位置,其后跟着另外一个包含其元素的结构
3,散列函数:对关键字和散列表元提供映射的函数
4,完全散列函数:对关键字和整数提供一一映射的函数
下面是一个简单的散列函数的实例
1.综述
散表表仅支持INSERT、SEARCH、DELETE操作。把关键字k映射到槽h(k)上的过程称为散列。
多个关键字映射到同一个数组下标位置称为碰撞。
好的散列函数应使每个关键字都等可能地散列到m个槽位中
2.散表函数
(1)若函数为h(k)=k,就是直接寻址表(2)除法散列法:h(k) = k mod m
(3)乘法散列法:h(k) = m * (k * A mod 1) (0<A<1)
(4)全域散列:从一组仔细设计的散列函数中随机地选择一个。(即使对同一个输入,每次也都不一样,平均性态较好)
3.冲突解决策略
(1)链接法
(2)开放寻址法
a.线性探测:h(k, i) = (h'(k) + i) mod m
b.二次探测:h(k, i) = (h'(k) + c1*i + c2 *i^2) mod m
c.双重散列:h(k, i) = (h1(k) + i * h2(k)) mod m
(3)完全散列:设计一个较小的二次散列表
二、代码
//Hash.h #include <iostream> using namespace std; int m, NIL = 0; //11.4 开放寻址法 typedef int (*Probing)(int k, int i); int h(int k) { return k % m; } int h2(int k) { return 1 + k % (m-1); } //线性探测 int Linear_Probing(int k, int i) { return (h(k) + i) % m; } //二次探测 int Quadratic_Probint(int k, int i) { int c1 = 1, c2 = 3; return (h(k) + c1 * i + c2 * i * i) % m; } //双重探测 int Double_Probint(int k, int i) { return (h(k) + i * h2(k)) % m; } int Hash_Insert(int *T, int k, Probing p) { int i = 0, j; do{ j = p(k, i); if(T[j] == NIL) { T[j] = k; return j; } i++; } while(i != m); cout<<"error:hash table overflow"<<endl; } int Hash_Search(int *T, int k, Probing p) { int i = 0, j; while(1) { j = p(k, i); if(T[j] == NIL || i == m) break; if(T[j] == k) return j; i++; } }
相关文章推荐
- 《算法导论》第11章 散列表 (3)开放寻址
- 算法导论第11章 散列表(哈希表)
- 《算法导论》第11章 散列表 (3)开放寻址
- 《算法导论》学习总结 — 10. 第10章(略) && 第11章 散列表
- 算法导论 第11章 散列表
- 《算法导论》第11章 散列表 个人笔记
- 算法导论答案 第11章:散列表
- 《算法导论》第11章 散列表 (2)散列表
- 《算法导论》第11章 散列表 (2)散列表
- 《算法导论》第11章 散列表 (1)直接寻址表
- 《算法导论》第11章 散列表 (2)散列表
- 《算法导论》第11章 散列表 (1)直接寻址表
- 《算法导论》第11章 散列表 (2)散列表
- 算法导论-第11章-散列表-11.1-4 大数组的直接寻址表
- 《算法导论》第11章 散列表 (1)直接寻址表
- 《算法导论》第11章 散列表 (1)直接寻址表
- 算法导论-第11章-散列表
- 《算法导论》笔记 第11章 11.2 散列表
- 算法导论代码 第11章 散列表
- 《算法导论》笔记 第11章 11.2 散列表