Big-O在排序和未排序的数组中查找公共元素

时间:2016-04-09 20:35:22

标签: java arrays sorting time-complexity big-o

在打印出两个阵列中的公共元素时,很难掌握大O.大小为a,另一个大小为b。

我知道两个未排序的数组是O(ab)

但是当a未排序且b被排序时呢?

什么时候排序?

任何解释都会很棒。

2 个答案:

答案 0 :(得分:1)

执行此操作的有效方法是使用哈希表(Java中的HashMap)。算法是:

foreach element of the smallest array (1) O(N)
  add element to the hash table       (2) O(1)

foreach element of the biggest array  (3) O(M)
  if element is in the hash table     (4) O(1)
    print element

每个步骤的时间复杂度在上面的伪代码中注释。

  • 迭代X大小数组的元素,时间复杂度为O(X),内存复杂度恒定(元素大小)
  • 在哈希表中插入元素具有恒定的时间和空间复杂度
  • 检查元素是否在哈希表中具有恒定的时间和空间复杂度

因此整体时间复杂度为O(N + M)空间复杂度为O(N)

请注意

  • 这种复杂性不受数组是否排序的影响
  • 此算法仅在您的最小数组适合内存时才有效
  • 最好使用最小的数组构建哈希表,因为它会减少内存中较小的哈希表

希望有所帮助!

答案 1 :(得分:0)

我假设您要使用$ O(1)$额外内存,否则,您可以使用哈希表解决$ O(a + b)$中的任何问题(已排序或未排序) 。此外,我将假设每个数组中的元素都是唯一的,但如果不是,则可以很容易地修改算法。

如果两者都未排序,您实际上可以通过简单地对其中一个数组进行排序来改进您的方法,然后使用下面的方法。这给出了$ O((a + b)\ min(\ lg a,\ lg b)$。

如果a未排序且b已排序,您可以迭代a中的所有元素,并使用binary search检查它们是否在b中。这给出了$ O(b + a \ lg b)$方法。

如果两者都已排序,您可以通过使用简单的双指针算法(连续增加两个数组上的索引)轻松获得$ O(a + b)$。