मैं एक आलसी डेटा संरचना बनाने की कोशिश कर रहा हूं जिसमें अनंत बिटमैप है। मैं निम्नलिखित कार्यों का समर्थन करना चाहते हैं:असीमित आलसी बिटमैप
true :: InfBitMap
यह सच है, अर्थात सभी पदों की एक अनंत बिटमैप मूल्य यह सच होना चाहिए देता है।
falsify :: InfBitMap -> [Int] -> InfBitMap
गलत पर सूची में सभी पदों पर सेट करें। सूची संभव अनंत है। उदाहरण के लिए, सत्य गलत साबित करें [0,2 ..] एक सूची वापस कर देगा जहां सभी (और केवल) विषम स्थिति सही हैं।
check :: InfBitMap -> Int -> Bool
सूचकांक के मूल्य की जाँच करें।
यहां तक कि मैं अब तक क्या कर सकता हूं।
-- InfBitMap will look like [(@), (@, @), (@, @, @, @)..]
type InfBitMap = [Seq Bool]
true :: InfBitMap
true = iterate (\x -> x >< x) $ singleton True
-- O(L * log N) where N is the biggest index in the list checked for later
-- and L is the length of the index list. It is assumed that the list is
-- sorted and unique.
falsify :: InfBitMap -> [Int] -> InfBitMap
falsify ls is = map (falsify' is) ls
where
-- Update each sequence with all indices within its length
-- Basically composes a list of (update pos False) for all positions
-- within the length of the sequence and then applies it.
falsify' is l = foldl' (.) id
(map ((flip update) False)
(takeWhile (< length l) is))
$ l
-- O(log N) where N is the index.
check :: InfBitMap -> Int -> Bool
check ls i = index (fromJust $ find ((> i) . length) ls) i
अगर कोई Haskellish अवधारणा/डेटा संरचना है कि मुझे लगता है कि मेरी कोड और अधिक सुरुचिपूर्ण/अधिक कुशल (स्थिरांक मुझे कोई फर्क नहीं है, बस आदेश) बनाना होगा याद आ रही है मैं सोच रहा हूँ। मैंने ज़िप्पर और लेंस को देखने की कोशिश की लेकिन वे मदद नहीं कर रहे हैं। मैं अद्यतनों की जटिलताओं को रखना चाहता हूं और लॉगरिदमिक जांच सकता हूं (शायद केवल अमूर्त लॉगरिदमिक)।
नोट: किसी को संदेह होने से पहले, यह कोई होमवर्क समस्या नहीं है!
अद्यतन:
-- O(log N) where N is the index.
-- Returns "collapsed" bitmap for later more efficient checks.
check :: InfBitMap -> Int -> (Bool, InfBitMap)
check ls i = (index l i, ls')
where
ls'@(l:_) = dropWhile ((<= i) . length) ls
जो एक इकाई में कोड सफाई के लिए दिया जा सकता है:
यह सिर्फ मेरे लिए हुआ है कि जांच करने के लिए सुधार किया जा सकता।
क्या आप निश्चित रूप से 'InfBitMap' के बारे में हैं? यदि सत्य 'दोहराना' के लिए 'सत्य' होना चाहिए, तो 'इन्फिटमैप' को '[बूल]' या 'सेक बूल' होना चाहिए, लेकिन दोनों नहीं। – Zeta
@ ज़ेटा मैं सही दोहराने के लिए आइसोमोर्फिक होने का सच नहीं था। मेरा मतलब है कि यह ट्रू के अनंत अनुक्रम रखता है। यदि यह सत्य दोहराने के लिए आइसोमोर्फिक था, तो एन – aelguindy
में चेक रैखिक बना देगा 'falsify' के लिए जटिलता सही नहीं लगती है। 'एन' लंबाई अनुक्रम के लिए' एल' अपडेट हैं, जो पहले से ही ओ (एल * लॉग एन) है। –