【问题标题】:Why do priority queues mostly use 0 as the most important priority?为什么优先级队列大多使用 0 作为最重要的优先级?
【发布时间】:2010-10-18 20:25:02
【问题描述】:

为什么大多数优先级/堆队列实现为 0 是最高优先级?我假设我错过了一些关键的数学原理。当我最近在实现自己的优先级队列时,如果优先级随整数值上升,编写插入函数似乎更容易,但显然比我聪明的人认为它应该采用另一种方式。

有什么想法吗?

【问题讨论】:

    标签: c++ algorithm data-structures queue


    【解决方案1】:

    大多数优先级队列都以fibonacci heap 或类似的形式实现。该数据结构支持在恒定时间内提取最小值,这使得将0设为最高优先级并通过提取最小值将元素从队列中取出是很自然的。

    【讨论】:

    • 学到了一些新东西。谢谢!
    • 这具有误导性:我听说过的所有关于支持确定恒定时间最小值的堆;但是删除最小元素(从而导致第二小的元素成为新的最小值)总是需要O(log(n))时间。这是非常基本的;否则您可以使用该堆来创建O(n) 排序算法。斐波那契堆(相对于简单的二叉堆)的性能优势在于其他操作,而不是这两个标准操作。
    • 另外,这个答案甚至没有解决这个问题!斐波那契堆也可以支持在恒定时间内提取最大值——这只是一个约定。
    【解决方案2】:

    如果它一直在增加,你怎么能将任何东西设置为最高优先级? (+1 为 rossfab 的回答 :)

    【讨论】:

      【解决方案3】:

      通常是另一种方式的原因是优先级队列用于实现像 Dijkstra 和 A* 这样的算法,其中优先级是到节点的距离,并且您希望首先处理更近的节点。

      【讨论】:

        【解决方案4】:

        我认为没有任何设计原因。这可能只是因为大多数程序员习惯于将 0 视为第一个元素。另一个原因可能是因为枚举数从 0 开始,所以第一个定义的枚举“最高”整数值为 0。

        【讨论】:

          【解决方案5】:

          作为一个反例,在肯定是最容易获得(如果不使用)的优先级队列实现之一,即 STL 的std::priority_queue 中,top() 元素是数值上最高的元素operator<。当然,每个人都习惯于将最低排序顺序排在队列前面的约定,所以这会在他们第一次使用时吸引很多人。

          【讨论】:

            【解决方案6】:

            优先级队列本身并没有使 0 成为最高优先级的更好选择。然而,对于编写可重用实现的人来说,您将不得不选择一些东西,并且无论您使用哪种类型的整数或浮点值作为优先级,0 都是明确定义的。

            即使在编写私有实现时,如果您决定只需要 256 个优先级并使用 unsigned char 作为您的优先级,并且将 255 作为您的最高优先级,那么您需要仔细查看所有代码,如果您决定你需要更多关卡。

            【讨论】:

              猜你喜欢
              • 2011-12-25
              • 1970-01-01
              • 2016-09-23
              • 1970-01-01
              • 2022-07-20
              • 2011-12-20
              • 2012-06-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多