haskell binaire zoekboom

stemmen
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

dus ik ben op zoek naar de functie ins ontwerpen en te vinden, maar ik ben niet zeker waar om ideeën start.any?

De vraag is gesteld op 04/11/2011 om 04:48
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Ik heb geen idee van welke criteria de boom worden gesorteerd, dus ik gebruik gewoon wrd. Dan zou er zo uitzien:

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)  

Hoe daar te komen?

Zoals altijd bij het gebruik van recursie, een base case nodig. Hier is het heel simpel: als de boom leeg is, gewoon vervangen door een knooppunt met uw gegevens. Er zijn geen kinderen voor het nieuwe knooppunt, dus gebruiken we Empty.

Het geval als u een volledige knooppunt lijkt moeilijker, maar dit is gewoon te wijten aan patroonherkenning, het idee is heel simpel: Als het item "kleinere" moet je de linker kind te vervangen door een versie die het item bevat, indien het is "grotere" je nodig hebt om de juiste kind te vervangen.

Als zowel het knooppunt en de toegang hebben dezelfde "grootte" hebt u drie opties: houd de oude knooppunt, te vervangen door de nieuwe (het bijhouden van de kinderen) of gooi een fout (die de schoonste oplossing lijkt, dus ik heb het hier).

antwoordde op 04/11/2011 om 08:39
bron van user

stemmen
2

Een eenvoudige veralgemening van antwoord Landei's:

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)

Om dit te laten werken Tree Entry, moet u een exemplaar van te definiëren Ordvoor Entry.

antwoordde op 04/11/2011 om 17:42
bron van user

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