哈希表(Hash)—— 查找算法 (基于用线性探测再散列处理冲突)

目录

一、冲突问题

二、处理冲突的方法

三、算法思想

四、算法


一、冲突问题

当关键字集合很大时,关键字值不同的元素可能会映射到哈希表的同一地址上,即 k_{1}\neq k_{2} ,但 H(k_{1})=H(k_{2}),这种现象称为冲突,此时称 k_{1} 和 k_{2} 为同义词。

二、处理冲突的方法

线性探测再散列

012345678
47266069
69 % 1169
(3+1) % 1269
(3+2) % 1269
(3+2) % 1269

三、算法思想

1、首先计算 h_{0} = hash(K);

2、如果单元 h_{0} 为空,则所查元素不存在;

3、 如果单元 h_{0} 中元素的关键字为K,则找到所查元素;

4、否则重复线性探测再散列法解决冲突的过程。

四、算法

#define m 12 /* 哈希表的长度 */

#define NULLKEY 32767 /* 代表空记录的关键字值 */

typedef int KeyType;  /* 假设关键字为整型 */

/* 所使用的哈希函数 */
int hash(KeyType k) {
    return k % 11;
}

/* 哈希表的查找算法 */
int HashSearch(HashTable ht, KeyType K) {
    /* h0 —— 初次得到的哈希地址,hi —— 再散列得到的哈希地址 */
    int h0 = hash(K), hi, i;

    if (ht[h0].key == NULLKEY) 
        return -1;
    else if (ht[h0].key == K)
        return h0;
    else {
        for (i = 1; i <= m - 1; ++i) {
            hi = hash(h0 + i);
            if (ht[hi].key == NULLKEY)
                return -1;
            else if (ht[hi].key == K)
                return h0;
        }
        return -1; /* 所有再散列的地址已被查找,代表所查元素不存在 */
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值