我正在尝试在方案中合并多个列表。我必须确保最终列表已经排序,但幸运的是,这不会太难,因为必须对给定的列表进行排序。另一方面,我还必须检查列表是否已排序。
这是我到目前为止的代码:
/ * mergeALot未完成;由于某种原因,我在“和”以及“其他”上得到语法错误。另外,我不知道如何检查第一个元素是否是列表(停止迭代)* /
(define (mergeALot a)
(cond (and
ordered? (car a)
ordered? (cadr a))
(mergeALot(cons
(merge (car a)(cadr a))
(cdr (cdr a))))
(else
(display "Some lists are not ordered"))))
(define (ordered? lst)
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((> (car (cdr lst)) (car lst))
(ordered? (cdr lst)))
(else #f))
)
(define (merge a b)
(cond ((null? a) b)
((null? b) a)
((>= (car a) (car b))
(cons (car b) (merge a (cdr b))))
(else
(cons (car a) (merge (cdr a) b)))))
答案 0 :(得分:0)
这看起来有点像功课,但我会给你一个基本的想法。您可能会获得列表清单。由于术语有点失控,让我们调用列表未合并列表。如果未合并列表中只有一个列表,那么您就完成了!但是说有两个。 unmerged-lists中有两个列表。然后你需要一个消耗两个列表的函数,并产生合并的结果。然后,我必须更新未合并的列表。如果我的函数被调用:merge-sorted,我可能会:
(cons (my-merge (first unmerged-lists) (second unmerged-lists))
(rest (rest unmerged-lists)))
你将继续这样做,直到unmerged-lists只有一个元素,此时你会停止,因为当列表只有一个元素时你不能采取(休息(休息列表))。希望你能得到递归!
答案 1 :(得分:0)
进行多向合并有两种基本方法。
第一种方法是连续合并列表:合并前两个列表。然后将第三个列表合并到前两个列表的合并中。然后将第四个列表合并到前三个列表的合并中。等等。
第二种方法使用堆,速度更快。创建一个堆,每个列表包含一个节点,按每个列表中的最小项排序。然后重复从堆中提取最小的项目,然后重新堆积。
答案 2 :(得分:0)
假设您有3个排序列表:
unmerged: ((1 2 3) (3 5 6) (1 4 5))
找到具有最少第一个元素的列表。在下文中,我将其称为min-list
,min
是该列表的第一个元素:
min-list: (1 2 3)
min: 1
将min
值与merge-all
的{{1}}递归调用结果相同,但unmerged
替换为min-list
;所有其他列表保持原样。在您的示例中,它就像您调用了:
(cdr min-list)
计算递归(cons 1 (merge-all '((2 3) (3 5 6) (1 4 5))))
列表的方式可能如下:
unmerged
您应该忽略(map (lambda (u) (if (eq? u min-list) (cdr u) u)) unmerged)
列表中的任何空列表,并在所有列表为空时立即停止递归。或者,始终从unmerged
中删除空列表,并在unmerged
本身为空时停止。