【发布时间】:2018-12-19 03:41:03
【问题描述】:
使用Scheme的reverse函数非常容易,例如在使用(cons new-obj my-list)而不是(append my-list (list new-obj))以相反的顺序创建列表之后。
但是,我想知道 部分的效率如何。如果一个 Scheme 列表是一个 singly 链接列表(我假设),这意味着遍历整个列表 至少 一次以到达最后一个元素,不是吗?这需要reverse 以某种方式创建反向链接?
OTOH 在双向链表中,只需简单地从尾到头遍历列表,这样效率会更高。
我的问题是:如果我有一个程序生成一个列表(以相反的顺序)并且在某些时候处理整个列表的情况,是否值得费心以一种可以反向处理列表的方式来实现该处理顺序,还是先简单地使用reverse不会受到惩罚?
这是针对 Guile Scheme 的,具体来说是 Guile 1.8(如果有影响的话)。
【问题讨论】:
-
"双向链表可以简单地从头到尾遍历列表,效率更高。"也就是说,假设您有一个指向最后一个元素的指针。
-
基准测试!这篇博文定义了
append的多个版本。尝试预测哪一个在 Guile 上最快。那就试试吧。准备好感到惊讶。 scheme.dk/blog/2007/05/know-your-implementation.html -
您的问题中缺少的重要信息:您的列表有多长,您将反转它们多少次?如果您的列表少于 50K 元素,并且您相对不频繁地反转它们,那么您绝对不必担心。
标签: linked-list scheme guile