排序列表的排序数组上操作的时间复杂度

时间:2019-02-04 23:00:53

标签: arrays time-complexity heap theory

我有N个元素的排序数组,这些元素均匀分布在K个列表中,并且也进行了排序。

的时间复杂度(最严格的Big-O表示法)将是什么?

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

[2, 4, 6]变成[_, 4, 6],然后您必须向上移动才能制作[4, 6, _]。 (_表示空值,或您用来表示“无值”的任何前哨值。)

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

您可以在O(N)时间内删除所有元素,只要您不关心以什么顺序删除它们即可。如果要按排序顺序删除所有元素,则复杂度为O(n * K),因为每次必须查找最小的元素。您可以通过实施K向合并来将其提高到O(n * log(K)),但会增加O(K)额外的内存。

答案 1 :(得分:0)

这取决于您说“ K个列表也已排序”的意思。

如果数字随机分布在K个列表中,但K个列表本身已排序,则需要 O(K)时间来查看所有列表的开头,确定最小的元素。但是,如果数字在K个列表之间划分,使得K个列表 A,B,C,... 可以排序为 A0 <= AN <= B0 <= BN <= C0 <= CN ... ,则需要花费 O(1)时间来找到最小的元素,因为您知道它位于第一个列表的开头。

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

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