मैं प्रदर्शन-महत्वपूर्ण कोड में बड़ी संख्या में एंट्रॉपी और पारस्परिक जानकारी की गणना करना चाहता हूं। एक मध्यवर्ती कदम के रूप में, मुझे प्रत्येक मूल्य की घटनाओं की संख्या गिनने की आवश्यकता है। उदाहरण के लिए:घटनाओं की गणना करने के लिए सबसे प्रभावी तरीका है?
uint[] myArray = [1,1,2,1,4,5,2];
uint[] occurrences = countOccurrences(myArray);
// Occurrences == [3, 2, 1, 1] or some permutation of that.
// 3 occurrences of 1, 2 occurrences of 2, one each of 4 and 5.
बेशक
स्पष्ट तरीके यह या तो एक साहचर्य सरणी का उपयोग कर रहे हैं या त्वरित तरह की तरह एक "मानक" छँटाई कलन विधि का उपयोग इनपुट सरणी छँटाई के द्वारा करने के लिए। बाइट्स जैसे छोटे पूर्णांक के लिए, कोड वर्तमान में एक सादे पुरानी सरणी का उपयोग करने के लिए विशिष्ट है।
क्या कोई हैश तालिका से अधिक कुशलता से ऐसा करने के लिए कोई चालाक एल्गोरिदम है या एक "मानक" सॉर्टिंग एल्गोरिदम ऑफ़र करेगा, जैसे एक एसोसिएटिव सरणी कार्यान्वयन जो सम्मिलन या सॉर्टिंग एल्गोरिदम पर अपडेट का समर्थन करता है जो आपके डेटा में चमकता है बहुत सारे रिश्तों?
नोट: गैर-स्पैस पूर्णांक संभावित डेटा प्रकार का केवल एक उदाहरण हैं। मैं यहां एक उचित जेनेरिक समाधान को लागू करने के लिए देख रहा हूं, हालांकि पूर्णांक वाले पूर्णांक और structs सामान्य मामले हैं, इसलिए यदि वे बेहद कुशल हैं तो मुझे इन समाधानों में रुचि होगी।
ऊपर बताए गए किसी भी चीज़ के बारे में सोचें। सरणी को सॉर्ट करें और उसके बाद अनुक्रमिक रूप से पास में जाएं। –
शायद आप अपने एल्गोरिदम को गति देने के लिए कुछ प्रकार के हडोप या मानचित्र/घटा सकते हैं? इसके अलावा मुझे कुछ भी दिखाई नहीं देता है। – kgrad
@kgrad: बाहरी लूप को समानांतर करके मैं अपने सभी कोरों का पूरी तरह से उपयोग कर रहा हूं, इसलिए इस फ़ंक्शन के व्यक्तिगत निष्पादन को समानांतर करने में कोई बात नहीं होगी। – dsimcha