scala - 在我的算法中替换命令式 PriorityQueue

标签 scala priority-queue sortedset declarative-programming

我目前有一种方法使用 scala.collection.mutable.PriorityQueue 按特定顺序组合元素。例如代码看起来有点像这样:

 def process[A : Ordering](as: Set[A], f: (A, A) => A): A = {
   val queue = new scala.collection.mutable.PriorityQueue[A]() ++ as
   while (queue.size > 1) {
     val a1 = queue.dequeue
     val a2 = queue.dequeue
     queue.enqueue(f(a1, a2))
   }
   queue.dequeue
 }

代码按编写的方式工作,但必须非常必要。我考虑过使用 SortedSet 而不是 PriorityQueue,但我的尝试使该过程看起来更加困惑。什么是做我想做的事情的更明确、更简洁的方式?

最佳答案

如果 f 不生成 Set 中已有的元素,您确实可以使用 SortedSet。 (如果是这样,您需要一个不可变的优先级队列。)执行此操作的声明方式是:

def process[A:Ordering](s:SortedSet[A], f:(A,A)=>A):A = {
  if (s.size == 1) s.head else {
    val fst::snd::Nil = s.take(2).toList
    val newSet = s - fst - snd + f(fst, snd)
    process(newSet, f)
  }
}

关于scala - 在我的算法中替换命令式 PriorityQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738219/

相关文章:

斯卡拉错误 : "forward reference extends over definition of value" when code appears in a function

scala - case语句中的类型推断失败

scala - 在 for 表达式中对 Slick 查询结果进行排序

scala - 如何将 `andThen` Akka `Receive` s?

redis - 如何在 Redis 中创建一个顺序为 "field1 desc, field2 asc"的有序集合?

.net - 为什么 SortedDictionary<K, V>.GetEnumerator O(log n) 但 SortedSet<T>.GetEnumerator O(1)?

c++ - std::priority_queue 中具有相同优先级的元素的顺序

c - 结构数组 - C 中的内存释放

java - 如何在 java 中使用基本方法实现通用 PriorityQueue?

Redis:当插入的元素在开头或结尾时,ZADD 是否优于 O(logN)?