2012-09-12 23 views
6

मैं एर्लांग में निम्नलिखित विशेषताओं के साथ एक सरणी प्रकार की तलाश कर रहा हूं।क्या कोई ऐसा मॉड्यूल है जो एरलांग में एक कुशल सरणी प्रकार लागू करता है?

append(vector(), term())  O(1) 
nth(Idx, vector())    O(1) 
set(Idx, vector(), term())  O(1) 
insert(Idx, vector(), term()) O(N) 
remove(Idx, vector())   O(N) 

मैं सामान्य रूप से इस उद्देश्य के लिए एक टपल उपयोग करें, लेकिन प्रदर्शन विशेषताओं है कि मैं क्या बड़े एन के लिए चाहते हो जाएगा नहीं कर रहे हैं मेरे परीक्षण के बाद प्रदर्शन विशेषताओं से पता चलता ...

erlang:append_element/2   O(N). 
erlang:setelement/3    O(N). 

मैं शुरू कर दिया है clojure.lang.PersistentVector कार्यान्वयन के आधार पर एक मॉड्यूल पर, लेकिन अगर यह पहले से ही किया जा चुका है तो मैं पहिया को फिर से नहीं चलाऊंगा।

संपादित करें:

रुचि रखने वालों के लिए, मैं vector.erl को लागू करने ... clojure.lang.PersistentVector रूप में एक ही कलन विधि का उपयोग करना समाप्त कर लें। इसमें सरणी मॉड्यूल के समान प्रदर्शन विशेषताएं हैं, लेकिन इसमें संलग्न होने पर थोड़ा बेहतर निरंतर कारक हैं।

निम्न परीक्षण प्रति अंतराल 10000 आइटम जोड़ता है और फिर यादृच्छिक अनुक्रमणिका पर 10000 लुकअप और 10000 अपडेट करता है। सभी परिचालन ओ (1) के पास हैं। आंतरिक ट्यूपल में समय microseconds में हैं।

3> seq_perf:test(vector, 100000, 10). 
{2685854, 
{ok,[{100000,{66966,88437,124376}}, 
     {200000,{66928,76882,125677}}, 
     {300000,{68030,76506,116753}}, 
     {400000,{72429,76852,118263}}, 
     {500000,{66296,84967,119828}}, 
     {600000,{66953,78155,116984}}, 
     {700000,{65996,77815,138046}}, 
     {800000,{67801,78455,118191}}, 
     {900000,{69489,77882,114886}}, 
     {1000000,{67444,80079,118428}}]}} 
4> seq_perf:test(array, 100000, 10). 
{2948361, 
{ok,[{100000,{105482,72841,108828}}, 
     {200000,{123655,78898,124092}}, 
     {300000,{110023,76130,106806}}, 
     {400000,{104126,73830,119640}}, 
     {500000,{104771,72593,110157}}, 
     {600000,{107306,72543,109713}}, 
     {700000,{122066,73340,110662}}, 
     {800000,{105853,72841,110618}}, 
     {900000,{105267,73090,106529}}, 
     {1000000,{103445,73206,109939}}]}} 
+0

PersistentVector कार्यान्वयन में कुछ उपयोगी युक्तियां प्रतीत होती हैं जिन्हें एरलांग सरणी मॉड्यूल पर लागू किया जा सकता है, जैसे पूंछ सम्मिलन में देरी। – RichardC

+0

दरअसल। सरणी मॉड्यूल 'अपरिभाषित' अनसेट इंडेक्स के साथ सरणी का विस्तार करने के लिए कुछ चाल का उपयोग करता है। यह 'अपरिभाषित' तत्वों के बड़े विस्तार को भी संपीड़ित करता प्रतीत होता है। – dsmith

उत्तर

8

उन गुणों को पूरी तरह कार्यात्मक कार्यान्वयन में संभव नहीं है। सरणी मॉड्यूल (http://www.erlang.org/doc/man/array.html) एक बहुत अच्छा समझौता है, लेकिन यदि आपको ओ (1) लुकअप और अपडेट की आवश्यकता है, तो आपको इसके बजाय एक ईटीएस तालिका का उपयोग करना होगा ।

+0

मैंने इस मॉड्यूल को पूरी तरह से याद किया। ऐसा लगता है कि ओ (1) अपडेट और लुकअप (या कम से कम स्थिर के लिए) है। वास्तव में मैं क्या देख रहा हूँ। धन्यवाद। – dsmith