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

Arrays 排序列表的排序数组上操作的时间复杂性,arrays,time-complexity,heap,theory,Arrays,Time Complexity,Heap,Theory,我有一个由N个元素组成的排序数组,这些元素均匀分布在K个列表中,也被排序。以下各项的时间复杂度是多少(以最严格的大O表示法): 删除最小的元素 移除最小元素后重新调用数组 删除所有N元素 对于第一部分,我认为答案是O(1),因为最小的元素是第一个元素。但是它所包含的列表不一定是第一个列表,所以我不确定 对于第二部分,我不确定(可能是O(NK)?) 对于第三部分,它必须是O(N),因为我们要遍历整个数组,但是,同样,我不确定这取决于你所说的“K个列表也被排序”的意思 如果数字随机分布在K个列表中,

我有一个由N个元素组成的排序数组,这些元素均匀分布在K个列表中,也被排序。以下各项的时间复杂度是多少(以最严格的大O表示法):

  • 删除最小的元素
  • 移除最小元素后重新调用数组
  • 删除所有N元素
  • 对于第一部分,我认为答案是
    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]