python中的heapq.merge是如何工作的

时间:2016-02-13 05:03:34

标签: python heap

heapq.merge()如何在不生成列表的情况下对列表进行排序?

不确定我是否说清楚 所以,这是从 Super Ugly Number problem at leetcode

这个python代码

class Solution(object):
def nthSuperUglyNumber(self, n, primes):
    """
    :type n: int
    :type primes: List[int]
    :rtype: int
    """
    uglies = [1]
    def gen(prime):
        for ugly in uglies:
            yield ugly * prime
    merged = heapq.merge(*map(gen, primes))
    while len(uglies) < n:
        ugly = next(merged)
        if ugly != uglies[-1]:
            uglies.append(ugly)
    return uglies[-1]

让我很难理解它。在我搜索了“yield”和“heapq”的概念之后,我仍然没有在while循环中得到它,merged知道ugly in uglies>n不会小于{{uglies[n-1] 1}}。

2 个答案:

答案 0 :(得分:0)

需要n 已经排序的迭代。然后,它可以查看每个中的最小值并使用它。最小的一个始终是第一个项目,然后是第二个项目,然后是第三个项目,因为它们都是排序的。

答案 1 :(得分:0)

heapq.merge的实现是纯Python,如果需要,可以直接read its code

正如您可能从其实现的模块中猜到的那样,它使用堆来合并它传递的迭代。如果迭代(在这种情况下为生成器)按顺序产生它们的值,它将组合它们,以便它产生的值也是有序的。它不会消除重复值,这就是您显示的代码检查最新值是否等于前一个值的原因。