如何在SML中实现LPT(最长处理时间)调度算法功能

如何在SML中实现LPT(最长处理时间)调度算法功能,sml,smlnj,ssml,sysml,Sml,Smlnj,Ssml,Sysml,假设我们有一个包含一些任务处理时间的列表,如[13,8,7,6,4,2,2,1]。我们希望通过LPT调度算法将此列表划分为两个列表。以下是算法过程: 对于如上所述的降序排序列表,我们首先将最大的元素(排序列表中的第一个元素)放入列表1,然后将第二个元素放入列表2中。然后,我们将下一个元素插入两个列表中的一个,元素之和较小。 我们做这项工作,直到初始列表中的所有元素被分成两个列表 例如,对于上述列表,两个列表将是[13,6,2,1],[8,7,4,2](我们看到元素7已插入第二个列表,因为List

假设我们有一个包含一些任务处理时间的列表,如[13,8,7,6,4,2,2,1]。我们希望通过LPT调度算法将此列表划分为两个列表。以下是算法过程:

对于如上所述的降序排序列表,我们首先将最大的元素(排序列表中的第一个元素)放入列表1,然后将第二个元素放入列表2中。然后,我们将下一个元素插入两个列表中的一个,元素之和较小。 我们做这项工作,直到初始列表中的所有元素被分成两个列表


例如,对于上述列表,两个列表将是[13,6,2,1],[8,7,4,2](我们看到元素7已插入第二个列表,因为ListSum([13]>ListSum([8]),然后因为ListSum([13]),您可以使用尾部递归辅助函数:

fun lpt xs = let 
    fun lpt' ([],l1,l2,s1,s2) = (rev l1, rev l2)
    |   lpt' (x::xs,l1,l2,s1,s2) = 
            if s1 <= s2 then lpt' (xs,x::l1,l2,s1+x,s2)
            else lpt' (xs,l1,x::l2,s1,s2+x)
    in
        lpt' (xs,[],[],0,0)
    end;
fun lpt xs=let
有趣的lpt’([],l1,l2,s1,s2)=(版本l1,版本l2)
|lpt'(x::xs,l1,l2,s1,s2)=
如果s1