【问题标题】:What is the time complexity of the heapq.merge in python?python中heapq.merge的时间复杂度是多少?
【发布时间】:2019-02-18 04:18:40
【问题描述】:

我读到 heapq.merge 函数专门用于合并 2 个排序数组?时间复杂度是 O(n)?如果不是,那是什么,为什么?还有它的空间复杂度是多少。

我正在解决用 2 个指针合并 2 个排序数组的问题,并且可以实现 O(n) 时间复杂度和 O(n) 空间复杂度。

【问题讨论】:

  • 我认为是 O(nlogn)。如果列表有 n 个元素,则合并一个元素的复杂度为 O(logn)。要合并所有元素,O 是 nlogn。
  • 我认为@Jidnyasa Babar 是正确的,它 heapq.merge 是 O(n) 时间复杂度。只需尝试以下代码你就会明白: from heapq import merge; a = [1,3,4]; b = [10,9,8];打印(列表(合并(a,b)));然后你会得到 [1, 3, 4, 10, 9, 8],merge 只会选择并“弹出”每个数组左侧的当前最小操作,它无助于排序,所以时间复杂度是O(K * X) K是数组的个数,X是每个数组的平均元素个数,我们也可以简化为O(N)

标签: python time-complexity heapq


【解决方案1】:

如果你正在合并 K 个排序的数组并且每个数组有 N 个元素,那么 heapq.merge 将以 NK(logK) 的时间复杂度执行操作。因为 NK 是所有 K 个数组中元素的总数,并且每个元素都必须进行比较。而 logK 是从堆顶(也就是堆的高度)开始的冒泡操作的时间复杂度。

在你的情况下,K=2,log(2) = 1。所以在你的特殊情况下,它是 O(n)

【讨论】:

    【解决方案2】:

    heapq.merge 可用于合并任意数量的排序迭代。它的时间复杂度为O(NlogK),其中N 是元素的总数,而K 是输入minheap 进行比较的项目。

    空间复杂度为O(K),因为minheap 在执行期间的任何给定时间点都有K 项。

    【讨论】:

    • 错误。请尝试以下代码: from heapq import merge; a = [1,3,4]; b = [10,9,8];打印(列表(合并(a,b)));然后你会得到 [1, 3, 4, 10, 9, 8],merge 只会选择并“弹出”每个数组左侧的当前最小操作,它无助于排序,所以时间复杂度是 O(K * X) K 是数组的个数,X 是每个数组中元素的平均数,我们也可以将其简化为 O(N),这意味着这个问题是正确的。
    • @MingweiHe 这个问题谈到了合并排序集合,即两个排序数组。因此 a = [1,3,4]; b = [8, 9, 10] 当传递给 merge 时将产生 [1,3,4,8,9,10] 并且运行时间将如我上面解释的那样。
    • k 与 n 有何不同。不应该是 O(nlogn) 吗?
    • 那么,最后 heapq.merge 的正确时间复杂度是多少?
    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2014-05-27
    相关资源
    最近更新 更多