假设我有两个数组(相同长度),数组没有排序(随机):
a[] = {1, 3, 5, 7, 10, 11}
b[] = {1, 4, 5, 7, 9, 11}
我是否知道在这两个数组之间找到所有不匹配(不同)值的最快方法是什么? (索引信息就足够了)。非常感谢你的时间。
答案 0 :(得分:1)
如果您只对与数组a和b中具有不同值的单元格对应的索引感兴趣,则只需迭代两个数组并检查它们的索引是否相等就足够了。下面给出的参数 N 表示数组a和b的大小。
int get_unmatched_indices(int a[], int b[], int N, int indices[])
{
int i, num_unmatched = 0;
for(i = 0; i < n; ++i)
{
if (a[i] != b[i])
{
indices[num_unmatched++] = i;
}
}
return num_unmatched;
}
上述功能使用 O(N)额外空间(对于索引)和 O(N)时间找出您要搜索的信息。如果您希望在找到的索引处打印不匹配的元素,则可以迭代索引并打印每个[indices [X]]和b [indices [X]]的值。
解释是否可以实现更高的效率:
任何依赖于比较a和b中元素值的方法都需要读取a和b中的每个元素。这可以通过矛盾证明是微不足道的。假设您可以跳过比较索引i处的[i]和b [i]的值。那么,你无法知道a [i]和b [i]是否是不匹配的元素,因为跳过了一个必不可少的信息。
现在,存在某些问题类别,其中存在比基于比较的算法更好的一些方法。排序就是一个例子。有基于比较的排序算法,最好是 O(NlogN),但也有其他算法具有 O(N)复杂性,以及其他一些限制。因此,从理论上讲,似乎有一些非基于比较的方法可行。但是,即使在这些算法中,您至少也需要处理所有必要信息。 (即遍历每个元素并将其处理为某种形式)所以,即便如此,您已经达到 O(N)复杂度。因此,您可能设计的任何算法都可以提供恒定的效率因素。