haskell ikili arama ağacı

oy
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

bu yüzden fonksiyon ins tasarlayıp bulmaya çalışıyorum ama nereye fikirler start.any emin değilim?

Oluştur 04/11/2011 saat 04:48
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Ağacın sıralarken uyacağı kriterler tarafından hiçbir fikrim yok, ben de kullanmak wrd. Sonra gibi görünecektir:

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)  

Oraya nasıl gidilir?

Hep Özyinelemeyi kullanırken olarak, bir baz kutusu gerekecek. Burada çok basit: Ağaç boşsa, sadece verileri içeren bir düğüm tarafından değiştirin. Orada yeni düğüm için hiçbir çocuk, bu yüzden kullanmak Empty.

Tam bir düğüm daha zor görünüyor, ama bu desen eşleştirme sadece nedeniyle ise durum, düşünce çok basittir: girdi ise "küçük" eğer, girdiyi içeren bir sürümü ile sol çocuğu değiştirmeniz gerekiyor o "daha büyük" Eğer doğru çocuğu değiştirmeniz gerekiyor olduğunu.

(Çocukları tutarak) yenisiyle değiştirin eski düğümü tutmak veya bir hata atmak (en temiz çözüm gibi görünüyor, bu yüzden buraya did it): düğüm ve giriş ikisi de aynı "boyutu" varsa üç seçeneğiniz vardır.

Cevap 04/11/2011 saat 08:39
kaynak kullanıcı

oy
2

LANDEI cevabı basit genelleme:

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)

Bu konuda çalışması için Tree Entry, size bir örneğini tanımlamak gerekir Ordiçin Entry.

Cevap 04/11/2011 saat 17:42
kaynak kullanıcı

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