2013-03-19 40 views
9

Phương pháp hiệu quả nhất để tìm kiếm một từ từ cơ sở dữ liệu từ điển là gì. Tôi đã tìm kiếm câu trả lời và mọi người đã đề xuất sử dụng cấu trúc dữ liệu trie. Nhưng chiến lược tạo cây cho một số lượng lớn các từ sẽ là tải bộ nhớ chính. Tôi đang cố gắng tạo một ứng dụng Android liên quan đến việc triển khai này cho dự án cấu trúc dữ liệu của tôi. Vì vậy, bất cứ ai có thể cho tôi biết làm thế nào để làm việc từ điển.cách tìm kiếm một từ đã cho từ một cơ sở dữ liệu khổng lồ?

Ngay cả khi tôi sử dụng từ điển t9 trong điện thoại, các đề xuất cho các từ xuất hiện rất nhanh trên màn hình. Tò mò để biết thuật toán và thiết kế đằng sau nó.

+0

Điều này có thể hữu ích khi biết T9 [T9 hoạt động như thế nào] (http://stackoverflow.com/questions/2574016/data-structure-behind-t9-type-of-dictionary) –

+0

@MukulGoel Thanx. tìm thấy liên kết của bạn hữu ích. Tuy nhiên, để kiểm tra xem tôi sẽ có thể thực hiện nó .. Vẫn còn học được một cái gì đó mới từ đó ..Thanx :) –

+0

bạn đã thử một cây từ điển .. – Anshul

Trả lời

9

Bạn có thể sử dụng Trie hữu ích nhất để tìm kiếm từ điển lớn. Bởi vì có quá nhiều từ đang sử dụng khởi động tương tự, trie brgins xung quanh tìm kiếm yếu tố liên tục, bạn cũng có thể sử dụng tại chỗ, với số lượng hạn chế truy cập vào bộ nhớ vật lý. Bạn có thể tìm thấy nhiều triển khai trong web.

Nếu ai đó không quen thuộc với Trie, tôi nghĩ this trang web là tốt và tôi chỉ trích mẫu của họ ở đây:

Một Trie (từ hồi), là một cấu trúc cây đa chiều rất hữu ích cho lưu trữ chuỗi trên bảng chữ cái. Nó đã được sử dụng để lưu trữ lớn từ điển tiếng Anh (nói) từ trong các chương trình kiểm tra chính tả và trong các chương trình "hiểu biết" ngôn ngữ tự nhiên. Căn cứ vào dữ liệu:

an, ant, all, allot, alloy, aloe, are, ate, be 

các Trie tương ứng sẽ là: Sample Trie for above words

này là tốt thực tiễn thực hiện Trie trong java: http://code.google.com/p/google-collections/issues/detail?id=5

+0

Nhưng tạo ra một trie 10.000 từ có thể là một vấn đề trong một ứng dụng Android như tôi đã đề cập trong câu hỏi của tôi. Vâng bạn bè của tôi nói rằng tải trie cho nhiều từ này sẽ làm cho điện thoại di động để buộc bỏ các ứng dụng: | .. –

+0

@AcesSmart, Trước hết bạn nói bạn của bạn đề nghị bạn sử dụng "cây" nhưng sau một giờ khi bạn thấy câu trả lời và nhận xét, bạn đã đổi thành "trie", đây là gian lận và cũng là câu hỏi mới. Cũng vì bạn không quen thuộc với "trie" bạn nghĩ vậy, Đây là thứ hoạt động ở mọi nơi, nhỏ hơn nhiều so với cách tiếp cận "cây" của bạn, như tôi đã nói trong câu trả lời, bạn có thể sử dụng nó "tại chỗ", có nghĩa là mà không tải trong bộ nhớ, rất nhiều công cụ tìm kiếm đang sử dụng "trie", và có vẻ như bạn là người đầu tiên trên thế giới nói rằng nó không được áp dụng trong ứng dụng di động của bạn. –

+0

Ngoài ra nếu câu hỏi của bạn có một số upvote là bởi vì bạn đã đề cập bạn bè của bạn đề nghị "cây" cách tiếp cận, nhưng trong trường hợp anh/cô ấy đề nghị "trie" cách tiếp cận và vẫn còn bạn có một câu hỏi, đây là câu hỏi funny, tôi khá chắc chắn bạn đã không kiểm tra nó. (hãy nhớ rằng chỉnh sửa của bạn có sẵn trong lịch sử, vì vậy bạn không thể thay đổi hoàn toàn câu hỏi của mình, điều này cũng khiến nhiều người thay đổi câu trả lời của tôi, họ sẽ nói tại sao tôi trả lời theo cách này cho câu hỏi này, nhưng bạn có thể đặt câu hỏi mới) –

0

Có rất nhiều cách để làm điều đó. Cái mà tôi đã sử dụng một thời gian trước đây (đặc biệt tốt nếu bạn không thay đổi từ điển của bạn) là tạo ra một chỉ mục tiền tố.

Tức là, bạn sắp xếp các mục nhập lexicologicaly. Sau đó, bạn lưu các vị trí (cuối) của các phạm vi cho các chữ cái đầu tiên khác nhau. Tức là, nếu các mục của bạn có các chỉ mục từ 1 đến 1000, và các từ "aardvark - azerbaijan" lấy phạm vi từ 1 đến 200, bạn tạo một mục trong một bảng riêng "a | 200", thì bạn cũng làm như vậy cho lần đầu tiên và chữ cái thứ hai. Sau đó, nếu bạn cần tìm một từ cụ thể, bạn sẽ giảm đáng kể phạm vi tìm kiếm. Trong trường hợp của tôi, chỉ số trên hai chữ cái đầu tiên là khá đầy đủ.

Một lần nữa, phương pháp này yêu cầu bạn sử dụng một DB, như SQLite, mà tôi nghĩ là có mặt trên Android.

-1

Sử dụng trie thực sự là không gian, chỉ cần nhận ra khi tôi kiểm tra việc sử dụng RAM sau khi tải 150.000 từ vào trie, mức sử dụng là 150 MB (Trie được thực hiện bằng C++). Mức tiêu thụ bộ nhớ rất lớn do con trỏ. Tôi đã kết thúc với cố gắng ba lần mà có rất ít bộ nhớ lãng phí khoảng 30 MB (so với 150 MB) nhưng độ phức tạp thời gian đã tăng lên một chút. Một lựa chọn khác là sử dụng "Left child Right anh chị em" trong đó có rất ít lãng phí bộ nhớ nhưng phức tạp thời gian là nhiều hơn so với trie ternary.

Các vấn đề liên quan