您的位置:首页 > 理论基础 > 数据结构算法

hash(哈希散列) 数据结构-9

2016-02-13 16:11 357 查看
这里不讲解hash基础,只是用于复习之用。

hash原理就是通过散列函数hash(key),将key转换为需要查找的内容在hash表中实际的位置,然后取出来即可。散列函数的选择也是hash很重要的一部分,下面就讲解了几种散列函数。

在使用哈希表过程中时会出现冲突的,就是两个关键值key在转换之后对应的值一样。这时候就需要排解冲突,我觉得采用开放定址(open addressing)是最好的。开放定址,采用相关查找链,如果遇到了冲突,则继续查找下去,直到找到合适的位置。采用特定标志,如果需要删除某项,直接设置删除标志即可。

散列函数:
1、除余法 hash(key) = key % M M为素数:覆盖充分、映射均匀
缺点:1、hash(0) = 0为定点 2、相邻key的散列地址相邻 (低阶均匀)
2、MAD法
hash(key) = (a * key + b ) % M M为素数、a > 0 、b > 0、 a % m != 0
b:offset 消除不动点
a:step 原本相邻--->相邻step
Geometric Computing 几何计算 : 高维映射到低维 不需高阶均匀
需要Locality-Sensitive Hashing
3.
selecting digits 数字分析 取key中某几位:不有效
mid-square 平方取中
取key平方的中间若干位,构成地址。 使得所有位有更多影响。
4.folding key等宽
hash(123456789) = 123 + 456 + 789
= 123 + 654 + 789
XOR(位异或)
hash(110 011 011) = 110 ^ 011 ^ 011
= 110 ^ 110 ^ 011
越随机越好
rand(x+1) = [a*rand(x) ] % M
hashCode(char s[]){                                                                                                                  int i, h;
for(int n = strlen(s), i = 0; i < n; i++)
{
h = h << 5 | h >> 27;
h += int(s[i]);
}
return h;
}

排解冲突
closed addressing

1.多槽位
key找到bucket,再遍历bucket。整体O(1) 。浪费空间

2.独立链
删除简单。
缺点:指针空间,动态申请节点。
空间不连续,系统缓冲几乎失效。
open addressing
若要删除采用lazy removel:仅作删除标记:查找略过、插入直接放入
1.线性试探
hash(key) + 1 % m

2.平方试探:若涉及外存,I/O将激增。
hash(key) + 1^2 % m

3.双向平方试探
hash(key)
+ 1^2 % m

hash(key) - 1^2 % m
表长M:
M = 4 * k + 3素数:查找链表前M项互异。

双平方定理

任意素数P,可为一对整数平方和。 iff p % 4 = 1.

桶/计数排序:取决于个数n和范围[0
, m)

计数:反映各字符出现的次数

accumulation: O(m) 包括该字符之前出现的次数。

vector rank
list posi
BST key
hashing value
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: