【问题标题】:Time complexity of merging k sorted arrays合并k个排序数组的时间复杂度
【发布时间】:2020-04-29 15:31:11
【问题描述】:

我有 k 个排序数组,每个长度为 n,我想对它们进行排序,所以有一个长度为 n*k 的排序数组。我知道我可以从 Merge Sort 迭代地应用合并功能。但是我不明白为什么下面的代码是 O(nk^2) 而不是 O(nk)。我在 k 数组上迭代一次,每个合并子例程相对于其输入具有线性时间。我哪里错了?如何更好地理解该算法的运行时间?

def myMerge(left, right):
    l, r = 0, 0
    result = []
    for i in left+right:
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
            if l >= len(left):
                return result + right[r:]
        else:
            result.append(right[r])
            r += 1
            if r >= len(right):
                return result + left[l:]
    return result

#input
k = [[1,5,8],[2,7,9],[1,1,4]]

result = k[0]
for l in range(1,len(k)):
    result = myMerge(result,k[l])  

【问题讨论】:

    标签: python arrays algorithm


    【解决方案1】:

    你的两个句子都是正确的:

    • 你遍历 k 数组一次
    • 每个合并子例程相对于其输入具有线性时间

    但是,答案是 O(nk^2)。为什么?

    因为上述输入的长度不是O(n)。在第一个循环之后它已经是 2*n。在第二个之后,它已经是 3*n。等等。因此,在最后一次迭代中,您的数组长度为 n*(k-1) 和 n,这意味着每个合并子例程为 O(nk),因此整个算法为 O(n*k^2)

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 2022-11-23
      • 1970-01-01
      • 2012-05-07
      • 2016-11-19
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多