我有一个优先级队列,用于跟踪员工列表,它用于在开始时排序的比较器按当前“邀请值”对其进行排序。所以我想选择最大邀请值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)
答案 0 :(得分:2)
这里的问题是,您需要更改数据结构中的其他元素。
你不能只迭代它们,并对它们进行操作,这将改变元素的排序。
执行此操作的最佳方法是创建当前结构的向量,对向量执行操作,然后重新插入它们。
如果速度让您感到困扰,此操作与您编写的代码具有相同的时间复杂度。
在优先级队列中插入一个元素,需要O(log(n))时间,这样做n次,所以你得到O(n log(n))时间。
从priory队列中制作一个向量需要O(n),time。从向量插入优先级队列中的所有元素,需要O(n log(n))时间。
所以速度应该是渐近相同的。 真正的速度也应该非常接近。