欢迎!请参阅关于页面以了解有关这方面的更多信息。
目前比较两个不相同的序列需要遍历两个序列并逐值比较,忽略了序列 a 和 b 可能具有相同的(指针相等)后续部分的可能。
a
b
提议的补丁在序列末尾添加了指针相等性检查,如果测试返回 true,则可以跳过相等性,这对于比较大型(或可能无限)共享公共子序列的序列非常有帮助。
在这个补丁之后,像以下这样的比较 (let [x (range)] (= x (cons 0 (rest x))))目前在当前情况下不会终止,将会在常数时间内返回 true。
(let [x (range)] (= x (cons 0 (rest x))))
补丁: CLJ-1679-v3.patch
评论者:michaelblume
当此测试失败时(它在我的 master 上失败,但我还有一大堆其他开发补丁,我还在找出冲突在哪里),它会无限期地挂起。也许最好在未来检查相等性并使未来超时?
如此 =)
评论者:bronsa
有道理,感谢更新的补丁
嗯,之前的补丁有一个问题,报告逻辑仍然试图强制执行序列和OOM,这个补丁阻止了这个行为。
好的,看起来CLJ-1515、CLJ-1603和这个补丁都结合在一起导致一起失败,尽管任意两个都工作正常。
(事实上,这个补丁的源代码没有问题,它仍然很好地实现了短路,即在存在结构共享时,只是其他两个补丁破坏了范围的结构共享,所以测试失败了)
明白了,如果应用了那些工单的补丁,我们将不得不更改测试。