2015-11-06 7 views
7

मैं किसी सूची से गैर डुप्लिकेट मान खोजने की कोशिश कर रहा हूं उदा।elixir-lang सूची में गैर-डुप्लिकेट तत्व ढूंढना

मूल सूची:

iex> list = [2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10] 
[2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10] 

iex> unique = Enum.uniq(list) 
[2, 3, 4, 5, 6, 7, 8, 9, 10] 

iex> nondupes = unique -- Enum.uniq(list -- unique) 
[2, 3, 5, 7] 

परिणाम: [2, 3, 5, 7]

अगर वहाँ अमृत में इस लक्ष्य को हासिल करने के लिए एक बेहतर तरीका था मैं सोच रहा था/erlang

उत्तर

10

एक और विधि (आवश्यक रूप से बेहतर नहीं) जो बड़े डेटा के लिए तेजी से हो सकता है, तत्वों से उनके गिनती में नक्शा बनाना और गिनती 1:

list 
|> Enum.reduce(%{}, fn (el, acc) -> Dict.put(acc, el, Dict.get(acc, el, 0) + 1) end) 
|> Enum.filter(fn {key, val} -> val == 1 end) 
|> Enum.map(fn {key, val} -> key end) 

इसमें O(n^2) के बजाय रनटाइम O(n * log(n)) होना चाहिए, आपके समाधान की आवश्यकता है (अगर संपूर्ण इनपुट पहले से ही अद्वितीय है तो घटाव होना चाहिए)।

+2

तुम भी 'दो सेट, एक सभी प्रविष्टियों आप अब तक देखा है रखने और अद्वितीय लोगों के साथ दूसरे के साथ reduce' कर सकते हैं। प्रत्येक आइटम के लिए, यदि यह देखी गई सूची में है, तो आपको इसे यूनिक से हटा देना चाहिए, अन्यथा आप दोनों को जोड़ दें। –

+2

बस एक छोटा सा सुधार: कम चरण में आप मैन्युअल प्राप्त/रखे के बजाय '& Dict.update (& 2, और 1, 1, fn x -> x + 1 end) 'का भी उपयोग कर सकते हैं। –

0

फिर से करना

, (पावेल के रूप में बताया, मैं इस सवाल का जवाब नहीं था, न कि केवल uniqifying बिट। तो मैं पानी में गिर मनोरंजन के लिए नीचे चला गया संबोधित किया।)

यहाँ एक विशुद्ध रूप से पुनरावर्ती है एकल-पास, मिलान-केवल विधि:

-module(nondupes). 
-export([leave_uniques/1]). 

leave_uniques(L) -> 
    lists:reverse(lu(lists:sort(L))). 

lu(L = [H,H|_]) -> lu(L, [], dupe); 
lu([H|T])  -> lu(T, [H], solo). 

lu([H,H], A, dupe)   -> A; 
lu([_,H], A, dupe)   -> [H|A]; 
lu([H,H], A, solo)   -> A; 
lu([P,H], A, solo)   -> [P,H|A]; 
lu([H | T = [H|_]], A, dupe) -> lu(T, A, dupe); 
lu([_ | T], A, dupe)   -> lu(T, A, solo); 
lu([H | T = [H|_]], A, solo) -> lu(T, A, dupe); 
lu([P | T], A, solo)   -> lu(T, [P|A], solo). 

तो अतीत के अनुभव किसी भी न्यायाधीश है, यह शायद सूची/सेट घटाव से बड़ी सूचियों पर अधिक performant है - लेकिन अतीत के अनुभव भी है कि समय पे के सबसे मुझसे कहता है सुधार वास्तव में एक मुद्दा नहीं है। वैसे भी, यह मनोरंजक था।

उपयोग:

2> nondupes:leave_uniques([2, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 10, 10]). 
[2,3,5,7] 
+0

मुझे नहीं लगता कि यह सवाल का जवाब देता है - यह मूल रूप से 'Enum.uniq' का पुनर्मूल्यांकन है। प्रश्न और नियमित रूप से अपेक्षित आउटपुट पर एक नज़र डालें। –

+0

@ PawełObrok वास्तव में। सेट/सूची संचालन का उपयोग करके आप जो भी पूरा फॉर्म चाहते हैं, वह आपके द्वारा किया गया है। तो, बस अपने प्रश्न का उत्तर यथासंभव उचित तरीके से उचित तरीके से दें, यहां एक शुद्ध दिनचर्या है जो एक ही पास में अद्वितीय सदस्यों को निकालती है। उम्मीद है कि यह आपको एक बकवास देता है। :-) – zxq9

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