将优先级队列中的元素移动到较低级别

时间:2014-11-13 18:19:58

标签: functional-programming queue priority-queue sml smlnj

我有一个多级优先级队列,它实现为(level:int,priority:int,' a)的列表。数据类型如下所示:

datatype 'a queue = NONE | Q of (int * int * 'a) list;

较低级别的元素位于队列的前面。同级别的元素根据优先级排序。我有一个入队功能

因此,如果现有队列是:val a = Q [(3,2,"c"),(3,2,"d"),(5,2,"b"),(5,3,"a")], 然后,排队1" e"  给出

val a = Q [(1,5,"e"),(3,2,"c"),(3,2,"d"),(5,2,"b"),(5,3,"a")]

我必须编写一个函数move,它在谓词p上运行,它将满足谓词p的所有元素移动到q中的较低级别队列。 那就是:val move :(' a - > bool) - > '队列 - > '队列 以下定义不会起作用。

fun move pred (Q((l,p,v)::xs)) =  if (pred (v)) then enqueue (Q xs) (l-1) p v else (move pred (Q xs))
  | move pred (Q[]) = raise Empty

我刚开始学习sml。请帮忙。

2 个答案:

答案 0 :(得分:0)

首先,有一个名为NONE的构造函数是坏的,因为它覆盖了。{ 内置选项类型的同名值。其次,你说的元素 谓词满足的应该移到较低的水平 - 是那个级别 总是比以前的水平少一个?

您的move将无效,因为您显然不会递归调用它 当pred v为真时,仅当它不是时。如果您将(l,p,v)排入队列 递归调用move pred的队列(即move pred (Q xs) 而不是Q xs),也许它会更好。

另请注意,此问题非常适合通过折叠解决:

fun move pred (Q elems) =
    let fun enq ((l,p,v), q) = enqueue q (if pred v then l-1 else l) p v
    in foldl enq (Q []) elems end

答案 1 :(得分:0)

有趣的移动pred(Q((l,p,v):: xs))= if(pred(v))然后入队(Q xs)(l-1)pv else入队(移动pred(Q xs) )lpv   |移动pred(Q [])=提升空 这也有效!