欢迎!请参阅关于页面以了解更多关于如何工作的信息。
目前,比较两个非相同的序列需要遍历两个序列,逐个比较值,忽略序列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
很有道理,感谢更新补丁
嗯,之前的补丁存在一个问题,即报告逻辑仍然试图强制序列和OOMs,这个补丁防止了这种情况。
好了,看起来CLJ-1515、CLJ-1603和这个补丁一起导致失败,尽管任意两个都工作正常。
事实上,这个补丁的源代码并没有错误,它仍然可以很好地短路到有结构共享的地方,只是另外两个补丁破坏了范围的结构共享,所以测试失败了)
我明白了,如果我们应用这些票证的补丁,我们可能需要更改测试。