【发布时间】:2010-10-18 20:25:02
【问题描述】:
为什么大多数优先级/堆队列实现为 0 是最高优先级?我假设我错过了一些关键的数学原理。当我最近在实现自己的优先级队列时,如果优先级随整数值上升,编写插入函数似乎更容易,但显然比我聪明的人认为它应该采用另一种方式。
有什么想法吗?
【问题讨论】:
标签: c++ algorithm data-structures queue
为什么大多数优先级/堆队列实现为 0 是最高优先级?我假设我错过了一些关键的数学原理。当我最近在实现自己的优先级队列时,如果优先级随整数值上升,编写插入函数似乎更容易,但显然比我聪明的人认为它应该采用另一种方式。
有什么想法吗?
【问题讨论】:
标签: c++ algorithm data-structures queue
大多数优先级队列都以fibonacci heap 或类似的形式实现。该数据结构支持在恒定时间内提取最小值,这使得将0设为最高优先级并通过提取最小值将元素从队列中取出是很自然的。
【讨论】:
O(log(n))时间。这是非常基本的;否则您可以使用该堆来创建O(n) 排序算法。斐波那契堆(相对于简单的二叉堆)的性能优势在于其他操作,而不是这两个标准操作。
如果它一直在增加,你怎么能将任何东西设置为最高优先级? (+1 为 rossfab 的回答 :)
【讨论】:
通常是另一种方式的原因是优先级队列用于实现像 Dijkstra 和 A* 这样的算法,其中优先级是到节点的距离,并且您希望首先处理更近的节点。
【讨论】:
我认为没有任何设计原因。这可能只是因为大多数程序员习惯于将 0 视为第一个元素。另一个原因可能是因为枚举数从 0 开始,所以第一个定义的枚举“最高”整数值为 0。
【讨论】:
作为一个反例,在肯定是最容易获得(如果不使用)的优先级队列实现之一,即 STL 的std::priority_queue 中,top() 元素是数值上最高的元素operator<。当然,每个人都习惯于将最低排序顺序排在队列前面的约定,所以这会在他们第一次使用时吸引很多人。
【讨论】:
优先级队列本身并没有使 0 成为最高优先级的更好选择。然而,对于编写可重用实现的人来说,您将不得不选择一些东西,并且无论您使用哪种类型的整数或浮点值作为优先级,0 都是明确定义的。
即使在编写私有实现时,如果您决定只需要 256 个优先级并使用 unsigned char 作为您的优先级,并且将 255 作为您的最高优先级,那么您需要仔细查看所有代码,如果您决定你需要更多关卡。
【讨论】: