平方探测法Quadratic probing解决哈希冲突

平方探测法是解决哈希冲突的一个方法,数值a的位置为num[a+i*i],i从0开始到size-1(哈希表长),有空位就插入,停止循环,没有就继续。有这种情况就是循环了size-1但依旧没有位置插入,则判定为此数不可以插入。

平均查找时间即为总查找次数/查找个数。查找方法和插入方法相同,找num[a+i*i],看是不是查找数a,没有找到则继续,找到或者该位置为空则停止。

 

但个题有个小问题,也不知道为啥查找时要从0找到size而不是size-1,好奇怪

1145 Hashing - Average Search Time

int num[20000];   //虽然说不超过10000,但是如果输入10000,则要求一个比他大的素数会超过10000
int si;
bool prime(int a)   //判断素数
{
    if (a <= 1)
        return false;
    for (int i = 2;i <= sqrt(a);i++)
    {
        if (a%i == 0)
            return false;
    }
    return true;
}

void insert(int a)
{
    int i;
    for (i = 0;i < si;i++)
    {
        if (num[(a + i*i) % si] == -1)
        {
            num[(a + i*i) % si] = a;
            break;
        }
    }
    if (i == si)
        printf("%d cannot be inserted.\n", a);
}

int find(int a)
{
    int i,all = 0;
    for (i = 0;i <= si;i++)  //按道理不应该有等号,但是不知道为啥这个题这样
    {
        all++;
        if (num[(a + i*i) % si] == a|| num[(a + i*i) % si] == -1)   //如果为空也停止查找
            break;
    }
    return all;
}

int main(void)
{
    int l1, l2, i;
    scanf("%d%d%d", &si, &l1, &l2);
    memset(num, -1, sizeof(num));
    while (!prime(si))
        si++;
    for (i = 0;i < l1;i++)
    {
        int a;
        scanf("%d", &a);
        insert(a);
    }
    int alltime = 0;
    for (i = 0;i < l2;i++)
    {
        int a;
        scanf("%d", &a);
        alltime+=find(a);
    }
    printf("%.1f\n", alltime*1.0 / l2);
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这里提供一个C语言的简单实现,使用线性探测平方探测处理冲突: ```c #include <stdio.h> #include <stdlib.h> #define m 11 // 哈希表大小 #define NULLKEY -32768 // 哈希表空位置的标志 int hash(int key) { return key % m; } int linear_probe(int H[], int key) { int index = hash(key); int i = 0; while (H[(index + i) % m] != NULLKEY) { i++; } return (index + i) % m; } int quadratic_probe(int H[], int key) { int index = hash(key); int i = 0; while (H[(index + i*i) % m] != NULLKEY) { i++; } return (index + i*i) % m; } void insert_linear(int H[], int key) { int index = hash(key); if (H[index] != NULLKEY) { index = linear_probe(H, key); } H[index] = key; } void insert_quadratic(int H[], int key) { int index = hash(key); if (H[index] != NULLKEY) { index = quadratic_probe(H, key); } H[index] = key; } void display(int H[]) { for (int i = 0; i < m; i++) { printf("%d ", H[i]); } printf("\n"); } int main() { int H[m]; int keys[] = { 12, 44, 13, 88, 23, 94, 11, 39, 20, 16 }; for (int i = 0; i < m; i++) { H[i] = NULLKEY; } printf("Insert using linear probing:\n"); for (int i = 0; i < 10; i++) { insert_linear(H, keys[i]); } display(H); for (int i = 0; i < m; i++) { H[i] = NULLKEY; } printf("Insert using quadratic probing:\n"); for (int i = 0; i < 10; i++) { insert_quadratic(H, keys[i]); } display(H); return 0; } ``` 上述代码中,`hash()`函数为哈希函数,`linear_probe()`函数和`quadratic_probe()`函数为线性探测平方探测探测函数,`insert_linear()`函数和`insert_quadratic()`函数为插入操作,`display()`函数用于显示哈希表中的元素。程序中使用了一个数组`keys`来存储关键字序列。运行程序后,会输出使用线性探测平方探测插入后的哈希表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值