【发布时间】:2017-04-26 18:23:50
【问题描述】:
我正在尝试创建一个哈希表。这是我的代码:
#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 函数或插入函数发生了什么。有时它会完全填满我的数组,但有时不会。这意味着它不能很好地工作。我究竟做错了什么?
【问题讨论】:
-
您是否使用调试器单步调试过您的代码?
-
请注意
memset(b, -1, 100)不会将所有b[]设置为-1。 -
不要停留在
while (i != N),而是继续寻找。也许在i >= N/2之后,只需线性查找下一个空闲单元格。 -
用
for(i=0;i<100;i++) b[i]=-1;替换memset()语句并不能解决明显的问题。 -
我使用了类似于调试器的东西。我使用了 printf("Position %d",position) ,我很清楚哈希函数正在跳过一些值。我可以看到这是错误的,但我不知道为什么......我需要使用哈希的二次函数:(