2016-07-15 3 views
8
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] 

यहाँ अमृत 1,332 तत्वों के बाद एलिक्सीर का मैपसेट अनियंत्रित क्यों हो जाता है?

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 में कोई फर्क नहीं पड़ता में implementation है, लेकिन अभी भी सोच क्यों एक MapSet 32 तत्वों के बाद अव्यवस्थित हो जाता है?

उत्तर

11

यह MapSet के लिए विशिष्ट नहीं है, लेकिन एक ही बात सामान्य Map (MapSetMap का उपयोग करता है हुड के नीचे) के साथ होता है:

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 भंडार आकार के मानचित्र MAP_SMALL_MAP_LIMIT तक sorted by keyarray के रूप में। आकार के बाद MAP_SMALL_MAP_LIMIT से अधिक है Erlang Hash Array Mapped Trie like data structure में डेटा संग्रहीत करने के लिए स्विच करता है। गैर-डीबग मोड में एरलांग, MAP_SMALL_MAP_LIMITdefined to be 32 है, इसलिए 32 तक की लंबाई वाले सभी मानचित्र क्रमबद्ध क्रम में प्रिंट करना चाहिए। ध्यान दें कि जहां तक ​​मुझे पता है, यह एक कार्यान्वयन विस्तार है, और आपको इस व्यवहार पर भरोसा नहीं करना चाहिए; वे भविष्य में निरंतर के मूल्य को बदल सकते हैं या यदि यह अधिक प्रदर्शनशील है तो पूरी तरह से अलग एल्गोरिदम पर स्विच कर सकते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद! – sbs

संबंधित मुद्दे