【问题标题】:What's the difference between priority queue(=heap) and sorting?优先队列(=堆)和排序有什么区别?
【发布时间】:2022-01-26 04:47:00
【问题描述】:

406. Queue Reconstruction by Height
以上问题的最佳答案是这样的。

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        heap = []
        for person in people:
            heapq.heappush(heap, (-person[0], person[1]))

        result = []
        while heap:
            person = heapq.heappop(heap)
            result.insert(person[1], [-person[0], person[1]])
        return result

上述方法是优先队列方法。

另一方面,使用排序的方法是这样的。

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key = lambda x:(x[0],-x[1]))
        result = []
        while people:
            person = people.pop()
            result.insert(person[1], [person[0],person[1]])
        return result

big-O 类似。 但我不知道为什么我们应该使用更复杂的优先级队列。优先队列相对于排序有什么优势?

【问题讨论】:

  • 这里没有真正的理由使用优先队列。 (如果这些解决方案中的 任何一个 是渐近最优的,我会感到惊讶。这些都是最坏情况 O(n^2),而且似乎 O(n log n) 解决方案应该是可能的。 )
  • “但我不知道为什么我们应该使用更复杂的优先级队列。” 这个问题有一个谬误;您假设管理优先级队列比运行排序算法更“复杂”。首先,不清楚在这种情况下“复杂”是什么意思。第二,你听说过堆排序吗?这是一种相对简单的排序算法,它依赖于优先级队列。相比之下,我会说 Timsort(这是在 python 中使用 list.sort 时调用的算法)比 heapsort 更“复杂”。
  • 在评论(回答)中,您提到您有一个insert 操作。这将使一切变得不同。如果是这种情况,我建议您在问题中添加该信息(带有代码),因为这对于回答问题至关重要。
  • @Stef 我认为list.sort 是一个直观而简洁的代码。我不明白堆排序更简单。

标签: python algorithm sorting priority-queue heap


【解决方案1】:

在这种情况下,差别不大。

优先级队列的使用和对.sort() 的调用本质上是相同的——它们按照高度值的递减顺序对要处理的元素进行排序。

正如评论所指出的,运行时由对.insert() 的调用支配。插入到列表中的任意索引需要最坏情况下的线性时间,并且通过 n 次插入,您的代码将在 O(n^2) 时间内运行。因此,在这种情况下,对元素进行排序的机制并不重要(就渐近性能而言)。

【讨论】:

  • 所以优先级队列和对齐没有区别。我得想办法替换insert()。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2014-03-05
  • 2023-03-28
  • 2012-11-01
  • 1970-01-01
  • 2019-06-10
  • 2011-11-10
  • 2014-06-11
相关资源
最近更新 更多