मूल रूप से मेरी टिप्पणी से: यह अकादमिक उत्पादकता मूल्यांकन में एक मात्रा सर्वव्यापी से संबंधित है, हिर्श इंडेक्स, जिसे इंडेक्स केh रूप में जाना जाता है । संक्षेप में इसे परिभाषित किया गया है क्योंकि प्रकाशनों की संख्या एक है जिसमें उनमें से प्रत्येक में कम से कम h उद्धरण हैं (सबसे बड़ा ऐसा hhhh ) है।
आपकी समस्या अलग होने का एकमात्र तरीका यह है कि आप न केवल कितने प्रकाशनों में कसौटी पर खरे उतरते हैं बल्कि उनकी गणना के मायने भी हैं। , बल्कि , लेकिन यह एक तुच्छ संशोधन है। डेटा पहले से ही है, मूल एल्गोरिथ्म बस इसे छोड़ देता है।
आम तौर पर कार्यान्वित गणना बल्कि सीधी है और करोलिस जुडेलो के जवाब से सहमत है ।
अपडेट: आपके डेटा के आकार और चरित्र के आधार पर, यह उन तरीकों की खोज करने के लायक हो सकता है जो आंशिक रूप से डेटा को एक महत्वपूर्ण बिंदु से ऊपर और नीचे फ़िल्टर करके सरणी को सॉर्ट करते हैं (एस्कॉर्ट दिमाग में आता है)। फिर इस बात पर निर्भर करता है कि क्या बहुत कम या बहुत सारे धुरी को समायोजित करते हैं और उस उपसमुच्चय पर फिर से लोड करते हैं जिसमें यह शामिल है। आपको से अधिक तत्वों के बीच ऑर्डर की आवश्यकता नहीं है , और निश्चित रूप से इससे कम नहीं है। उदाहरण के लिए, एक बार जब आप सभी तत्वों को एच 1 के बराबर या उससे अधिक पाते हैं और उनमें से एच 1 से कम है , तो आपको उस सबसेट को फिर से छूने की ज़रूरत नहीं है, बस इसे जोड़ें। यह पुनरावृत्ति को अंतर्निहित अनुवर्ती को एक पूंछ पुनरावृत्ति में परिवर्तित करता है और इस प्रकार लूप के रूप में फिर से लिखा जा सकता है।hh1h1
मेरा हास्केल थोड़ा कठोर है लेकिन यह वही करना चाहिए जो मैंने ऊपर वर्णित किया है और काम करने के लिए लगता है। आशा है कि इसे कुछ हद तक समझा जा सकता है, मैं आगे स्पष्टीकरण प्रदान करने में प्रसन्न हूं।
-- just a utility function
merge :: [a] -> [a] -> [a]
merge [] ys = ys
merge (x:xs) ys = x : merge xs ys
-- the actual implementation
topImpl :: [Int] -> [Int] -> [Int]
topImpl [] granted = granted
topImpl (x:xs) granted
| x == (1 + lGreater + lGranted) = x : merge greater granted
| x > (1 + lGreater + lGranted) = topImpl smaller (x : merge greater granted)
| otherwise = topImpl greater granted
where smaller = [y | y <- xs, y < x]
greater = [y | y <- xs, y >= x]
lGreater = length greater
lGranted = length granted
-- starting point is: top of whole array, granted is empty
top :: [Int] -> [Int]
top arr = topImpl arr []
विचार यह है granted
कि आप जो जानते हैं उसे परिणाम में इकट्ठा करेंगे, और आगे किसी भी तरह से नहीं छांटेंगे। यदि greater
एक साथ x
फिट बैठता है, तो हम भाग्यशाली हैं, अन्यथा हमें एक छोटे उपसमूह के साथ प्रयास करने की आवश्यकता है। (धुरी x
है कि सबसे बड़ा तत्व एक विकेट एक के बाद के खिलाफ महत्वपूर्ण लाभ हम के औसत आकार के ब्लॉक पर ऐसा कर वह यह है कि बस जो कुछ भी sublist है कि वर्तमान में माना जाता है के पहले आइटम हुआ है।) नोट remaining/2 और उन्हें आगे क्रमबद्ध करने की आवश्यकता नहीं है।
उदाहरण:
चलो अपना सेट ले लो [1,3,4,1,3,6]
।
x = 1
, granted = []
, greater = [3,4,1,3,6]
। आउच, हमने एक पैथोलॉजिकल मामले को हिट किया जब पिवट बहुत छोटा है (वास्तव में इतना छोटा है कि smaller
खाली है) पहले चरण में सही है। सौभाग्य से हमारा अहंकार इसके लिए तैयार है। यह अकेले के x
साथ फिर से प्रयास करता है greater
।
x = 3
, granted = []
, greater = [4,3,6]
। साथ में, वे लंबाई 4 की एक सरणी बनाते हैं, लेकिन हमारे पास केवल 3 से नीचे तक सीमित है इसलिए यह बहुत अधिक है। greater
अकेले पर दोहराएं ।
x = 4
, granted = []
, greater = [6]
। यह प्रत्येक को 2 तत्वों ≥ 4 की एक सरणी देता है, लगता है कि हम उनमें से कुछ के लिए उपयोग कर सकते हैं। इसे रखें और दोहराएं smaller = [3]
।
x = 3
, granted = [4,6]
, greater = []
। यह एक साथ 3 तत्वों each 3 प्रत्येक की एक सरणी देता है, इसलिए हमारे पास हमारा समाधान है [3,4,6]
और हम वापस लौट सकते हैं। (ध्यान दें कि क्रमांकन इनपुट के आदेश के आधार पर भिन्न हो सकता है, लेकिन इसमें हमेशा उच्चतम संभव शब्द होंगे, कभी भी [3,3,6]
या [3,3,4]
उदाहरण के लिए नहीं।)
(Btw। ध्यान दें कि पुनरावृत्ति वास्तव में सिर्फ एक चक्र तक ढह गई थी।) कई बचाया तुलनाओं की वजह से जटिलता क्विकसॉर्ट से कुछ बेहतर है:
n−1 तुलना
O(logn)O(n) कुल तुलना
nO(n2) तुलना कुल
उपरोक्त कोड में कुछ अनावश्यक तुलनाएं हैं, जैसे smaller
कि यह गणना करना कि हमें इसकी आवश्यकता है या नहीं, उन्हें आसानी से हटाया जा सकता है। (मुझे लगता है कि आलसी मूल्यांकन हालांकि इस बात का ध्यान रखेगा।)