2009-04-10 160 views
6

为什么最优先级/堆队列实现为0是最高优先级?我假设我错过了一些关键的数学原理。由于最近我正在实现自己的优先级队列,如果优先级与整数值一起写入插入函数似乎更容易,但显然人们比我更聪明,认为它应该以其他方式。为什么优先级队列大多使用0作为最重要的优先级?

任何想法?

回答

13

最优先级队列实现为类似fibonacci heap什么的。该数据结构支持在不变的时间内提取最小值,这使得自然而然的是使0成为最高优先级,并通过提取最小值将元素从队列中取出。

+0

学到新的东西。谢谢! – 2009-11-19 23:35:48

2

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

6

如果它是不断增加的,你怎么可能永远设置什么的最高优先级? (+1 rossfab的答案:)

2

作为一个反例,在什么肯定是最容易获得的一个(如果不使用)优先级队列实现,即STL的std::priority_queue,该top()元素是根据一个数值最高operator<。当然,每个人都习惯于排序顺序最低的排队顺序,因此在第一次使用它时会吸引很多人。

4

它往往是另一种方式是,优先级队列采用了类似的Dijkstra和A *,其中优先级的节点的距离算法,并且要首先处理更接近节点的原因。

0

没有什么内在的有关优先级队列,使0当务之急是更好的选择。然而,对于编写可重用实现的人来说,您将不得不挑选一些东西,而且无论您为优先级使用哪种类型的积分或浮点值,定义好的0都是明确的。

即使在编写私有实现时,如果您决定只需要256个优先级,并使用无符号字符作为优先级,并且255是您的首要任务,那么如果您决定要仔细查看所有代码你需要更多的水平。