2
我有个优先级队列,其中包含多个任务,以数字非唯一的优先级每个任务有几率出列,如下所示:斯卡拉概率优先级队列 - 优先
import scala.collection.mutable
class Task(val name: String, val priority: Int) {
override def toString = s"Task(name=$name, priority=$priority)"
}
val task_a = new Task("a", 5)
val task_b = new Task("b", 1)
val task_c = new Task("c", 5)
val pq: mutable.PriorityQueue[Task] =
new mutable.PriorityQueue()(Ordering.by(_.priority))
pq.enqueue(task_a)
pq.enqueue(task_b)
pq.enqueue(task_c)
我想下一个任务:
pq.dequeue()
可是这样一来,我会永远回去任务,即使有也任务c具有相同的优先级。
- 如何随机获取其中一个具有最高优先级的项目?那是得到任务a或任务c,有50/50的机会。
- 如何随机获取任何项目,并根据优先级的概率?那是得到45%的任务a,10%的任务b和45%的任务c。
您可以根据轮盘选择算法订购优先级 –
我不知道Scala,但在许多语言中,我确实知道我会为优先级实现一个自定义比较器,将该选项随机化为二级排序标准否则这些优先事项将被视为平等。 – pjs
这看起来很有趣https://www.codatlas.com/github.com/apache/kafka/HEAD/core/src/main/scala/kafka/utils/timer/TimingWheel.scala –