在两个数组中的每个索引处找到不匹配的元素

时间:2016-10-24 10:50:49

标签: c algorithm search

假设我有两个数组(相同长度),数组没有排序(随机):

a[] = {1, 3, 5, 7, 10, 11}
b[] = {1, 4, 5, 7, 9, 11}

我是否知道在这两个数组之间找到所有不匹配(不同)值的最快方法是什么? (索引信息就足够了)。非常感谢你的时间。

1 个答案:

答案 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)复杂度。因此,您可能设计的任何算法都可以提供恒定的效率因素。