2009-03-09 32 views
10

Một trong những cấu trúc dữ liệu yêu thích của tôi ở trường đại học là Trie. Đó là một cấu trúc dữ liệu tuyệt vời để giữ một tập hợp lớn các chuỗi nếu các tiền tố được chia sẻ. Tra cứu cũng tốt đẹp, vì chúng được thực hiện tại O (| length |) của chuỗi bất kể có bao nhiêu chuỗi trong tập hợp.Có phải Tries vẫn là một ý kiến ​​hay về kiến ​​trúc hiện đại?

Để so sánh, một cây cân bằng sẽ là O (log N) trong số lượng các mục đã đặt, cộng với số tiền bạn trả để so sánh. Bảng băm sẽ liên quan đến tính toán băm, so sánh, v.v.

Do đó đáng ngạc nhiên với tôi là there is no Trie implementation in the standard library of most languages.

Lý do duy nhất tôi có thể đưa ra là khả năng chi phí truy cập bộ nhớ làm cho nó quá đắt. Thay vì điều tra các vị trí O (log N) nếu thực hiện tra cứu cây, bạn không thực hiện các vị trí khác nhau O (| length |), với tất cả các hậu quả. Nếu các chuỗi dài, điều này có thể sẽ là quá nhiều.

Vì vậy, tôi tự hỏi: tôi chỉ mô tả một mối quan tâm là bao nhiêu? Bạn làm gì khi bạn cần lưu trữ một tập hợp lớn hoặc bản đồ của chuỗi?

+0

"trong thư viện chuẩn của hầu hết các chức năng." ý của bạn là "trong thư viện chuẩn của hầu hết các ngôn ngữ _languages_?" –

+0

Nếu bạn định đăng câu hỏi liên quan chặt chẽ (http://stackoverflow.com/questions/623892/where-do-i-find-a-standard-trie-based-map-implementation-in-java) bạn nên liên kết chúng lại với nhau. –

+0

Tôi đã định, và sau đó đặt liên kết Wikipedia cho Trie thay vào đó ... Dù sao, bây giờ bạn đặt liên kết, vì vậy chúng tôi tốt. – Uri

Trả lời

7

Tôi đã không nghĩ đây là một lĩnh vực quan tâm trước đây, nhưng bây giờ bạn đề cập đến nó, có những lúc việc triển khai Trie chuẩn có thể hữu ích. Mặt khác, theo như tôi biết, Tries được sử dụng bởi Python và Perl và các ngôn ngữ hiểu biết về chuỗi khác mà tôi sử dụng ngay bây giờ.

Cuối cùng tôi đã kiểm tra, cách đây nhiều năm, mã hạt nhân BSD đã sử dụng Tries (Patricia Tries) trong mã để chọn giao diện tốt nhất để gửi gói. Có vẻ như Wikipedia has some info.

+0

Tôi không nghĩ Python đã tích hợp sẵn, xem ví dụ http://bugs.python.org/issue9520 –

4

Bạn chỉ có thể tạo hai ứng dụng mẫu và xem ứng dụng nào hoạt động tốt hơn. Truy cập bộ nhớ có giá rẻ giả sử bạn không có lỗi trang. Sau đó, nó rất tốn kém. Đối với phát triển ứng dụng khách, nó hầu như luôn luôn tốt hơn để xử lý hơn để truy cập bộ nhớ vì lý do này rất. Bộ vi xử lý hiện đại rất nhanh, nhưng bộ nhớ cache nhớ vẫn bị tổn thương.

+0

Tôi từng làm việc tại Intel trong nhiều năm, vì vậy tôi vô cùng hoang tưởng ngay cả khi rơi ra khỏi cùng một dòng bộ nhớ cache. Bên cạnh đó, nếu mỗi nút nằm ở vị trí khác trên vùng heap, trừ khi trình thu thập rác của tôi sắp xếp lại nội dung, tôi có thể lỗi trang rất tốt. – Uri

+1

Chúc may mắn viết bất kỳ thuật toán tìm kiếm nào nằm trong cùng một dòng bộ nhớ cache! –

+0

Tôi thực sự đã từng làm điều đó với đồ thị cố định để giải trí (nghĩ bản đồ tàu điện ngầm) và tăng tốc ấn tượng ... :) – Uri

2

Tôi đã thực hiện một số thử nghiệm hiệu suất trong C# bằng Trie và từ điển (bảng băm được đánh máy mạnh). Tôi thấy rằng từ điển nhanh hơn Trie 5-10 lần. Có lẽ việc thực hiện Trie của tôi có thể được tối ưu hóa một chút, nhưng hầu như không đủ nhanh hơn (hoặc thậm chí nhanh bằng) từ điển.

Phương pháp ContainsKey trong từ điển gần với hoạt động O (1) (tùy thuộc vào thuật toán băm tốt như thế nào), vì vậy không dễ dàng để tạo bộ sưu tập có nhịp đập miễn là thuật toán băm là hợp lý nhanh .

Với IEqualityComparer tùy chỉnh, bạn có thể sử dụng hầu hết mọi thứ làm khóa trong Từ điển, điều này làm cho nó trở nên linh hoạt hơn. Một Trie là một chút hạn chế hơn trong những gì bạn có thể sử dụng như là chìa khóa, do đó giới hạn tính hữu dụng một chút.

+3

Tất nhiên, băm có quyền truy cập nhanh hơn. Lợi thế của một trie trên một băm là hiệu quả bộ nhớ. – Frank

+0

@Frank Dictionary: lưu trữ mỗi chuỗi với chi phí thấp. Trie: lưu trữ các ký tự thông thường một lần nhưng với một chi phí phân bổ một đối tượng có ít nhất hai con trỏ (trái neighboor, con ngoài cùng bên trái). Kết luận: Trong C# ít nhất, từ điển hiệu quả hơn nhiều về mặt không gian. Tôi nói từ một kinh nghiệm buồn buồn. –