【问题标题】:What is the time complexity to insert M elements in a singly circular ordered list?在单循环有序列表中插入 M 个元素的时间复杂度是多少?
【发布时间】:2020-03-14 14:13:59
【问题描述】:
On a singly circular ordered list having N elements and 
if M elements are to be inserted what will be the complexity of time?


a) O(M*N)

b) O(M*(M+N))

c) O((M+N) * log(M+N))

我认为,完成这项工作所花费的时间应该是O(N + M)。因为我们需要O(N) 来查找最后一个元素,而O(M) 需要在它之后插入所有元素,链接将采用O(1)


另外,我觉得Ordered 这个词有点混乱,是Sorted 还是Preserving Natural Ordering

如果Ordered 表示Preserving Natural Ordering,那么我认为O(N + M)

如果Sorted 那么O(N * M)

【问题讨论】:

  • 这个想法是,如果列表是有序的,在最坏的情况下,您需要遍历整个列表以在末尾插入每个元素。该列表将从 N 个元素开始并增长到 N+M 个元素。每次插入的平均长度为 N+M/2。您将遍历该长度 M 次。因此,遍历的总元素将大致为 M(M/2 + N),即 O(M*(M+N)) 时间。请注意,虽然问题的措辞不是很好,但似乎他们要求时间来完成所有 M 插入,而不是每次插入(摊销)。每次插入的摊销时间需要除以 M:O(M+N)。
  • 感谢@Gene。但我没有得到“每次插入的平均长度为 N+M/2”。部分。你能解释一下吗?
  • 准确来说,要到达链表的末尾,第一次插入会遍历一个长度为N的链表,第二个N+1,然后N+2,以此类推直到N+M .总结所有这些。通过众所周知的身份,您将得到 MN + M(M+1)/2。这些的平均值是 M(N + (M+1)/2) / M = N + (M+1)/2。正如我所说,这非常接近 N+M/2。

标签: linked-list time-complexity insertion circular-list


【解决方案1】:

这看起来像一个排序的情况,而不是“保留自然排序”,我们将计算插入的完整操作的频率(所有 m 个元素),因此 O(M*N) 似乎是如果我们假设 N 的值远高于 M

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多