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

γι 'αυτό προσπαθώ να σχεδιάσουν ins λειτουργία και να βρει, αλλά δεν είμαι σίγουρος πού να 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