如果我们有一个包含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),因为它们保持数组在每次插入后排序,为排序数组之间的每个插入创建空间!
我的方法有误吗?我们是否必须在每次插入后对排序的数组进行排序?如果是,那么这是否“在每次操作后保持数据结构相同,而不是在完成一系列相同操作后使其保持完整”规则对所有数据结构都有效?!
答案 0 :(得分:3)
取决于您的需求。
如果您需要在每次插入后执行某些操作,那么O(n^2)
是标准的(找到正确的位置O(lgn)
并转换元素O(n)
)。
如果您不需要在插入之间执行任何操作,请在末尾插入所有元素并在O(nlgn)
中排序,以便整个操作需要O(nlgn)
(假设在最后插入O(1)
O(nlg(n))
1}}时间)。
顺便说一句,它会O(nlg(2n)) = O(nlgn + nlg(2)) = O(nlgn + n) = O(nlgn)
,因为pwzBaseUrl: myProtocol:///webApp/app/index.html#/start
pwzRelativeUrl: views/start.html