在两个数组之间查找唯一元素的更快算法?

威廉·高尔

编辑:对于这个问题的新手,我已经发布了一个答案,以澄清发生了什么。接受的答案是我认为最能回答最初发布的问题的答案,有关更多详细信息,请参阅我的答案。

注意:此问题最初是伪代码和使用的列表。我已经将其适应Java和数组。因此,尽管我很乐意看到使用Java特定技巧(或与此相关的任何语言的技巧!)的任何解决方案,但请记住,最初的问题与语言无关。

问题

假设有两个未排序的整数数组ab,允许元素重复。它们相同(对于包含的元素),除了其中一个数组具有一个额外的元素。举个例子:

int[] a = {6, 5, 6, 3, 4, 2};
int[] b = {5, 7, 6, 6, 2, 3, 4};

设计一种算法,将这两个数组作为输入并输出单个唯一整数(在上述情况下为7)。

解决方案(到目前为止)

我想出了这个:

public static int getUniqueElement(int[] a, int[] b) {
    int ret = 0;
    for (int i = 0; i < a.length; i++) {
        ret ^= a[i];
    }
    for (int i = 0; i < b.length; i++) {
        ret ^= b[i];
    }
    return ret;
}

在课堂上介绍的“官方”解决方案:

public static int getUniqueElement(int[] a, int[] b) {
    int ret = 0;
    for (int i = 0; i < a.length; i++) {
        ret += a[i];
    }
    for (int i = 0; i < b.length; i++) {
        ret -= b[i];
    }
    return Math.abs(ret);
}

因此,两者在概念上都在做同一件事。假定a长度为m且b长度为n,则两个解的运行时间均为O(m + n)。

问题

后来我和我的老师交谈,他暗示有一种更快的方法。老实说,我不知道如何。要找出一个元素是否唯一,看来您至少必须查看每个元素。至少是O(m + n)...对吗?

那么有没有更快的方法?如果是这样,那是什么?

沙申克

在注释中使用HotLick的建议,这可能是最快的Java处理方法。它假设b.length == a.length + 1so b是带有额外“唯一”元素的较大数组。

public static int getUniqueElement(int[] a, int[] b) {
    int ret = 0;
    int i;
    for (i = 0; i < a.length; i++) {
        ret = ret ^ a[i] ^ b[i];
    }
    return ret ^ b[i];
}

即使无法做出假设,您也可以轻松地将其扩展为包括a或b可以是具有唯一元素的较大数组的情况。虽然它仍然是O(m + n),并且仅减少了循环/分配开销。

编辑:

由于语言实现的细节,这(令人惊讶地)仍然是CPython中最快的实现方法。

def getUniqueElement1(A, B):
    ret = 0
    for a in A: ret = ret ^ a
    for b in B: ret = ret ^ b
    return ret

我已经使用timeit模块对此进行了测试,并发现了一些有趣的结果。事实证明,ret = ret ^ aPython中的速记确实比速记更快ret ^= a同样,遍历循环的元素比遍历索引然后在Python中进行下标操作要快得多。这就是为什么此代码比我以前尝试复制Java的方法快得多的原因。

我想这个故事的寓意是没有正确答案,因为无论如何这个问题都是虚假的。正如OP在下面的另一个答案中指出的那样,事实证明,您这样做的真正速度不能超过O(m + n),而他的老师只是在拉他的腿。因此,问题减少到寻找最快的方法来迭代两个数组中的所有元素并累加所有元素的XOR。这意味着它完全依赖于语言实现,并且您必须进行一些测试和测试才能在使用的任何实现中获得真正的“最快”解决方案,因为整个算法不会改变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并两个数组,存储唯一元素,并在jQuery中排序

来自分类Dev

如何从Perl中的两个数组中获取唯一元素

来自分类Dev

如何从Perl中的两个数组中获取唯一元素

来自分类Dev

在打字稿中合并两个数组后如何获得唯一元素?

来自分类Dev

分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

来自分类Dev

在JavaScript中的多个数组中查找对称差/唯一元素

来自分类Dev

两个向量之间的唯一元素配对使总和最大化

来自分类Dev

在一百万个元素的数组中查找唯一的唯一元素

来自分类Dev

C ++数据结构可存储两个唯一元素集之间的多个关系

来自分类Dev

将重复出现的元素和唯一元素从给定数组中分离为两个包含唯一元素和重复元素的新数组

来自分类Dev

在n个数组中寻找唯一元素

来自分类Dev

如何比较2个数组中的唯一元素

来自分类Dev

连接多个数组,并仅返回jQuery的唯一元素

来自分类Dev

在列表中查找唯一元素的数量

来自分类Dev

在R中查找唯一元素的索引

来自分类Dev

在Numpy数组中查找非唯一元素的索引

来自分类Dev

在复合数组中查找唯一元素

来自分类Dev

lodash /下划线查找数组中非唯一元素的数量

来自分类Dev

在字符串的嵌套单元格数组中查找唯一元素

来自分类Dev

向数组添加唯一元素

来自分类Dev

从数组中删除唯一元素

来自分类Dev

具有“ issetequal”的数组的唯一元素

来自分类Dev

向数组添加唯一元素

来自分类Dev

从数组中删除唯一元素

来自分类Dev

当元素类似于 '(p,q)' 时查找 MATLAB 元胞数组的唯一元素

来自分类Dev

perl - 将唯一元素推入数组并从唯一元素创建变量

来自分类Dev

从原始顺序中删除数组和打印元素中唯一元素的算法

来自分类Dev

非唯一元素

来自分类Dev

查找由数组的2个唯一元素产生的所有产品(python)

Related 相关文章

  1. 1

    合并两个数组,存储唯一元素,并在jQuery中排序

  2. 2

    如何从Perl中的两个数组中获取唯一元素

  3. 3

    如何从Perl中的两个数组中获取唯一元素

  4. 4

    在打字稿中合并两个数组后如何获得唯一元素?

  5. 5

    分而治之-找到包含唯一元素的两个大小相等的数组之间的中位数?

  6. 6

    在JavaScript中的多个数组中查找对称差/唯一元素

  7. 7

    两个向量之间的唯一元素配对使总和最大化

  8. 8

    在一百万个元素的数组中查找唯一的唯一元素

  9. 9

    C ++数据结构可存储两个唯一元素集之间的多个关系

  10. 10

    将重复出现的元素和唯一元素从给定数组中分离为两个包含唯一元素和重复元素的新数组

  11. 11

    在n个数组中寻找唯一元素

  12. 12

    如何比较2个数组中的唯一元素

  13. 13

    连接多个数组,并仅返回jQuery的唯一元素

  14. 14

    在列表中查找唯一元素的数量

  15. 15

    在R中查找唯一元素的索引

  16. 16

    在Numpy数组中查找非唯一元素的索引

  17. 17

    在复合数组中查找唯一元素

  18. 18

    lodash /下划线查找数组中非唯一元素的数量

  19. 19

    在字符串的嵌套单元格数组中查找唯一元素

  20. 20

    向数组添加唯一元素

  21. 21

    从数组中删除唯一元素

  22. 22

    具有“ issetequal”的数组的唯一元素

  23. 23

    向数组添加唯一元素

  24. 24

    从数组中删除唯一元素

  25. 25

    当元素类似于 '(p,q)' 时查找 MATLAB 元胞数组的唯一元素

  26. 26

    perl - 将唯一元素推入数组并从唯一元素创建变量

  27. 27

    从原始顺序中删除数组和打印元素中唯一元素的算法

  28. 28

    非唯一元素

  29. 29

    查找由数组的2个唯一元素产生的所有产品(python)

热门标签

归档