欢迎!请参阅关于页面,以了解更多关于如何使用本网站的信息。
目前比较两个非相同序列需要迭代通过两个序列,一个接一个地比较值,忽略了序列 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和这个补丁一起都失败了,尽管任意两个都可以正常工作。
(实际上这个补丁的来源并没有问题,它仍然可以很好地短路到= 结构共享的地方,只是其他两个补丁破坏了范围的结构共享,所以测试失败)
我明白了,我想如果那些补丁被应用到的话,我们可能不得不更改测试。