Arrays 排序列表的排序数组上操作的时间复杂性
我有一个由N个元素组成的排序数组,这些元素均匀分布在K个列表中,也被排序。以下各项的时间复杂度是多少(以最严格的大O表示法):Arrays 排序列表的排序数组上操作的时间复杂性,arrays,time-complexity,heap,theory,Arrays,Time Complexity,Heap,Theory,我有一个由N个元素组成的排序数组,这些元素均匀分布在K个列表中,也被排序。以下各项的时间复杂度是多少(以最严格的大O表示法): 删除最小的元素 移除最小元素后重新调用数组 删除所有N元素 对于第一部分,我认为答案是O(1),因为最小的元素是第一个元素。但是它所包含的列表不一定是第一个列表,所以我不确定 对于第二部分,我不确定(可能是O(NK)?) 对于第三部分,它必须是O(N),因为我们要遍历整个数组,但是,同样,我不确定这取决于你所说的“K个列表也被排序”的意思 如果数字随机分布在K个列表中,
O(1)
,因为最小的元素是第一个元素。但是它所包含的列表不一定是第一个列表,所以我不确定
对于第二部分,我不确定(可能是O(NK)
?)
对于第三部分,它必须是
O(N)
,因为我们要遍历整个数组,但是,同样,我不确定这取决于你所说的“K个列表也被排序”的意思
如果数字随机分布在K个列表中,但K个列表中的每个列表本身都已排序,则需要O(K)个时间来查看所有列表的头部,以确定最小的元素。然而,如果数字在K个列表之间划分,使得K个列表A、B、C,。。。可以订购A0具体示例帮助。假设您有三个列表(数组): 删除最小的项目需要首先找到它。单个列表是有序的,但列表列表不是有序的。找到最小的项目需要O(K)时间,因为您必须对列表列表进行顺序扫描 一旦您找到最小的项,将需要O(m)时间(其中m是包含最小项的列表的大小)来删除它。原因是当您从列表中删除第一项时,所有其他项都必须向上移动。即:
[2,4,6]
变成了[\uu4,6]
,然后你必须把东西向上移动,使之成为[4,6,u6]
。(表示null,或表示“无值”的任何哨兵值。)
我想你可以说移除是O(1),然后对数组重新排序是O(m)
您可以在O(N)时间内删除所有元素,前提是您不关心删除它们的顺序。如果要按排序顺序删除所有元素,那么复杂性为O(n*K),因为每次都必须找到最小的元素。您可以通过实现K路合并将其改进为O(n*log(K)),而代价是O(K)额外的内存。老实说,这听起来像是一个comp-sci作业问题。这很好,但你可能会在上面找到更好的答案。“但它所属的列表不必是第一个列表”-为什么不?我的意思是它可以是第一个列表,但它不是第一个列表的强制条件列表中的数字是按顺序排列的,即第一个元素小于第二个元素,第二个比第三个小,以此类推。从大小为m的列表中删除最小的元素可能需要O(m)个时间,因为列表中的所有其他项目都必须上移以填充空白点。如果列表实现为一个数组,或者使用一个支持数组,则会出现这种情况。如果它是一个链表,那么删除当然是O(1)。@JimMischel:很好。不过,如果不需要保持不变量,可以通过以O(K)为代价保留指向向量头的指针,将其减少到O(1)!我知道我现在错在哪里了
[7, 11, 15]
[3, 12, 19]
[2, 4, 6]