2009-02-06 46 views
5

Tôi muốn tạo bảng tra cứu trong OCaml. Bảng sẽ có 7000 mục nhập, khi tra cứu (bằng int), trả về một chuỗi. Cấu trúc dữ liệu thích hợp để sử dụng cho tác vụ này là gì? Nếu bảng được bên ngoài từ mã cơ sở và nếu như vậy, làm thế nào để đi về "bao gồm" bảng tra cứu để có thể truy cập từ chương trình của mình?Bảng tra cứu trong OCaml

Cảm ơn.

+0

gì bạn có ý nghĩa bởi "bao gồm" ở đây là không rõ ràng. Có lẽ bạn có thể đưa ra một số mã giả cho những gì bạn muốn làm? –

+0

Ý tôi là "bao gồm" là để bên ngoài dữ liệu từ mã, loại giống như một tệp tiêu đề. Điều này có thể xảy ra với OCaml không? –

+0

Vẫn không chắc chắn ý của bạn là gì. OCaml có một hệ thống biên dịch riêng biệt không yêu cầu tệp tiêu đề. Chỉ cần đảm bảo mô-đun nằm trong đường dẫn bao gồm tại thời gian biên dịch. –

Trả lời

7

Nếu chuỗi được xử lý bằng các số nguyên liên tiếp, bạn có thể sử dụng mảng.

Nếu không, bạn có thể sử dụng bảng băm (không hoạt động) hoặc Bản đồ (chức năng). Để bắt đầu với bản đồ thử:

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

module IntMap = Map.Make(Int) ;; 

Nếu bảng là quá lớn để lưu trữ trong bộ nhớ, bạn có thể lưu trữ nó trong một cơ sở dữ liệu bên ngoài và sử dụng các ràng buộc để dbm, bdb, sqlite ...

+0

Nếu được lưu trữ trong một mảng (chỉ mục IS có ý nghĩa) nhưng trong một tệp .ml riêng biệt, làm thế nào tôi có thể về "bao gồm" tệp chỉ chứa bảng/mảng tìm kiếm? –

+0

Vui lòng xem câu trả lời khác của tôi. –

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

Để lưu trữ các bảng trong một file riêng biệt (ví dụ như một mảng), chỉ cần tạo một file strings.ml với nội dung:

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

Biên dịch này với:

ocamlc -c strings.ml 

Như được giải thích trong manual, điều này xác định mô-đun Strings mà các mô-đun Ocaml khác có thể tham chiếu. Ví dụ, bạn có thể bắt đầu một mục cấp đầu:

ocaml strings.cmo 

Và tra cứu một chuỗi bằng cách truy cập vào một vị trí cụ thể trong mảng:

Strings.tbl.(1234) ;; 
+0

Với logic này, tôi đã tạo hai tệp: foo.ml và bar.ml. bar.ml chứa dòng "let x = [| 3; 2; 1 |] ;;" và foo.ml chứa "thanh mở ;;" có vẻ như xuất hiện lỗi trình biên dịch sau khi chạy ocamlc -c bar.ml rồi ocamlc -o foo foo.ml. Có gì sai ở đây? –

+0

Làm 'mở Bar ​​;;': tên mô-đun bắt đầu bằng vốn. 'ocamlc' không có' -c' cũng liên kết: bạn cung cấp tất cả các tệp cần được liên kết trong: 'ocamlc -o foo bar.cmo foo.ml' –