我有N个元素的排序数组,这些元素均匀分布在K个列表中,并且也进行了排序。
的时间复杂度(最严格的Big-O表示法)将是什么?对于第一部分,我认为答案是O(1)
,因为最小的元素是第一个元素。但是,它所包含的列表不一定是第一个列表,因此我不确定。
对于第二部分,我不确定(也许是O(NK)
?)
对于第三部分,由于我们要遍历整个数组,因此必须为O(N)
,但是我不确定
答案 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)用于访问每个列表的费用。