我的哈希函数出了什么问题?

时间:2017-04-26 18:23:50

标签: c hash hashtable

我正在尝试创建一个哈希表。这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define N 19
#define c1 3
#define c2 5
#define m 3000
int efort;
int h_table[N];

int h(int k, int i)
{
    return (k + i*c1 + i*i*c2) % N;
}
void init()
{
    for (int i = 0; i < N; i++)
        h_table[i] = -1;
}
void insert(int k)
{
    int position, i;
    i = 0;
    do
    {
        position = h(k, i);
        printf("\n Position %d \n", position);
        if (h_table[position] == -1)
        {       
            h_table[position] = k;
            printf("Inserted :elem %d at %d \n", h_table[position], position);
            break;
        }
        else
        {
            i += 1;
        }
    } while (i != N);
}
void print(int n)
{
    printf("\nTable content: \n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", h_table[i]);
    }

 }


void test()
 {
    int a[100];
    int b[100];
    init();
    memset(b, -1, 100);
    srand(time(NULL));
    for (int i = 0; i < N; i++)
    {
        a[i] = rand() % (3000 + 1 - 2000) + 2000;
    }
    for (int i = 0; i < N ; i++)
    {
        insert(a[i]);
    }
    print(N);
}
 int main()
{   
    test();
    return 0;
}

哈希(“h”)函数和“插入”函数来自“算法简介”一书(Cormen)。我不知道h函数或插入函数发生了什么。有时候它会完全填满我的阵列,但有时却没有。这意味着它不能很好地运作。我究竟做错了什么?

2 个答案:

答案 0 :(得分:0)

简而言之,您经常为position生成重复值,以防止仅在h_table[]次尝试后填充N ...

无法保证伪随机数生成器生成一组唯一数字,您的h(...)函数也不能保证生成互斥的位置值集。在生成所有19个位置之前,您可能会生成相同的位置,足以使用完循环。问题在您可能获得未使用职位的价值之前,必须平均调用h(...)次?应该得到回答。这可能有助于指导您解决问题。

作为实验 ,除N函数外,我将循环索引从100增加到h(...)(所以不要超越h_table[])。正如预期的那样,前5个职位立即填补。经过3次尝试后,下一个填充。接下来的10次尝试稍后,依此类推,直到100次尝试结束,仍有一些不成文的位置 在下次运行 时,所有表格位置都已填满。

2种可能的解决方案:
1)修改哈希以提高唯一值的概率 2)增加迭代以填充h_table

答案 1 :(得分:0)

good_hash_function() % N可能会在N重新散列中重演。好的哈希在其输出中看起来几乎是 random ,即使它是确定性的。因此,在N尝试时,它可能不会遍历所有数组元素。

在多次尝试后找不到一个空闲的数组元素,比如N / 3次尝试,推荐一种不同的方法。只需寻找下一个免费元素。