我在c中为一个家庭作业分配了一个哈希集ADT。我无法弄清楚为什么我的逻辑不适用于计算哈希集中的簇的函数。
void printClusterStats (hashset_ref hashset) {
int **clusters = (int**)calloc (hashset->length, sizeof(int));
assert (clusters);
int ct = 0;
// i traverses hashset->array
// ct adds up words in each cluster
// this loop screws up vvv
for ( int i = 0; i < hashset->length; ++i) {
if (hashset->array[i] == NULL) {
clusters[ct] += 1;
ct = 0;
}else {
ct += 1;
}
}
clusters[ct] +=1; //catch an ending cluster
printf("%10d words in the hash set\n", hashset->load);
printf("%10d length of the hash array\n", hashset->length);
for ( int i = 0; i < hashset->length; i++){
if (clusters[i] == 0) continue;
else{
printf("%10d clusters of size %3d\n", clusters[i], i);
}
}
free(clusters);
}
此功能的输出如下:
26 words in the hash set
63 length of the hash array
96 clusters of size 0
32 clusters of size 1
16 clusters of size 2
4 clusters of size 4
4 clusters of size 6
305 clusters of size 33
-703256008 clusters of size 34
-703256008 clusters of size 35
对于我的输入hashset,数组63中有26个单词。然而,计数会以某种方式搞砸。
编辑:我手动计算了这些集群,发现每个计数都是它应该的4倍。这是什么意思?答案 0 :(得分:2)
此行创建一个指向int
的指针数组int **clusters = (int**)calloc (hashset->length, sizeof(int));
而不是在存储集群计数时实际需要的int数组
int *clusters = (int*)calloc (hashset->length, sizeof(int));
因此,当你执行clusters[ct] += 1;
时,它将被视为指针算术,并且每次都会向集群计数添加4,因为您使用的是具有4字节指针的系统。
答案 1 :(得分:0)
int **clusters = (int**)calloc (hashset->length, sizeof(int));
应该是
int *clusters = (int*)calloc (hashset->length, sizeof(int));
我还不是很有能力,所以我无法解释为什么这解决了我的问题。但如果你好奇,那就去吧!
这是正确的输出
26 words in the hash set
63 length of the hash array
24 clusters of size 0
8 clusters of size 1
4 clusters of size 2
1 clusters of size 4
1 clusters of size 6