2012-03-04 7 views
9

Pracuję nad niektórymi programami wykorzystującymi drzewa. Zastanawiałem się, czy istnieje jakiś fragment kodu do generowania drzewek w OCaml.OCaml: rysuj drzewa binarne

type Tree = Node of Tree * int * Tree | Child of int;; 

Wszystko, co znalazłem w Internecie, używa Caml Light, a nie Objective Caml.
Z góry dziękuję.

+0

Mam edytowane pytanie dla lepszego formatowania. Zauważ, że nazwa "Objective Caml" jest teraz amortyzowana, ludzie są zachęcani do mówienia tylko "OCaml" (ponieważ część "Objective" nie jest dokładnie widoczna w codziennym użytkowaniu i ze względu na dość częste pomyłki z "Objective C") . – gasche

+0

No A [drzewa wykres] [1], tak [1]: http://stackoverflow.com/questions/8999557/how-to-visualize-draw-automata-in-ocaml/9011334 # 9011334 – lambdapower

Odpowiedz

12

Czy możesz wyjaśnić, co masz na myśli przez "draw"? Zakładam, że myślisz o graficznej wizualizacji drzewa?

Mam dość dobre doświadczenia z generowaniem opisów wykresów/drzew w formacie punktowym, używanym przez narzędzie graphviz. Chodzi o to, że twój program OCaml generuje tekstową reprezentację wykresu w tym formacie, a następnie używa zewnętrznych narzędzi do renderowania (przekształcania go w obraz) i ewentualnie wyświetlania go na ekranie.

Dot działa dla ogólnych wykresów. Chociaż możesz znaleźć specjalistyczne narzędzia do drzewek binarnych, które mają więcej funkcji, z mojego doświadczenia wynika, że ​​działa całkiem dobrze ze wszystkimi rodzajami drzew i wyświetla coś, co zwykle jest tym, czego potrzebujesz. Teraz narzędzie nie jest pozbawione wad i trafiłem w kilka błędów (wywołując dot segfaults). Wciąż myślę, że to rozsądny wybór.

Sposób wyprowadzania w formacie dot konkretnie: wybierz dowolny example z już istniejącego wykresu, struktura będzie dość oczywista: jest to tylko format tekstowy. Następnie piszesz swój kod na strukturze wykresu, wywołując Printf z właściwymi materiałami na etykiety itp. I voila. Na przykład: this example wygląda dobrze, a here jest formatem źródłowym. Cytuję odpowiedni fragment:

/* courtesy Ian Darwin and Geoff Collyer, Softquad Inc. */ 
digraph unix { 
    size="6,6"; 
    node [color=lightblue2, style=filled]; 
    "5th Edition" -> "6th Edition"; 
    "5th Edition" -> "PWB 1.0"; 
    "6th Edition" -> "LSX"; 
    "6th Edition" -> "Interdata"; 
    "Interdata" -> "Unix/TS 3.0"; 
    "Interdata" -> "PWB 2.0"; 
    "Interdata" -> "7th Edition"; 
    "7th Edition" -> "8th Edition"; 
    "7th Edition" -> "32V"; 
    "7th Edition" -> "V7M"; 
    "V7M" -> "Ultrix-11"; 
    "8th Edition" -> "9th Edition"; 
    [...] 
} 
+0

dzięki, to jest dokładnie to, czego potrzebuję. Ale niestety to nie działa dla mnie. Oto co dostaję po instalacji (korzystam z Linuksa): Ostrzeżenie: Nie można załadować "/usr/lib/graphviz/libgvplugin_neato_layout.so.6" - nie znaleziono pliku Ostrzeżenie: Nie można załadować "/ usr/lib/graphviz/libgvplugin_xlib.so.6 "- plik nie został znaleziony /tmp/alpm_ygcg87/.INSTALL: wiersz 1: 16840 Błąd segmentacji usr/bin/kropka -c błąd: polecenie nie wykonano poprawnie – maroxe

+0

@maroxe: to wygląda jak problem z aktualizacją dystrybucji; na pewno nie jest związane z OCaml, a prawdopodobnie nawet nie jest związane z grafvizją (prawdopodobnie problem z wersją 'libc' lub czym do diabła). W tym konkretnym przypadku powinieneś wypróbować swoje lokalne forum pomocy archlinux. – gasche

10

zazwyczaj jest bardzo łatwe i zabawne do korzystania z biblioteki Graphics narysować drzewo, jeśli to jest proste i nie jest zbyt głęboka.

Jeśli chcesz tekstową reprezentację:

type tree = Node of tree * int * tree | Child of int;; 
let draw tree = 
    let rec print indent tree = 
    match tree with 
     Child n -> 
     Printf.printf "%s%d\n" indent n 
    | Node (left, n, right) -> 
     Printf.printf "%s----\n" indent; 
     print (indent^"| ") left; 
     Printf.printf "%s%d\n" indent n; 
     print (indent^"| ") right; 
     Printf.printf "%s----\n" indent 
    in 
    print "" tree 
+0

Szukam narzędzie, które rysuje (bez względu na to, jak, reprezentacja ASCII jest wystarczająca) autonatycznie drzewa w oparciu o tekstowy opis, który można łatwo wygenerować. – maroxe

+1

Bardzo łatwe? Rysowanie drzewek binarnych wygląda dla mnie dość niechlujnie. Zamiast "grafiki", spróbuję użyć [mlpost] (http: //forge.ocamlcore.org/projects/mlpost /), interfejs OCaml do 'metapost', który zapewnia wyższy poziom abstrakcji; a może przynajmniej wiązanie "cairo". – gasche

+1

reprezentacja ascii jest wystarczająca? Zaktualizowałem swój post z pewnym kodem ... –