【问题标题】:what would be the best case scenario of merging two sorted array?合并两个排序数组的最佳情况是什么?
【发布时间】:2015-04-30 02:58:34
【问题描述】:

我知道合并两个排序数组需要 O(m+n) 时间,其中 m 和 n 是两个数组的长度。

最大比较次数为 (m+n-1)。

但是我学校的一位老师说,只有平均和最坏的情况需要 O(m+n) 时间。最好的情况需要 O(1) 时间。

在这里,我无法理解最佳情况如何采用 O(1)。 请提及最佳情况以及回答时如何花费 O(1) 时间。

【问题讨论】:

  • 你确定他说的是数组而不是链表吗?
  • 是的..谈到了数组

标签: arrays merge time-complexity


【解决方案1】:

让我们首先考虑确定两个排序集中元素的正确顺序的最佳情况复杂性(不用担心它们是如何存储的)。

如果第一个集合中的最后一个元素小于第二个集合中的第一个元素,则只需进行一次比较即可确定正确的顺序。第二组只需要“附加”到第一组的末尾。 (大多数实现将从两个集合的前面开始,但您可以在排序开始时将其写为“特殊情况”检查。)

由于这种情况只需要一次比较,无论数组中的元素数量如何,在最佳情况下确定正确顺序是 O(1)。


现在,回到元素存储在数组中的问题......

在许多语言中,数组一旦创建就无法调整大小 - 合并两个数组需要分配第三个数组,该数组足够大以包含所有元素。如果是这种情况,您可以保证至少执行m + n 操作,因为您必须将所有元素复制到一个新数组中。

即使可以调整第一个数组的大小以容纳其他元素,所有这些元素仍然必须从第二个数组复制到第一个数组 - 这仍然是 n 操作。

因此,虽然可以通过恒定数量的比较来确定正确的顺序,但移动元素的工作量在最佳情况下仍会产生 O(n)。

【讨论】:

  • 感谢 BJ 迈尔斯。这意味着如果我们使用辅助数组,合并两个排序数组将没有 O(1) 时间复杂度。但我相信,如果我们使用链接列表,那么我们可以根据您的最佳情况实现 O(1) 复杂度。
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2020-09-26
  • 1970-01-01
  • 2013-05-04
  • 2017-09-28
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多