在C中存储数组中的数字
我有三个一维数组。任务是将三个数组中的每个数组中存在的数字存储在forth数组中。这是我的解决方案,正如你所看到的,它是不正确的。如果可能的话,我还对更快的算法感兴趣,因为它是O(N3)难度在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++)
#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]){
作为一个优化