C 我的哈希函数有什么问题?

C 我的哈希函数有什么问题?,c,hash,hashtable,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

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

#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;
}
#包括
#包括
#包括
#定义N 19
#定义c13
#定义c2 5
#定义M3000
内福;
int h_表[N];
int h(int k,int i)
{
返回(k+i*c1+i*i*c2)%N;
}
void init()
{
对于(int i=0;i

散列(“h”)函数和“插入”函数取自《算法简介》一书(Cormen)。我不知道h函数或插入函数发生了什么。有时它会完全填满我的数组,但有时不会。这意味着它不好用。我做错了什么

简言之,您为
位置生成重复值的频率足以防止
h_table[]
仅在
N
尝试后被填充

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

作为一个实验,我将循环索引从
N
增加到
100
,但
h(…)
函数除外(以免超出
h\u表[]
)。正如预期的那样,前5个职位立即填补。又试了3次后,下一个就满了。下一次尝试10次,以此类推,直到100次尝试结束时,仍有一些未写的位置。
在下一次运行时,所有表格位置都已填满

2种可能的解决方案:
1) 修改哈希以提高唯一值的概率。
2) 增加迭代次数以填充
h\u表
一个
好的散列函数()%N
可能会在
N
重新散列中重复自身。好的散列在其输出中看起来几乎是随机的,即使它是确定性的。因此,在
N
尝试中,它可能不会遍历所有数组元素


在多次尝试(例如N/3次尝试)后找不到可用数组元素后,建议使用另一种方法。只需查找下一个可用元素。

您是否已使用调试器检查了代码?请注意,
memset(b,-1100)
不会将所有
b[]
设置为-1。与其在(i!=N)
时停在
上,请继续查找。也许在
i>=N/2
之后,只需线性查找下一个空闲单元格。将
memset()
语句替换为
for(i=0;iI使用类似于调试器的东西。我使用printf(“位置%d”,位置)我很清楚,散列函数跳过了一些值。我可以看出这是错误的,但我不知道为什么…我需要使用散列的二次函数:(