我有优先级队列,按一些值对元素进行排序(让我们为它命名)。我需要通过评级从队列中获取元素。所以我需要实现函数queue_get(rating)。此功能还可以提高优先级堆的评级。
但问题是堆的每个级别都没有按评级排序。每个级别的元素只满足堆属性。所以我不能肯定通过评级返回第N个元素。
是否有任何具有此类功能的优先级队列的实现? 我应该使用其他数据结构吗?
答案 0 :(得分:2)
最简单的解决方案是使用自平衡的二叉搜索树,例如AVL树,展开树或红黑树。它允许您在O(log n)时间内按键访问元素,并按O(log n + k)顺序遍历对象,其中k是迭代元素的数量。
答案 1 :(得分:0)
集合类通常会为您提供一些基于有序键的Map,例如java.util.TreeMap或C ++ std :: map。使用此功能,您可以按排序顺序检索项目 - 如果课程按递增顺序为您提供项目,则可能必须反转顺序。如果您只想阅读前N项,那么这对您来说应该足够了。
如果您想随机访问第N个最高项,可以通过使用每个节点下面的项目数注释树数据结构来完成,但我不知道有一个广泛可用的类库可以为您提供此功能。 / p>
想想看,如果您只是想按顺序检索N个最高项目,如果您准备在读出它们时删除这些项目,可以使用优先级队列执行此操作 - 稍后再将它们放回去如果你需要恢复原始内容。