如何让优先级队列重新排序

时间:2014-11-18 22:56:45

标签: java priority-queue

我有一个优先级队列,用于跟踪员工列表,它用于在开始时排序的比较器按当前“邀请值”对其进行排序。所以我想选择最大邀请值Employee,邀请他然后重新选择下一个最大邀请值员工。棘手的部分是,在我邀请某个员工之后,它会影响列表中其他一些员工的邀请价值。我试过以下

PriorityQueue<Employee> leafs = new PriorityQueue<>();
//populating the queue happens here

while(!leafs.isEmpty()){

Employee maxLeaf = leafs.peek();
        int maxValue = maxLeaf.getInviteValue();

        maxLeaf.invite();
        totalValue += maxValue;
        k--;

        for(Employee e : leafs){
            if(e.invValueChanged){
                leafs.remove(e);
                leafs.add(e);
            }
        }
}

每位员工都会通过查看它的invValueChanged字段来了解是否需要根据上次邀请重新计算其值。此代码给我一个优先级队列错误

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.PriorityQueue$Itr.next(PriorityQueue.java:535)

1 个答案:

答案 0 :(得分:2)

这里的问题是,您需要更改数据结构中的其他元素。

你不能只迭代它们,并对它们进行操作,这将改变元素的排序。

执行此操作的最佳方法是创建当前结构的向量,对向量执行操作,然后重新插入它们。

如果速度让您感到困扰,此操作与您编写的代码具有相同的时间复杂度。

在优先级队列中插入一个元素,需要O(log(n))时间,这样做n次,所以你得到O(n log(n))时间。

从priory队列中制作一个向量需要O(n),time。从向量插入优先级队列中的所有元素,需要O(n log(n))时间。

所以速度应该是渐近相同的。 真正的速度也应该非常接近。