gpt4 book ai didi

set - 为什么 Elixir 的 MapSet 在 32 个元素后变得无序?

转载 作者:行者123 更新时间:2023-12-04 00:46:38 27 4
gpt4 key购买 nike

iex> MapSet.new(1..32) |> Enum.to_list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32]

iex> MapSet.new(1..33) |> Enum.to_list
[11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,
22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12]

这是 implementation在 Elixir 1.3 中
def new(enumerable) do
map =
enumerable
|> Enum.to_list
|> do_new([])

%MapSet{map: map}
end

defp do_new([], acc) do
acc
|> :lists.reverse
|> :maps.from_list
end

defp do_new([item | rest], acc) do
do_new(rest, [{item, true} | acc])
end

即使顺序在 MapSet 中无关紧要,但还是想知道为什么是 MapSet在 32 个元素之后变得无序?

最佳答案

这不是特定于 MapSet ,但同样的事情发生在正常 Map ( MapSet 在引擎盖下使用 Map):

iex(1)> for i <- Enum.shuffle(1..32), into: %{}, do: {i, i}
%{1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9,
10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, 15 => 15, 16 => 16,
17 => 17, 18 => 18, 19 => 19, 20 => 20, 21 => 21, 22 => 22, 23 => 23,
24 => 24, 25 => 25, 26 => 26, 27 => 27, 28 => 28, 29 => 29, 30 => 30,
31 => 31, 32 => 32}
iex(2)> for i <- Enum.shuffle(1..33), into: %{}, do: {i, i}
%{11 => 11, 26 => 26, 15 => 15, 20 => 20, 17 => 17, 25 => 25, 13 => 13, 8 => 8,
7 => 7, 1 => 1, 32 => 32, 3 => 3, 6 => 6, 2 => 2, 33 => 33, 10 => 10, 9 => 9,
19 => 19, 14 => 14, 5 => 5, 18 => 18, 31 => 31, 22 => 22, 29 => 29, 21 => 21,
27 => 27, 24 => 24, 30 => 30, 23 => 23, 28 => 28, 16 => 16, 4 => 4, 12 => 12}

这是因为(最有可能是作为优化)Erlang 存储的 Maps 大小可达 MAP_SMALL_MAP_LIMIT作为 sorted by key array .只有在大小大于 MAP_SMALL_MAP_LIMIT 之后Erlang 切换到将数据存储在 Hash Array Mapped Trie like data structure 中.在非 Debug模式 Erlang, MAP_SMALL_MAP_LIMITdefined to be 32 ,因此所有长度不超过 32 的 map 都应按排序顺序打印。请注意,据我所知,这是一个实现细节,您不应依赖此行为;他们可能会在 future 更改常量的值,或者如果性能更高,则切换到完全不同的算法。

关于set - 为什么 Elixir 的 MapSet 在 32 个元素后变得无序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com