优化该程序并执行#include <stdio.h> #include <stdlib.h> #define M 15 // 散列表大小 int H(int k) { return k % M; // 取余散列函数 } int HashSearch1(int ht[], int m, int k, int *p) { int i, j; j = H(k); i = j; int empty = -1; // 记录空位置 while (ht[i] != 0) { if (ht[i] == k) { *p = i; return 1; } if (ht[i] == -1 && empty == -1) { empty = i; } i = (i + 1) % m; if (i == j) break; } if (ht[i] == 0 && empty != -1) { // 插入元素 ht[empty] = k; *p = empty; return 0; } printf("溢出"); exit(-1); } int main() { int ht[M] = {0}; int i; int p; int keys[] = {10, 22, 31, 4, 15, 28, 17, 88, 59}; int n = sizeof(keys) / sizeof(int); for (i = 0; i < n; i++) { int ret = HashSearch1(ht, M, keys[i], &p); if (ret == 0) { printf("插入 %d 到位置 %d\n", keys[i], p); } else { printf("查找 %d 到位置 %d\n", keys[i], p); } } return 0; }
时间: 2024-02-14 10:11:29 浏览: 146
这段程序的散列表使用的是线性探测法,当发生冲突时,需要依次往后查找空位置,如果散列表中元素较多,冲突较多,查找空位置的时间会变得很长,影响程序效率。因此,可以通过以下几种方式进行优化:
1.使用更好的散列函数,减少冲突:该程序使用的是取余散列函数,可以考虑使用其他更好的散列函数,比如乘法散列法、平方取中散列法等。
2.增大散列表的大小:如果散列表大小足够大,可以减少冲突的发生,从而提高程序效率。
3.改变散列冲突解决方式:除了线性探测法,还可以使用其他的散列冲突解决方式,比如拉链法、双散列法等。
4.使用位运算代替取余运算:位运算的效率比取余运算高,可以考虑使用位运算代替取余运算,提高程序效率。
下面是优化后的程序:
```
#include <stdio.h>
#include <stdlib.h>
#define M 31 // 散列表大小,增大散列表的大小
int H(int k) {
return k % M;
}
int HashSearch2(int ht[], int m, int k, int *p) {
int i, j, d;
j = H(k);
i = j;
d = 1; // 步长为1
while (ht[i] != 0 && ht[i] != k) {
i = (i + d) % m;
if (i == j) { // 散列表已经遍历完一遍,未找到空位置
printf("溢出");
exit(-1);
}
}
if (ht[i] == k) {
*p = i;
return 1;
} else {
ht[i] = k;
*p = i;
return 0;
}
}
int main() {
int ht[M] = {0};
int i;
int p;
int keys[] = {10, 22, 31, 4, 15, 28, 17, 88, 59};
int n = sizeof(keys) / sizeof(int);
for (i = 0; i < n; i++) {
int ret = HashSearch2(ht, M, keys[i], &p);
if (ret == 0) {
printf("插入 %d 到位置 %d\n", keys[i], p);
} else {
printf("查找 %d 到位置 %d\n", keys[i], p);
}
}
return 0;
}
```
优化后的程序使用了更大的散列表,增加了散列冲突解决方式,使用了步长为1的线性探测法,同时使用了取模运算代替取余运算,提高了程序效率。
阅读全文