比较C中未排序数组值的优雅方法?
我在C中有两个int数组,我想比较它们.这是我非常快速的攻击,但我想知道是否有更快的方法.
1)找到一个不在我们正在比较的数组(arr2)中的整数. #include <stdlib.h> #include <stdio.h> #include <time.h> #include <random.h> bool isin(int arr[],int elem,size_t len,size_t *index) { int i; for (i = 0; i < len; ++i) { if (arr[i] == elem) { if(index != NULL) *index = i; return true; } } return false; } int notInArray(int arr[],size_t len) { int r; do { r = rand(); } while (isin(arr,r,len,NULL)); return r; } bool arraysEqual(int arr1[],int arr2[],size_t len) { size_t i,j,index; int notInArr2 = notInArray(arr2,len); int *arr = (int*)malloc(len * sizeof(int)); for (i = 0; i < len; ++i) arr[i] = arr2[i]; /*copy arr2 to arr*/ for (i = 0; i < len; ++i) { if (isin(arr,arr1[i],&index)) arr[index] = notInArr2; /*replace that elemnt with something that we know is not in the original array*/ else return free(arr),false; } free(arr); return true; } int main() { srand(time(NULL)); int a[] = { 3,9,1,3,8 }; int b[] = { 1,8,9 }; printf("%in",arraysEqual(a,b,sizeof(a) / sizeof(int))); system("pause"); } 我不一定在寻找源代码,但更多的是关于如何实现它的一般概念. 解决方法
从算法的角度来看,您的解决方案不是最理想的,并且在O(n ^ 2)时间内执行比较(因为isin是为数组中的每个元素调用的)和O(n)额外空间(因为您分配了一个副本数组).
有更便宜的方法来执行此任务,这里有5种替代方法的概述: >计算一个数组的哈希集或计数字典(频率分布)并迭代另一个数组以确定匹配的值 – 直方图(O(n)时间,O(n)空间)>与上面相同,但使用布隆过滤器,只要您不关心匹配值频率并且不介意误报的风险(O(n)时间,O(1)空间)>就地排列其中一个数组并使用二进制搜索来检测匹配(Quicksort的O(n log n)时间,以及二进制搜索的O(log n),O(1)空间).>如果输入数组是不可变的,那么就像上面的选项一样,但是排序成一个新数组(与上面相同的时间复杂度,但O(n)空间)>对两个数组进行排序并检查相同索引处的所有元素是否相等(O(2n log n)时间,O(1)空间). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |