2009-02-06 12 views
5

Vorrei creare una tabella di ricerca in OCaml. La tabella avrà 7000+ voci che, dopo la ricerca (per int), restituiscono una stringa. Qual è una struttura dati appropriata da utilizzare per questa attività? La tabella dovrebbe essere esternalizzata dal codice base e, in caso affermativo, come si fa a "includere" la tabella di ricerca per essere accessibile dal suo programma?Tabelle di ricerca in OCaml

Grazie.

+0

Cosa si intende per "tra cui" qui non è chiaro. Forse potresti dare qualche pseudo-codice per quello che ti piacerebbe fare? –

+0

Quello che intendo per "includere" è esternare i dati dal codice, un po 'come un file di intestazione. È possibile con OCaml? –

+0

Ancora non sei sicuro di cosa intendi. OCaml ha un sistema di compilazione separata che non richiede file di intestazione. Assicurati solo che il modulo si trovi nel percorso di inclusione al momento della compilazione. –

risposta

7

Se le stringhe vengono indirizzate utilizzando interi consecutivi, è possibile utilizzare un array.

Altrimenti è possibile utilizzare una tabella hash (non funzionale) o una mappa (funzionale). Per iniziare con la mappa try:

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

module IntMap = Map.Make(Int) ;; 

Se la tabella è troppo grande per memorizzare nella memoria, è possibile memorizzare in un database esterno e utilizzare attacchi a dbm, BdB, sqlite, ...

+0

Se memorizzato in un array (l'indice È significativo) ma in un file .ml separato, come potrei fare per "includere" il file che contiene solo la tabella/array di ricerca? –

+0

Si prega di vedere la mia altra risposta. –

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

Per memorizzare la tabella in un file separato (ad esempio come un array), è sufficiente creare un file strings.ml con il contenuto:

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

compilare questo con:

ocamlc -c strings.ml 

Come spiegato nello manual, questo definisce un modulo Strings a cui altri moduli Ocaml possono fare riferimento. Ad esempio, è possibile avviare un primo livello:

ocaml strings.cmo 

e la ricerca di una stringa accedendo una posizione particolare nella matrice:

Strings.tbl.(1234) ;; 
+0

Con questa logica ho creato due file: foo.ml e bar.ml. bar.ml contiene la riga "let x = [| 3; 2; 1 |] ;;" e foo.ml contiene "open bar ;;" che sembra incorrere in un errore del compilatore dopo l'esecuzione di ocamlc -c bar.ml quindi ocamlc -o foo foo.ml. Cosa c'è che non va qui? –

+0

Do 'open Bar ;;': i nomi dei moduli iniziano con una maiuscola. 'ocamlc' senza' -c' fa anche il linking: fornisci tutti i file che devono essere collegati in: 'ocamlc -o foo bar.cmo foo.ml' –