arbre de recherche binaire haskell

voix
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

donc je suis en train de concevoir ins de fonction et trouver, mais je ne suis pas sûr où start.any idées?

Créé 04/11/2011 à 04:48
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Je ne sais pas par quels critères l'arbre doivent être triés, donc je viens d' utiliser wrd. Ensuite , il ressemblerait à ceci:

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)  

Comment aller là?

Comme toujours lors de l' utilisation récursion, vous avez besoin d' un cas de base. Ici , il est très simple: Si l'arbre est vide, il suffit de remplacer par un noeud contenant vos données. Il n'y a pas d' enfant pour le nouveau nœud, nous utilisons donc Empty.

Le cas si vous avez un nœud complet semble plus difficile, mais cela est juste en raison de correspondance de motif, l'idée est très simple: Si l'entrée est « plus petit » vous devez remplacer l'enfant gauche avec une version qui contient l'entrée, si il est « plus grand », vous devez remplacer l'enfant droit.

Si les deux nœuds et l'entrée ont la même « taille » vous avez trois options: garder l'ancien noeud, le remplacer par la nouvelle (en gardant les enfants) ou jeter une erreur (ce qui semble la solution la plus propre, donc je l'ai fait ici).

Créé 04/11/2011 à 08:39
source utilisateur

voix
2

Une simple généralisation de la réponse de 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)

Pour que cela fonctionne sur Tree Entry, vous devez définir une instance de Ordpour Entry.

Créé 04/11/2011 à 17:42
source utilisateur

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