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

版权声明:如果有帮助,请点个赞!如果有帮助,请点个赞!如果有帮助,请点个赞! https://blog.csdn.net/feather_wch/article/details/50659142
这里不讲解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  
展开阅读全文

没有更多推荐了,返回首页