में तेजी से सॉर्टिंग पूर्णांक है क्या हैकेल पुस्तकालयों में कोई फ़ंक्शन है जो ओ (एन) समय में पूर्णांक टाइप करता है ?? [रखकर हे (एन) मैं तेजी से तुलना प्रकार और पूर्णांकों के लिए विशिष्ट से मतलब]हैकेल
मूल रूप से मुझे लगता है कि निम्नलिखित कोड प्रकार के साथ बहुत समय लेता है (छँटाई के बिना सूची संक्षेप की तुलना में):
import System.Random
import Control.DeepSeq
import Data.List (sort)
genlist gen = id $!! sort $!! take (2^22) ((randoms gen)::[Int])
main = do
gen <- newStdGen
putStrLn $ show $ sum $ genlist gen
किसी सूची को सारांशित करने के लिए गहरे सेक की आवश्यकता नहीं है, लेकिन मैं जो करने की कोशिश कर रहा हूं, लेकिन उपर्युक्त कोड उन पॉइंटर्स के लिए पर्याप्त है जो मैं चाहता हूं।
समय: 6 सेकंड (बिना सॉर्ट); लगभग 35 सेकंड (क्रमशः)
मेमोरी: लगभग 80 एमबी (बिना सॉर्ट); 310 के बारे में एमबी (प्रकार) के साथ
नोट 1: स्मृति यहाँ हाथ में काम मैं स्मृति त्रुटियों से बाहर हो रही है (स्मृति के उपयोग 3GB हो जाता है के लिए के रूप में मेरे लिए समय की तुलना में एक बड़ा मुद्दा है रन के 30 मिनट के बाद -टाइम)
मुझे लगता है कि तेजी से एल्गोरिदम bettor मेमोरी प्रिंट भी प्रदान करेगा, इसलिए ओ (एन) समय की तलाश है।
नोट 2: मैं Int64 के लिए तेज़ एल्गोरिदम की तलाश में हूं, हालांकि अन्य विशिष्ट प्रकारों के लिए तेज़ एल्गोरिदम भी सहायक होंगे।
समाधान उपयोग किया: अनबॉक्स्ड वैक्टर साथ IntroSort मेरे कार्य के लिए काफी अच्छा था:
import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Algorithms.Intro as I
sort :: [Int] -> [Int]
sort = V.toList . V.modify I.sort . V.fromList
'ओ (एन) 'सॉर्टिंग? मुझे लगता है कि आप [स्पेगेटी सॉर्ट] को लागू करने का प्रयास कर सकते हैं (https://en.wikipedia.org/wiki/Spaghetti_sort)। – huon
तुलनात्मक प्रकार में 'ओ (एन * लॉग एन)' की तुलना में कम जटिलता नहीं हो सकती है। चूंकि सीमा सीमित है, इसलिए आप एक बाल्टी सॉर्ट का उपयोग कर सकते हैं (लेकिन इससे स्मृति उपयोग को कम नहीं किया जाएगा;)। क्या आपने उस पर 'Data.IntSet' और' toList' बनाने का प्रयास किया है? –
डेटा का उपयोग कर। IntSet में लगभग 24 सेकंड लगते हैं, इसलिए यह तेज़ी से प्रतीत होता है लेकिन मेमोरी पदचिह्न 320 एमबी है !! ['genlist gen = id $ !! $ सूची !! ((लिस्ट $ !! ले लो (2^22) ((रैंडम्स जीन) :: [इंट])) :: इंटसेट) '] – Karan