计算哈希集中的集群

时间:2010-02-26 08:17:31

标签: c

我正在尝试调试一个hashset实现(用于学校作业)。通过线性探测来管理冲突,我需要计算调试例程的给定大小的簇数。我解决了这个问题:

// really just hoping that a 50+ cluster doesn't occur
int clusters[50];
int count = 0;
for (int i=0; i < hashset->dim; i++) {
   if (hashset->array[i] != NULL) {
      count++;
   } else {
      if (count == 0) continue;
      if (clusters[count] == NULL) clusters[count] = 0;
      clusters[count]++;
      count = 0;
   }
}
for (int i=1; i < 50; i++) {
   if (clusters[i] != NULL && clusters[i] != 0)
      printf("%d clusters of size %d\n", clusters[i], i);
}

似乎有道理,但当我运行它时,我得到......

25143 entries in hashset
50286 dimension of the hash array
4585 clusters of size 1
2134 clusters of size 2
1102 clusters of size 3
696 clusters of size 4
388 clusters of size 5
264 clusters of size 6
173 clusters of size 7
104 clusters of size 8
89 clusters of size 9
51 clusters of size 10
46 clusters of size 11
35 clusters of size 12
26 clusters of size 13
22 clusters of size 14
17 clusters of size 15
134553327 clusters of size 16
134634407 clusters of size 17
112 clusters of size 18
6 clusters of size 19
134553324 clusters of size 20
134634399 clusters of size 21
107 clusters of size 22
3 clusters of size 23
2 clusters of size 24
134634401 clusters of size 25
107 clusters of size 26
134107784 clusters of size 27
134556210 clusters of size 28
[... more nonsense]

所以最初它似乎给出了合理的输出..很多集群,但无论如何。我的想法是,太大的数字实际上应该是0 - 它们是实际上不存在的集群但是由于某种原因仍然被打印出来。我只是不知道为什么......

2 个答案:

答案 0 :(得分:0)

这是一个简短的C程序:

#include <stdio.h>
int main() {
  char buf[20];
  for (int i = 0; i < 20; i++) {
    printf("%d ", buf[i]);
  }
  printf("\n"); return 0;
}

仔细考虑运行时应该打印的内容。

  • 每次运行它会打印相同的东西吗?
  • 在你运行它的每台机器上?

下面的剧透:

(spoiler padding)













.

以下是我在一次试运行中看到的内容:0 0 0 0 0 0 0 0 -128 5 64 0 0 0 0 0 -16 -60 -55 31

同样的错误困扰着我们的两个程序,但在我的程序中可能更容易看到。

答案 1 :(得分:0)

你写

  

他们是实际上没有的集群   存在,但由于某种原因仍然存在   打印

如果您没有分配元素clusters[i],则隐含地假设它不存在。但这是真的。无论您是否为其分配值,clusters数组中的每个值都会一直存在。如果你没有指定一个已知值,那么这个值是不可预测的,也许是134634399.所以,如果你想要clusters中的所有元素都是可预测的,那么你需要做什么?

这种对C记忆模型的误解导致以下代码(摘自您的问题):

int clusters[50];
/* ... */
for (int i=1; i < 50; i++) {
   if (clusters[i] != NULL && clusters[i] != 0)
      printf("%d clusters of size %d\n", clusters[i], i);
}

测试clusters[i] != NULL的目的是什么?你试图决定我省略了循环是否设置了clusters[i],但针对NULL的测试不能做到这一点。 clusters的元素不是某种指针,它们是原始的4字节整数值。他们总是有一些价值,但除非你将它们设置为某种值,否则该值是不可预测的。