【问题标题】:Time complexity of operations on a sorted array of sorted lists排序列表的排序数组上的操作的时间复杂度
【发布时间】:2019-02-04 23:00:53
【问题描述】:

我有一个 N 个元素的排序数组,它们平均分布在 K 个列表中,该列表也已排序。以下情况的时间复杂度(以最严格的 Big-O 表示法)是多少:

  1. 删除最小的元素。
  2. 删除最小元素后重新排序数组。
  3. 删除所有 N 个元素

对于第一部分,我认为答案是O(1),因为最小的元素是第一个元素。但它所在的列表不一定是第一个列表,所以我不确定。

对于第二部分,我不确定(可能是O(NK)?)

对于第三部分,它必须是 O(N),因为我们要遍历整个数组,但我再次不确定

【问题讨论】:

  • 老实说,这听起来像是一个 comp sci 作业问题。没关系,但您可能会在 cs.se 上找到更好的答案。
  • "但它所属的列表不一定是第一个列表" - 为什么不呢?
  • 我的意思是它可以是第一个列表,但它不是必须是第一个列表

标签: arrays time-complexity heap theory


【解决方案1】:

具体示例帮助。假设您有三个列表(数组):

[7, 11, 15]
[3, 12, 19]
[2, 4, 6]

删除最小的项目需要您先找到它。各个列表是有序的,但列表的列表不是。找到最小的项目需要 O(K) 时间,因为您必须对列表列表进行顺序扫描。

一旦您找到了最小的项目,将需要 O(m) 时间(其中 m 是包含最小项目的列表的大小)来删除它。原因是当您从列表中删除第一个项目时,所有其他项目都必须向上移动。那就是:

[2, 4, 6] 变成 [_, 4, 6],然后你必须向上移动以生成 [4, 6, _]。 (_ 表示 null,或者您用来表示“无价值”的任何标记值。)

我想你可以说移除是 O(1),然后重新排序数组是 O(m)。

您可以在 O(N) 时间内删除所有元素,前提是您不关心删除它们的顺序。如果要按排序顺序删除所有元素,则复杂度为 O(n * K),因为每次都必须找到最小的元素。您可以通过实现 K 路合并将其提高到 O(n * log(K)),但代价是 O(K) 额外内存。

【讨论】:

  • 这个例子很有帮助!我现在明白我哪里出错了
【解决方案2】:

这取决于您说“K 列表 [也是] 也已排序”时的意思。

如果数字随机分布在K个列表中,但每个K个列表本身都是排序的,那么查看所有列表的头部需要O(K)时间识别最小的元素。但是,如果在 K 个列表之间划分数字,则可以对 K 个列表 A,B,C,... 进行排序,使得 A0,那么找到最小元素需要 O(1) 时间,因为您知道它位于第一个列表的开头。

删除数组的最小或最大元素会保留现有的排序顺序,因此这需要时间O(1)

“删除”所有元素所需的时间取决于您的计算模型。如果删除算作简单地处理整个数据结构,则可能需要 O(1) 时间。但是,如果每个元素都需要单独清理,则将花费 O(N+K) 时间:O(N) 用于访问每个元素的成本和 O(K) 访问每个列表的成本。

【讨论】:

  • 列表中的数字已排序,即第一个元素小于第二个,第二个小于第三个等。
  • 从大小为 m 的列表中删除最小元素可能需要 O(m) 时间,因为列表中的所有其他项目都必须向上移动以填充空白点。那是如果列表被实现为一个数组,或者带有一个支持数组。如果是链表,那么删除当然是 O(1)。
  • @JimMischel:很好。但是,如果您不需要维护不变量,则可以通过以 O(K) 保持指向向量头的指针来减少到 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2021-03-05
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多