12

मैं बस सोच रहा हूं कि उस गणना के लिए सबसे अच्छा तरीका क्या है। आइए मान लें कि मेरे पास मानों और सीमाओं की सरणी की एक इनपुट सरणी है - मैं सीमाओं सरणी में प्रत्येक सेगमेंट के लिए आवृत्ति वितरण की गणना/बकेटेट करना चाहता था।सी # में सरणी के लिए आवृत्ति वितरण की गणना करने का सबसे तेज़ तरीका क्या है?

क्या इसके लिए बाल्टी खोज का उपयोग करना अच्छा विचार है?

वास्तव में मुझे लगता है कि सवाल Calculating frequency distribution of a collection with .Net/C#

पाया लेकिन मुझे समझ में नहीं आता कि कैसे उस उद्देश्य के लिए बाल्टी का उपयोग करने के कारण प्रत्येक बकेट के आकार मेरी स्थिति में अलग अलग हो सकता है।

संपादित करें: सब चर्चा के बाद मैं आंतरिक/बाहरी पाश समाधान है, लेकिन अभी भी मैं एक शब्दकोश के साथ आंतरिक पाश समाप्त करने के लिए उस मामले में हे (एन) प्रदर्शन प्राप्त करना चाहते हैं अगर मैं सही ढंग से समझ में आ रहा इनपुट हैश करने के लिए की जरूरत है एक बाल्टी सूचकांक में मूल्य। तो हमें ओ (1) जटिलता के साथ किसी प्रकार का हैश फ़ंक्शन चाहिए? कोई विचार यह कैसे करना है?

+1

आप सीमाओं सरणी थोड़ा बेहतर वर्णन कर सकते हैं? क्या विभिन्न सीमाओं के बीच कोई संबंध है (यानी वे अनुक्रमिक हैं) या वे आकार और "स्थान" में पूरी तरह से यादृच्छिक हैं? मुझे लगता है कि सीमाएं सरणी पूरी तरह से संभावित मूल्यों की सीमा को कवर करती है - क्या यह सच है? इसके अलावा, मुझे लगता है कि कोई ओवरलैप नहीं है - है ना? –

+0

बड़े "ओ" या छोटे कोड के अर्थ में सबसे तेज़ है? एक साधारण दृष्टिकोण स्वयं को एक फ़ंक्शन Func लिखना होगा और इसे लिंक के साथ उपयोग करें। समूह इसे "बाल्टी" में समूहित करने के लिए - लेकिन ऐसा करने के लिए कम्प्यूटेशनल तेज़ तरीके हो सकते हैं। – Carsten

+0

हां, आप सही हैं। सीमा मूल्य मूल्य में monotonically बढ़ रहे हैं। वे कोई ओवरलैप नहीं हैं और संभावित मूल्यों की सीमा को कवर करते हैं। तो उदाहरण के लिए: 0, 10, 50, 100, 120. – Andrey

उत्तर

4

बाल्टी सॉर्ट पहले से ही ओ (एन^2) सबसे खराब मामला है, इसलिए मैं यहां एक साधारण आंतरिक/बाहरी लूप करूँगा। चूंकि आपकी बाल्टी सरणी आपके इनपुट सरणी से जरूरी है, इसे आंतरिक लूप पर रखें। चूंकि आप कस्टम बाल्टी आकार का उपयोग कर रहे हैं, वास्तव में कोई गणितीय चाल नहीं है जो उस आंतरिक पाश को खत्म कर सकती है।

int[] freq = new int[buckets.length - 1]; 
foreach(int d in input) 
{ 
    for(int i = 0; i < buckets.length - 1; i++) 
    { 
     if(d >= buckets[i] && d < buckets[i+1]) 
     { 
      freq[i]++; 
      break; 
     } 
    } 
} 

यह भी O (n^2) सबसे खराब स्थिति है, लेकिन आप कोड सादगी हरा सकते हैं। मैं ऑप्टिमाइज़ेशन के बारे में चिंता नहीं करता जब तक कि यह वास्तविक समस्या न हो जाए। यदि आपके पास एक बड़ी बाल्टी सरणी है, तो आप किसी प्रकार की बाइनरी खोज का उपयोग कर सकते हैं। लेकिन, चूंकि आवृत्ति वितरण आमतौर पर < 100 तत्व होते हैं, मुझे संदेह है कि आपको बहुत सारे वास्तविक-विश्व प्रदर्शन लाभ दिखाई देंगे।

+1

बकेटेटेड हैशटेबल कार्यान्वयन के बारे में आप क्या सोचते हैं जैसे जावा में प्रस्तुत किया गया है? या निष्पादन की शुरुआत में सरणी सॉर्टिंग के बारे में क्या, क्या यह समझ में आता है? –

+0

अमूर्त ओ (एन) perf प्राप्त करने के लिए 'शब्दकोश ' के साथ आंतरिक लूप को हटा दें। –

+0

@ हंस आपका क्या मतलब है? मैं वास्तव में समझ में नहीं आता :( – Andrey

1

अपने इनपुट सरणी वास्तविक दुनिया डेटा (अपने पैटर्न के साथ) का प्रतिनिधित्व करता है और सीमाओं की सरणी यह ​​बार-बार पुनरावृति भीतरी पाश में आप निम्नलिखित दृष्टिकोण पर विचार कर सकते करने के लिए बड़ी है:

  • सभी तरह सबसे पहले आपका इनपुट सरणी यदि आप असली दुनिया डेटा के साथ काम करते हैं तो मैं Timsort - Wiki पर विचार करने की सलाह दूंगा। यह वास्तविक दुनिया डेटा में देखे जा सकने वाले पैटर्न के लिए बहुत अच्छी प्रदर्शन गारंटी प्रदान करता है।

  • अनुसार क्रमबद्ध सरणी के माध्यम से पार और सीमाओं की सरणी में पहली मूल्य से इसकी तुलना:

    • यदि इनपुट सरणी में मूल्य से कम सीमा है - इस सीमा के लिए वेतन वृद्धि आवृत्ति काउंटर
    • हैं में मूल्य इनपुट सरणी सीमा के बाद बड़ी है - सीमाओं की सरणी में अगले मान पर जाएं और नई सीमा के लिए काउंटर बढ़ाएं।

एक कोड यह इस तरह दिख सकता है:

Timsort(myArray); 
int boundPos; 
boundaries = GetBoundaries(); //assume the boundaries is a Dictionary<int,int>() 

for (int i = 0; i<myArray.Lenght; i++) { 
    if (myArray[i]<boundaries[boundPos]) { 
    boundaries[boubdPos]++; 
    } 
    else { 
    boundPos++; 
    boundaries[boubdPos]++; 
    } 
} 
+1

सीमाओं की सरणी के साथ सीमाओं का प्रतिनिधित्व किया जाता है। लेकिन जटिलता के बारे में क्या? जैसा कि मैं लूपिंग के लिए सबसे बुरी स्थिति ओ (nlogn) + ओ (एन) में टिमसोर्ट के लिए समझा। मुझे लगता है कि आंतरिक/बाहरी पाश बाइनरी खोज बेहतर होना चाहिए? – Andrey

+2

बिल्कुल सही नहीं है। मध्य में "खाली" बाल्टी होने पर यह असफल हो जाएगा। यही है, क्रमबद्ध सरणी में दो इनपुट मान हैं जो एक-दूसरे के बगल में हैं, लेकिन बाल्टी में जाएं जो एक दूसरे के बगल में नहीं हैं। लेकिन इसे ठीक किया जा सकता है। सब कुछ, यह एक बहुत अच्छा विचार है। डेटा के आधार पर, रेडिक्स सॉर्ट का उपयोग करना भी संभव हो सकता है, जो ओ (एन) है, हालांकि इसे उचित बनाने के लिए बहुत सारे डेटा की आवश्यकता हो सकती है। लेकिन कुल रनटाइम एक साफ ओ (एन) होगा। –

+0

पीएस इस पाठ को उत्तर के रूप में पोस्ट करने के लिए खेद है। यह एक टिप्पणी होना था। –

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

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