我遇到了这个问题:
给定两个数字数组,找出两个数组中的每一个是否具有相同的整数集。建议一种算法,其运行速度可以比
N * log(N)
快,而不需要额外的空间。
这是链接
find-if-two-arrays-contain-the-same-set-of-integers
algorithm-to-tell-if-two-arrays-have-identical-members
但是在阅读了上述链接的所有答案之后,我没有找到我遇到的这个简单的答案,这里是....
int main(){
int a[] = {1,5,5,7,5,6,6};
int b[] = {1,6,6,5,7,5,9};
int i = 0;
int size = 0;
int xor_ab = a[0]^b[0];
int sumDiff_ab = (a[0] - b[0]);;
if(sizeof(a)/sizeof(a[0]) == sizeof(b)/sizeof(b[0])){
size = sizeof(a)/sizeof(a[0]);
}else{
printf("not identical : array size differ");
return 0;
}
for(i=1; i < size ; ++i){
xor_ab = xor_ab ^ a[i] ^ b[i];
sumDiff_ab += (a[i] - b[i]);
}
if(xor_ab == 0 && sumDiff_ab == 0){
printf("identical");
}else{
printf("not identical");
}
return 0;
}
现在我想知道,我的解决方案是否适用于所有用例。 如果没有,请告诉我这些用例。
[编辑]
请考虑所有数字都是+ ve。
[已接受的答案]
我接受了@Boris Strandjev的回答,
我的解决方案不适用于
等情况{3,5}
{1,7}
答案 0 :(得分:4)
以下是您的算法不起作用的示例:
a[] = {3, 5};
b[] = {1, 7};
从两个数组中计算出两个值 - 太多不同的数组将评估为相同的两个值。这种身份比较永远不会奏效(考虑所有会发生的碰撞)。
答案 1 :(得分:0)
也许这不会回答你的问题但是使用散列函数来比较数组呢?
#include <stdio.h>
#include <stdlib.h>
#include <openssl/sha.h>
int main(){
int a[] = {1,5,5,7,5,6,6};
int b[] = {1,5,5,7,5,6,6};
unsigned char hasha[SHA_DIGEST_LENGTH]; // == 20
unsigned char hashb[SHA_DIGEST_LENGTH]; // == 20
SHA1((char*) a , sizeof(a), hasha);
SHA1((char*) b , sizeof(b), hashb);
printf("Are arrays equals ? %d\n" , (strcmp(hasha,hashb)==0? 1:0));
return 0;
}
你可以用:
编译它 gcc test.c -lssl -lcrypto -o test
答案 2 :(得分:0)
这适用于[]和b []的有限大小以及[]和b []中有限的值范围:
#include <stdio.h>
unsigned primes[] = {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71
,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149 };
int main(void)
{
unsigned a[] = {1,5,5,7,5,6,6};
#if SHOULD_BE_EQUAL
unsigned b[] = {1,5,5,6,7,5,6};
#else
unsigned b[] = {1,6,6,5,7,5,9};
#endif
#define COUNTOF(x) (sizeof x / sizeof x[0])
unsigned pa, pb, idx;
for (pa=1,idx=0 ; idx < COUNTOF(a); idx++) pa *= primes[a[idx]];
for (pb=1,idx=0 ; idx < COUNTOF(b); idx++) pb *= primes[b[idx]];
printf("A[] and b[] are %s equal\n", (pa==pb) ? "completely" : "not" );
return 0;
}