繁体   English   中英

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

[英]Time complexity of operations on a sorted array of sorted lists

我有N个元素的排序数组,这些元素均匀分布在K个列表中,该列表也已排序。 以下内容的时间复杂度(最严格的Big-O表示法)将是什么?

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

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

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

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

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

[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)额外的内存为代价。

这取决于您说“ 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)表示访问每个元素的成本, O(K)表示访问每个列表的成本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM