在c中计算散列集中的集群

时间:2011-03-02 05:28:52

标签: c arrays pointers data-structures hashset

我在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倍。这是什么意思?

2 个答案:

答案 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