【问题标题】:Time complexity for N insert operations in a sorted array排序数组中 N 次插入操作的时间复杂度
【发布时间】:2017-11-13 16:23:40
【问题描述】:

如果我们有一个包含 N 个元素的排序数组,并且我们希望执行 N 个插入操作,那么最佳方法的最坏情况时间复杂度应该是多少?

我认为它应该是 O(N log(2N)) 因为我们可以直接在排序数组的末尾插入 N 个元素。在所有插入之后,我们将有 2N 个元素,我们可以对整个 2N 数组执行稳定的排序算法,这需要 O(2N log(2N)) ~ O(N log(2N))

所以,总共 = N 次插入 + 排序 = O(N + 2N log(2N)) = O(N log(2N))

但是在我看到相关概念的任何地方,它都被给出为 O(N^2),因为它们通过在排序后的数组之间为每次插入留出空间来保持数组在每次插入之后排序!

我的方法错了吗?我们是否必须在每次插入后保持排序数组的排序?如果是,那么这个“在每次操作后保持数据结构不变,而不是在一系列相同的操作后保持不变”规则对所有数据结构都有效吗?!

【问题讨论】:

  • 我们是否必须在每次插入后保持排序后的数组排序?我不知道。要求说什么?而且,不,并非所有有序数据结构都具有相同的规则。例如,平衡二叉搜索树允许您在 O(log n) 中进行插入。

标签: arrays data-structures time-complexity


【解决方案1】:

取决于你需要什么。

如果您需要在每次插入后进行一些操作,那么O(n^2) 是标准的(找到正确的位置O(lgn) 和移动元素O(n))。

如果您不需要在插入之间做任何事情,则在末尾插入所有元素并在O(nlgn) 中排序,这样整个操作需要O(nlgn)(假设在末尾插入需要O(1) 时间)。

顺便说一句,它将是O(nlg(n)),因为O(nlg(2n)) = O(nlgn + nlg(2)) = O(nlgn + n) = O(nlgn)

【讨论】:

  • "如果每次插入后都需要做一些操作,那么 O(n^2) 是标准的(找到正确的点 O(lgn) 和移位元素 O(n))。这听起来不对。如果您是一个 O(logn) 操作后跟一个 O(n) 操作,那不应该是 O(n * logn) 而不是 O(n^2) 吗?
猜你喜欢
  • 2021-05-30
  • 2022-11-23
  • 2013-11-18
  • 2021-03-05
  • 2011-09-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多