在C中存储数组中的数字

在C中存储数组中的数字,c,arrays,integer,store,C,Arrays,Integer,Store,我有三个一维数组。任务是将三个数组中的每个数组中存在的数字存储在forth数组中。这是我的解决方案,正如你所看到的,它是不正确的。如果可能的话,我还对更快的算法感兴趣,因为它是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++)

我有三个一维数组。任务是将三个数组中的每个数组中存在的数字存储在forth数组中。这是我的解决方案,正如你所看到的,它是不正确的。如果可能的话,我还对更快的算法感兴趣,因为它是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;
}
#包括
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];

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

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

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

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

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

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

预先对第二个和第三个数组排序,并对其使用二进制搜索来确定是否存在某个元素。 如果元素在所有数组中都存在-它将出现在第一个数组中。所以,检查第一个(未排序)数组并检查其元素是否在第二个和第三个数组中


如果将最短的数组作为第一个数组,那么算法也会稍微快一点。

事先对第二个和第三个数组进行排序,然后对它们进行二进制搜索,以确定是否存在某个元素。 如果元素在所有数组中都存在-它将出现在第一个数组中。所以,检查第一个(未排序)数组并检查其元素是否在第二个和第三个数组中


如果你把最短的数组作为第一个数组,那么算法也会稍微快一点。

你没有用正确的方法将它们存储在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;
}
#包括
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];

对于(k=0;k您没有以正确的方式将它们存储在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;
}
#包括
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];

对于(k=0;kYou可以只使用两个数组进行排序,顺便说一句。如果你有一个数组比其他数组短得多,它将显著加快速度。有关详细信息,请参阅我的答案。你可以只使用两个数组进行排序,顺便说一句。如果你有一个数组比其他数组短得多,它将显著加快速度。请参阅我的答案。)r详细信息。我按照你的建议更改了代码,但有一些problem@George:您可以编辑您的问题以包含更新的代码!当它出现在注释中时,我无法阅读它…我按照您的建议更改了代码,但存在一些错误problem@George:您可以编辑您的问题以包含更新的代码!当问题出现在注释中时,我无法阅读它…I这不是一个更好的算法,但我想我修复了你的代码,它稍微快一点。我添加了
if(b[j]==c[k]){
作为一个优化它不是一个更好的算法,但我想我修复了你的代码,它稍微快一点。我添加了
if(b[j]==c[k]){
作为一个优化