解释与算法相关的int * count语句

时间:2015-05-29 18:19:26

标签: c

我想创建一个程序来查找数组中的重复整数。 为此,我有两种方法。

  • 使用嵌套数组。它会给出时间复杂度O(n²)
  • 使用辅助阵列查找阵列的频率。

我见过一个解决方案,但它只限于1位数字。它使用计数数组。

int *count = (int *)calloc(sizeof(int), (size - 2));

为什么(size -2)?

代码是:

#include<stdio.h>
#include<stdlib.h>
void printDuplicate(int arr[], int size){
    int *count = (int *)calloc(sizeof(int),(size-2));
    int i;
    for(i=0;i<size;i++){
        if(count[arr[i]] == 1)
            printf("%d,",arr[i]);
        else
            count[arr[i]]++;
    }
}
int main(){
    int arr[] = {2,5,3,4,2,5,7,8,7};
    int size = sizeof(arr)/sizeof(arr[0]);
    printDuplicate(arr,size);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

实际上这里写的calloc声明是错误的。这里的内存分配是

4*7=28

所以这里的内存分配是7整数,但在这里你可以访问更多的7个元素。它在C语言中实际上是错误的,但它现在可以正常运行,因为C的{​​{1}}没有数组边界检查,但它可能会导致写入无效的内存。

  

但是你如何能够访问未分配的内存块?

以最佳方式解释此答案here

您可以看到我编译的代码here

当我们解码算法时,您可以看到

  1. i=0 arr[0]=2。然后它会检查count[2]==1count[2]是否代表数字2的重复次数。至于第一次count[2]=0所以它将值增加到1
  2. 然后检查所有i值。
  3. i=4时,它会检查count[arr[4]]是否为count[2]==1。如果它是一个然后打印它。

答案 1 :(得分:0)

以下评论显示calloc功能

的每个参数的实际原因
int *count = 
(int *)
calloc(
    sizeof(int), // Number of elements to allocate
    (size-2) // Size of each element
);

我猜你的参数是颠倒的

如果你有:

int *count = (int *)calloc((size - 2), sizeof(int));

它会为int数组分配size - 2个元素,每个元素的大小为int

但我认为这些元素(size - 2)对你的程序来说还不够。

查看您的示例(使用反向参数):

...

int arr[] = {2,5,3,4,2,5,7,8,7}; // This array has 9 elements
int size = sizeof(arr)/sizeof(arr[0]); // So size will 9
printDuplicate(arr,size); // arr and 9 as parameters

...

int *count = (int *)calloc((size-2), sizeof(int)); // You allocated a 7-size array

...

if(count[arr[i]] == 1) // Maximum index of count will be 8
// so the allocated memory will be not enough

...

来源:calloc reference

答案 2 :(得分:0)

int *count = (int *)calloc((size - 2), sizeof(int));

size -2不是必需的,这是混淆的声明,请避免使用它。

将内存创建为全部使用。我们可以使用数组的直接大小而不是size-2

它不会出错。谢谢。

享受学习本课程。