【问题标题】:literal hash set in clojureclojure 中的文字哈希集
【发布时间】:2015-11-02 23:48:01
【问题描述】:

每当我在 Clojure 中使用文字符号定义哈希集时,它都会像这样对周围的值进行打乱:

user=> #{1 2 4 6 5}

它返回了这个:

#{1 4 6 2 5}

但是当我把

user=> #{1 4 6 2 5}

它返回:

user=> #{1 4 6 2 5}

这背后的逻辑是什么?

【问题讨论】:

    标签: hash clojure hashset


    【解决方案1】:

    根据定义,集合是无序的。所以作为接口问题,顺序是任意的。但是,哈希集无疑会将其成员存储在某种哈希表中。因此,枚举散列集成员的自然方法是遍历内部散列表。因此,生成元素的顺序将取决于元素的哈希值,以及这些值如何映射到底层哈希表。

    这就是为什么元素的“排序”看起来是随机的,但却是可重复的。

    【讨论】:

    • 嗯,可能是真的,但我最好说一个集合是未排序的。不保证元素的顺序。如果你想要一个排序集,你可以使用 sorted-set,它甚至会使用连续的 conj 保持排序顺序:(conj (sorted-set 1 4 6 5) 2) ;=> #{1 2 4 5 6}
    • 好点。我添加了更多细节,(希望)解释了与哈希值的关系,而不推断直接关系。
    • “元素的顺序似乎是随机的,但可重复”...鉴于此实现。一个同样有效的实现可以包括每次读取后随机洗牌。
    • @tar,是的,实现可能会产生随机打乱的序列。但这似乎相当做作,所以我不认为这是一个非常“自然”的实现。它也不会是一个纯函数。最后,这不是 Clojure 的 PersistentHashSets 的实现方式。
    • Clojure 的sorted-set 函数存在是有原因的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多