带范围查询的优先级队列

时间:2013-09-01 22:38:58

标签: algorithm data-structures priority-queue

假设每个对象都具有以下形式:(键,优先级),即(0,3),(5,7)。 假设您有两个数字,x和y。 您将使用什么数据结构来返回键在x和y之间的最高优先级对象? 我认为优先级队列可以是一个很好的解决方案,但我不知道如何修改它以返回给定范围内的最高优先级对象。

2 个答案:

答案 0 :(得分:3)

从二叉搜索树开始,向每个节点添加两个字段:优先级和(指向)子树中最高优先级节点(有关如何执行此增强的更多信息,请参阅CLRS第14章)。

现在,要进行范围查询,请正常启动搜索,直到当前节点的键位于范围内。检查该节点,并使用以下过程的对称变体来标识包含范围中最高优先级节点的O(log n)候选,即当前节点的左右子树。以下过程适用于左子树。

如果根位于范围内,请将其视为最高优先级,并将其右侧子树中的最高优先级节点(缓存在节点中)视为最高优先级。继续使用左子树。如果根不在范围内,请继续使用正确的子树。

答案 1 :(得分:2)

此问题称为RMQ(范围最小/最大查询)。

在您的案例中使用的最佳数据结构是Segment Tree

这是一个艰难的结构,第一次正确,但继续尝试:这解决了你的问题。