【问题标题】:find the unmatched elements at each index in two arrays在两个数组中的每个索引处查找不匹配的元素
【发布时间】:2017-03-06 02:56:01
【问题描述】:

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

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

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

【问题讨论】:

  • 给定的值在数组中排序?
  • 阵列可以有多大?我们对空间复杂度有限制吗?我们可以修改作为参数给出的原始数组吗?
  • 如何定义“不匹配”。那些不匹配的元素是具有在另一个数组中不存在的值的元素,还是只是每个索引 i 处的元素,其中 a[i] != b[i]?
  • @sunkuet02 感谢您的回复。该数组由未排序的随机数组成。
  • 天真的解决方案:搜索每个元素并在零初始化的临时数组中执行 temp[a[i]]++,然后再次执行 temp[b[i]]++。 temp 的 1 是你的元素

标签: c algorithm search


【解决方案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) 时间找出您寻找的信息。如果您想在找到的索引处打印不匹配的元素,您可以遍历索引并打印每个 a[indices[X]] 和 b[indices[X]] 的值。

说明是否可以达到更好的效率:

任何依赖于比较 a 和 b 中元素值的方法都要求您读取 a 和 b 中的每个元素。用反证法证明这一点是微不足道的。假设您可以跳过比较索引 i 处的 a[i] 和 b[i] 的值。然后,你无法知道 a[i] 和 b[i] 是否是不匹配的元素,因为跳过了必不可少的信息。

现在,在某些问题类别中,存在比基于比较的算法更好的方法。排序就是一个例子。有基于比较的排序算法,充其量是 O(NlogN),但也有其他算法具有 O(N) 复杂度,并有其他某些限制。因此,从理论上讲,似乎有一些基于非比较的方法可以工作。但是,即使在这些算法中,您至少需要处理所有基本信息。 (即遍历每个元素并将其处理为某种形式)所以即使那样你已经达到了 O(N) 复杂性。因此,您可能设计的任何算法充其量都可以提供恒定的效率因素。

【讨论】:

  • 他说数组是没有排序的,不要以为只是因为例子恰好是
  • @ilim 您的方法适用于这个想法。但是有没有更快的方法呢?因为数组可以很长。是的,数组没有排序。
  • @Leeor 我没有。在后 OP 下方的 cmets 中,比较了相同索引处的元素。 (即,当说第 2 和第 5 索引处的元素是答案时)由于术语 unmatched 导致的问题陈述存在歧义,几乎所有人都认为每个值在另一个数组中都有重复项,尽管OP在问题中并不暗示这一点。
  • @HuangJie 在一两分钟内,我将尝试在我的回复中添加一个解释,说明为什么不可能实现比 O(N) 更好的时间复杂度.
  • 那么我同意这个问题描述得不好而且这个例子令人困惑,我猜无论谁投反对票也认为数组是一组值,否则问题是微不足道的。看起来你是对的,这是 +1 :)
猜你喜欢
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2021-03-10
相关资源
最近更新 更多