【发布时间】:2017-06-18 14:54:08
【问题描述】:
给定两个(无序)相同的集合,(first <set>) 是否保证总是返回相同的元素?
如果这被记录在某处,它在哪里?
我为什么关心
我现在想要这个的主要原因是搜索由随机过程产生的图形,产生应用更多随机过程的结果。 uber/nodes 和 loom/nodes 似乎返回集合。
遍历顺序的某些细节无关紧要,但有些则重要。重要的是每次我使用相同的随机数种子运行程序时,我应该得到相同的结果。
我不希望对图的节点或边进行排序。这似乎强加了计算开销而没有真正的好处——除了确定性。
我在其他项目中也遇到过同样的需求,但不涉及图表。通常使用遗传算法,我有很多我可以通过的集合(但没有重复!)。程序通过集合的顺序无关紧要,只是它会影响在处理给定元素之前调用随机数生成器的次数。所以,更一般地说,你可以说我的问题是关于 (seq <set>) 是否是确定性的。
重新定义问题?
如果答案是否定的,或者如果答案是肯定的,但对 Clojure 有罪,这里有另一种说明问题的方式:Clojurely 逐项处理集合的方法是什么,你永远不希望重复,你在哪里不关心顺序——除了每次运行程序时都需要项目以相同的顺序出现? (更准确地说,每次调用函数时都使用相同的随机数种子。)
不过,这可能是没有希望的,除非我准备编写另一个图形库。
【问题讨论】:
-
即使是这样,我也不想在代码中使用它——它掩盖了你的数据结构的意图(即是否被排序)。了解您可能不会问,因为您想使用它。 :)
-
@matt_t_gregg 我绝对想使用它,特别是用于行走图。我会把这个添加到问题中。
-
我会重新考虑。从集合中取出第一个元素的想法是荒谬的(我的意思是字面意思)。好比说:我要在一个没有顺序的容器中按照容器的顺序最先出现的元素。 Imo,您绝对应该在您的问题中添加行走图部分,因为我真的认为您不应该将
first与一组一起使用。 -
@MasterMastic 你一定是其中之一Axiom of Choice-haters。说真的,我只是需要逐项浏览我不希望重复的集合,其中的顺序无关紧要,但在程序的多次运行中顺序需要相同。也许还有另一种我没有想到的方法。 (我也会将此添加到问题中。)
-
@matt_t_gregg 我不确定,实际上这可能是时候留意 Knuth 反对过早优化的劝告中的智慧了。不过,这个程序非常消耗 CPU,而且我想在不太困难的地方在内部循环中添加不必要的东西。更一般地说,避免排序的另一个原因是排序也 模糊了意图。由于顺序没有意义,因此在代码中强制执行特定顺序有点误导。
标签: clojure set deterministic