为什么最优先级/堆队列实现为0是最高优先级?我假设我错过了一些关键的数学原理。当我最近实现自己的优先级队列时,如果优先级上升了整数值,那么编写插入函数似乎更容易,但显然比我更聪明的人认为应该采用另一种方式。
有什么想法吗?
答案 0 :(得分:13)
大多数优先级队列都是以fibonacci heap或类似的方式实现的。该数据结构支持在恒定时间内提取最小值,这使得将0作为最高优先级自然,并通过提取最小值将元素从队列中取出。
答案 1 :(得分:6)
如果它不断增加,您怎么能将任何东西设置为最高优先级? (rossfab回答+1)
答案 2 :(得分:4)
它通常是另一种方式的原因是优先级队列用于实现像Dijkstra和A *这样的算法,其中优先级是到节点的距离,并且您希望首先处理更近的节点。
答案 3 :(得分:2)
我认为没有任何设计理由。这可能只是因为大多数程序员习惯于将0视为第一个元素。另一个原因可能是因为枚举数从0开始,所以第一个定义的枚举“最高”整数值将为0。
答案 4 :(得分:2)
作为一个反例,肯定是最容易获得的(如果没有使用的)优先级队列实现之一,即STL的std::priority_queue
,top()
元素是数字上最高的那个根据operator<
。当然,每个人都习惯于排序顺序最低的约定在队列前面,所以这会在他们第一次使用它时捕获很多人。
答案 5 :(得分:0)
优先级队列没有什么固有的优势,使0成为最高优先级的更好选择。但是,对于编写可重用实现的人来说,无论您使用什么类型的整数或浮点值作为优先级,都必须选择一些东西,并且0定义得很好。
即使在编写私有实现时,如果您决定只需要256个优先级并使用unsigned char作为优先级并且255是您的首要任务,那么如果您决定使用,则需要仔细查看所有代码你需要更多关卡。