我想知道比较两个未排序的数组的最佳方法是什么,如果它们使用C ++具有相同的值,请检查它们? 我在O(nlogn)中找到了一个解决方案但是有一个O(n)解决方案吗?怎么样,如果是的话?
请让我告诉你,这不是大学问题,我想知道解决ACM问题。
谢谢。
答案 0 :(得分:2)
这取决于您的价值观以及您愿意花多少钱。在O(n)解决方案中,对于包含唯一整数x的数组,其范围为0< = x< c,您可以使用辅助数组char count[c]
并执行以下操作:
int array1[N];
int array2[N];
//get the values into array1 and 2 from somehwere
char count[c]{0};
for(size_t i=0; i<N; i++) {
count[array1[i]]++;
count[array2[i]]++;
}
现在,当且仅当count
的所有元素都是0或2时,这两个数组才相等。这可以通过再次运行相同的循环在O(n)中检查,只是这次, count[array1[i]]
(和array2
相同)被检查等于2.相同的技术可以适用于其他一些场景:例如,如果值是非唯一的,则必须计算两个单独的数组,然后检查两个计数是否相等。但是,如果可能值的数量太大,则必须求助于将您的信息(&#39; x包含在数组&#39;中)存储在不同的结构中,例如操作在O(n log)中的树n),所以你回到了你开始的地方。