Clojure rseq在恒定时间?

时间:2010-12-16 15:08:34

标签: clojure

我正在阅读Practical Clojure(第5章),rseq函数操作在恒定时间内执行。在我看来,它应该是线性时间操作。任何人都可以为我阐明这一点吗?

3 个答案:

答案 0 :(得分:12)

试试这个:

(class [1 2 3 4])

你会看到:

clojure.lang.PersistentVector

现在试试这个:

(class (rseq [1 2 3 4]))

顺序实现不同:

clojure.lang.APersistentVector$RSeq

正如Roman所说,它是一个改变了序列的接口。所有元素都是你只是以相反的顺序访问它们的地方。

您可以查看RSeq课程,了解其实施方式:https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

答案 1 :(得分:3)

我不知道它是如何实现的,但我认为它只返回一些实现序列接口的对象,并且知道如何以相反的顺序遍历结构(向量或有序映射)。结果序列是惰性的,因此它不必立即遍历整个结构。

答案 2 :(得分:0)

它像Goran Jovic所说的那样在恒定时间内返回新界面,但是将其打印出来是线性的。因此在REPL中显示它是线性的,但将它放在def中是不变的。