哈希表

哈希表

O(1)的查找操作
哈希表充分体现了算法设计领域的思想:空间换时间
键通过哈希函数得到的索引,分布越均匀越好

1 哈希函数的设计
1)整型

小范围正整数直接使用;
小范围负整数进行偏移;
大整数:取模,模一个素数;

下面的右侧分布就比较均匀:

Alt

2)浮点型

Alt

3)字符串

转换成整型处理:
Alt
优化一下:
Alt
代码实现:

Alt

4)复合类型

转成整型处理:
Alt
Alt

2 哈希冲突的处理——链地址法(Separate Chaining)

Alt
Alt
要想实现O(1)级别,显然使用静态数组,固定地址是不合理的,需要resize。

平均每个地址承载的元素多过一定程度,即扩容。
平均每个地址承载的元素少过一定程度,即缩容。

//哈希计算
int hash(K key) {
        return (hashCode(key) & 0x7fffffff) % M;//计算索引
    }
int hashCode(K key) {
        std::hash<K> key_hash;
        return key_hash(key);
    }
3 添加元素
void add(K key,V value){
    RBTree<K,V> *rbTree=hashTable[hash(key)];
    if(rbTree->contains(key)){
        rbTree->set(key,value);
    }else{
        rbTree->add(key,value);
        size++;
        //扩容
        if(size>=upperTol*M)
            resize(2*M);
    }
}
4 哈希表的复杂度分析

Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值