2009-02-06 6 views
5

Ich möchte eine Lookup-Tabelle in OCaml erstellen. Die Tabelle enthält mehr als 7.000 Einträge, die beim Suchen (durch int) eine Zeichenkette zurückgeben. Was ist eine geeignete Datenstruktur für diese Aufgabe? Sollte die Tabelle aus dem Basiscode externalisiert werden und wenn ja, wie geht man daran, die Nachschlagetabelle "einzubinden", um von seinem Programm aus zugänglich zu sein?Lookup-Tabellen in OCaml

Danke.

+0

, was Sie unter "einschließlich" hier ist nicht klar. Vielleicht könnten Sie einen Pseudo-Code für das, was Sie tun möchten, geben? –

+0

Was ich unter "including" verstehe, ist die Externalisierung der Daten aus dem Code, ähnlich einer Header-Datei. Ist das mit OCaml möglich? –

+0

Immer noch nicht sicher, was du meinst. OCaml hat ein separates Kompilierungssystem, das keine Header-Dateien benötigt. Stellen Sie nur sicher, dass sich das Modul zur Kompilierungszeit im Include-Pfad befindet. –

Antwort

7

Wenn die Strings mit aufeinanderfolgenden Ganzzahlen adressiert werden, können Sie ein Array verwenden.

Andernfalls können Sie eine Hash-Tabelle (nicht funktionsfähig) oder eine Karte (funktional) verwenden. Um mit der Karte Versuch gestartet:

module Int = 
struct 
    type t = int 
    let compare = compare 
end ;; 

module IntMap = Map.Make(Int) ;; 

Wenn die Tabelle zu groß ist, im Speicher zu speichern, könnten Sie es speichern, in einer externen Datenbank und verwenden Bindungen dbm, BDB sqlite ...

+0

Wenn ich in einem Array gespeichert habe (der Index ist von Bedeutung), aber in einer separaten .ml-Datei, wie könnte ich die Datei "einbeziehen", die nur die Nachschlagetabelle/das Array enthält? –

+0

Bitte sehen Sie meine andere Antwort. –

5
let table : (int,string) Hashtbl.t = Hashtbl.create 8192 
4

Zum speichern der Tabelle in einer separaten Datei (als Array Eg), einfach eine Datei erstellen strings.ml mit dem Inhalt:

let tbl = [| 
    "String 0"; 
    "String 1"; 
    "String 2"; 
    ...7000 more... 
|] 

Dieser Kompilieren mit:

ocamlc -c strings.ml 

Wie in der manual erläutert, definiert dies ein Modul Strings, dass andere Ocaml-Module verweisen können. Zum Beispiel können Sie ein Top-Level-Start:

ocaml strings.cmo 

und eine String-Lookup durch eine bestimmte Position in dem Array zuzugreifen:

Strings.tbl.(1234) ;; 
+0

Mit dieser Logik habe ich zwei Dateien erstellt: foo.ml und bar.ml. bar.ml enthält die Zeile "let x = [| 3; 2; 1 |] ;;" und foo.ml enthält "open bar ;;", was nach dem Ausführen von ocamlc -c bar.ml und dann ocamlc -o foo foo.ml einen Compiler-Fehler zu verursachen scheint. Was ist hier falsch? –

+0

Do 'open Bar ;;': Modulnamen beginnen mit einem Großbuchstaben. 'ocamlc' ohne' -c' führt auch eine Verknüpfung durch: Sie stellen alle Dateien zur Verfügung, die verlinkt werden müssen: 'ocamlc -o foo bar.cmo foo.ml' –