在排序和未排序数组中查找公共元素的大 O
Big-O of finding common elements in sorted and unsorted arrays
在打印出两个数组中的公共元素时,很难掌握大 O。一个尺码a,另一个尺码b.
我知道两个未排序的数组是O(ab)
但是当 a 未排序而 b 已排序时呢?
何时都排序?
任何解释都很好。
我假设您想使用 $O(1)$ 额外内存,否则,您可以通过使用散列 table。此外,我将假设每个数组中的元素都是唯一的,但如果不是,则可以轻松修改算法。
如果两者都未排序,实际上您可以改进您的方法,只需对其中一个数组进行排序,然后使用下面的方法。这给出 $O((a+b)\min(\lg a, \lg b)$.
如果 a 未排序而 b 已排序,您可以迭代 a 中的所有元素,并使用 binary search 检查它们是否在 b 中。这给出了一个 $O(b + a\lg b)$ 方法。
如果两者都已排序,您可以使用简单的双指针算法轻松获得 $O(a + b)$(连续递增两个数组上的索引)。
一个有效的方法是使用散列table(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) 的时间复杂度和恒定的内存复杂度(元素的大小)
- 在散列中插入一个元素 table 具有常数时间和 space 复杂度
- 检查元素是否在散列中 table 具有常数时间和 space 复杂性
所以整体时间复杂度为O(N + M),space复杂度为O(N) ]
注意
- 这个复杂度不受数组是否排序的影响
- 只有当您的最小数组可以放入内存时,此算法才有效
- 最好使用最小的数组构建散列table,因为它会在内存中减少一个较小的散列table
希望对您有所帮助!
在打印出两个数组中的公共元素时,很难掌握大 O。一个尺码a,另一个尺码b.
我知道两个未排序的数组是O(ab)
但是当 a 未排序而 b 已排序时呢?
何时都排序?
任何解释都很好。
我假设您想使用 $O(1)$ 额外内存,否则,您可以通过使用散列 table。此外,我将假设每个数组中的元素都是唯一的,但如果不是,则可以轻松修改算法。
如果两者都未排序,实际上您可以改进您的方法,只需对其中一个数组进行排序,然后使用下面的方法。这给出 $O((a+b)\min(\lg a, \lg b)$.
如果 a 未排序而 b 已排序,您可以迭代 a 中的所有元素,并使用 binary search 检查它们是否在 b 中。这给出了一个 $O(b + a\lg b)$ 方法。
如果两者都已排序,您可以使用简单的双指针算法轻松获得 $O(a + b)$(连续递增两个数组上的索引)。
一个有效的方法是使用散列table(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) 的时间复杂度和恒定的内存复杂度(元素的大小)
- 在散列中插入一个元素 table 具有常数时间和 space 复杂度
- 检查元素是否在散列中 table 具有常数时间和 space 复杂性
所以整体时间复杂度为O(N + M),space复杂度为O(N) ]
注意
- 这个复杂度不受数组是否排序的影响
- 只有当您的最小数组可以放入内存时,此算法才有效
- 最好使用最小的数组构建散列table,因为它会在内存中减少一个较小的散列table
希望对您有所帮助!