【问题标题】:Storing numbers in array in C在C中将数字存储在数组中
【发布时间】:2011-09-17 17:52:02
【问题描述】:

我有三个一维数组。任务是将存在于三个数组中的每个数组中的数字存储在第四个数组中。这是我的解决方案,如您所见,这是不正确的。如果可能的话,我也对更快的算法感兴趣,因为它是 O(N3) 难度。

    #include <stdio.h>
main(){
int a[5]={1,3,6,7,8};
int b[5]={2,5,8,7,3};
int c[5]={4,7,1,3,6};
int i,j,k;
int n=0;
int d[5];
for(k=0; k<5; k++){
    for(j=0; j<5; j++){
        for(i=0; i<5; i++){
            if(a[i]==b[j] && b[j]==c[k])
                {d[n]=a[i];
                n++;}
            else
                d[n]=0;
    }}}
//Iterate over the new array
for(n=0;n<5;n++)
    printf("%d\n",d[n]);
return 0;
}

【问题讨论】:

    标签: c arrays integer store


    【解决方案1】:

    您没有以正确的方式将它们存储在 d[] 上。

    找到后,您可以跳过 c[] 的那个元素的 a[] 和 b[] 的其余部分。

    #include <stdio.h>
    main(){
    int a[5]={1,3,6,7,8};
    int b[5]={2,5,8,7,3};
    int c[5]={4,7,1,3,6};
    int i,j,k;
    int n=0;
    int found;
    int d[5];
    for(k=0; k<5; k++){
        found=0;
        for(j=0; j<5 && !found; j++){
            if (b[j]==c[k]) {
                for(i=0; i<5 && !found; i++){
                    if(a[i]==b[j]) {
                        d[n++]=c[k];
                        found=1;
                    }
                }
        }}}
    //Iterate over the new array
    for(i=0;i<5;i++)
        printf("%d\n",d[i]);
    return 0;
    }
    

    【讨论】:

    • 这不是一个更好的算法,但我认为我修复了您的代码,并且速度稍快。
    • 我添加了if (b[j]==c[k]) {作为优化
    【解决方案2】:

    改进为O(n log n) 的一种方法是首先对所有三个数组进行排序。 然后为每个数组使用三个指针。你总是移动指向最低值的那个,每次移动后检查三个值是否相同。

    要进一步改进,您可以使用哈希表。 遍历第一个数组并将其值作为键放入哈希表中。 然后遍历第二个数组,每次当值作为第一个哈希表中的键存在时,将其放入第二个哈希表中。 最后遍历第三个数组,如果第二个哈希表中存在一个值作为键,则将其存储在第四个数组中。这是O(n),假设哈希表操作是O(1)

    【讨论】:

    • 你可以只使用两个排序的数组。如果您有一个阵列比其他阵列短得多 - 它会显着加快速度。详情见我的回答。
    【解决方案3】:

    预先对第二个和第三个数组进行排序,并对它们使用二进制搜索来确定是否存在某些元素。 如果元素存在于所有数组中 - 它会出现在第一个数组中。因此,遍历第一个(未排序的)数组并检查其元素是否在第二个和第三个。

    如果你把最短的数组作为第一个 - 它也会使算法稍微快一点。

    【讨论】:

      【解决方案4】:

      您的错误是您使用三个嵌套计数器之一(用于索引输入数组)作为输出数组的索引。你需要有一个第四个索引(我们称之为n),它从零开始,每次找到一个满意的值时才会增加。

      【讨论】:

      • 我按照您的建议更改了代码,但出现了一些问题
      • @George:您可以编辑您的问题以包含您更新的代码!当它在评论中时我无法阅读...
      猜你喜欢
      • 2019-03-05
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      相关资源
      最近更新 更多