Haskell द्विआधारी खोज वृक्ष

वोट
0
module Main where

import Data.List
import Data.Function

type Raw = (String, String)

icards =  [(the, le),(savage, violent),(work, travail),
           (wild, sauvage),(chance, occasion),(than a, qu'un)]

data Entry = Entry {wrd, def :: String, len :: Int, phr :: Bool}
             deriving Show

-- French-to-English, search-tree section

entries' :: [Entry]
entries' = map (\(x, y) -> Entry y x (length y) (' ' `elem` y)) icards

data Tree a = Empty | Tree a (Tree a) (Tree a)

tree :: Tree Entry
tree = build entries'

build :: [Entry] -> Tree Entry
build []     = Empty
build (e:es) = ins e (build es)

ins :: Entry -> Tree Entry -> Tree Entry

...

find :: Tree Entry -> Word -> String

...

translate' :: String -> String
translate' = unwords . (map (find tree)) . words

तो मैं समारोह इन की डिजाइन और खोजने की कोशिश कर रहा हूँ, लेकिन मैं जहां विचारों start.any करने के लिए सुनिश्चित नहीं कर रहा हूँ?

04/11/2011 को 04:48
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

मुझे नहीं पता कि जो मापदंडों के आधार पर पेड़ अनुसार क्रमबद्ध किया जाना चाहिए है, तो मैं बस का उपयोग wrd। तो यह दिखाई देगा:

ins :: Entry -> Tree Entry -> Tree Entry
ins entry Empty = Tree entry Empty Empty
ins entry@(Entry w _ _ _) (Tree current@(Entry w1 _ _ _) left right) 
   | w == w1 = error "duplicate entry"
   | w < w1 = Tree current (ins entry left) right
   | otherwise = Tree current left (ins entry right)  

वहाँ कैसे पहुंचें?

हमेशा जब प्रत्यावर्तन का उपयोग कर के रूप में, आप एक आधार मामले की जरूरत है। यहाँ यह बहुत सरल है: अगर पेड़ खाली है, सिर्फ एक नोड अपने डेटा युक्त द्वारा बदलें। वहाँ नए नोड के लिए कोई बच्चे नहीं हैं, इसलिए हम का उपयोग Empty

मामले में अगर आप एक पूर्ण नोड और अधिक कठिन लग रहा है नहीं है, लेकिन यह सिर्फ पैटर्न मिलान की वजह से है, विचार बहुत सरल है: प्रविष्टि है "छोटे" यदि आप एक संस्करण है कि प्रवेश होता है के साथ छोड़ दिया बच्चे को बदलने के लिए, की जरूरत है यह "बड़ा" आप सही बच्चे प्रतिस्थापित करने की आवश्यकता है।

दोनों नोड और प्रवेश एक ही "आकार" है, तो आप तीन विकल्प हैं: वर्ष नोड रखने के लिए, नया एक (बच्चों रखते हुए) द्वारा इसे बदलना या कोई त्रुटि फेंक (जो साफ समाधान लगता है, इसलिए मैं इसे यहाँ किया)।

04/11/2011 को 08:39
का स्रोत उपयोगकर्ता

वोट
2

Landei के जवाब का एक सरल सामान्यीकरण:

ins :: Ord a => a -> Tree a -> Tree a
ins x Empty = Tree x Empty Empty
ins x (Tree x' l r) = case compare x x' of
  EQ -> undefined
  LT -> Tree x' (ins x l) r
  GT -> Tree x' l (ins x r)

इस पर काम करने के लिए Tree Entry, आप का एक उदाहरण को परिभाषित करने की आवश्यकता होगी Ordके लिए Entry

04/11/2011 को 17:42
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more