2011-03-02 53 views
10

Đây là một cuộc phỏng vấn question: Tìm tất cả (từ tiếng Anh) chất nền của một chuỗi nhất định. (every = every, ever, very).Tìm tất cả (từ tiếng Anh) chất nền của một chuỗi đã cho

Rõ ràng, chúng ta có thể lặp qua tất cả các chất nền và kiểm tra từng chất chống lại một từ điển tiếng Anh, được tổ chức như một bộ. Tôi tin rằng từ điển đủ nhỏ để phù hợp với RAM. Cách sắp xếp từ điển? Đối với như tôi nhớ, lệnh spell gốc đã tải tệp words trong một bitmap, đại diện cho một tập hợp các giá trị băm từ. Tôi sẽ bắt đầu từ đó.

Một giải pháp khác là một trie được tạo từ từ điển. Sử dụng trie chúng ta có thể lặp qua tất cả các ký tự chuỗi và kiểm tra trie cho mỗi ký tự. Tôi đoán sự phức tạp của giải pháp này sẽ giống nhau trong trường hợp xấu nhất (O(n^2))

Có hợp lý không? Bạn có đề xuất các giải pháp khác không?

+0

Độ phức tạp của vòng lặp trên tất cả các bệ kiểm tra băm phụ thuộc vào tính toán băm của bạn - có theta (n^2) đế có chiều dài trung bình không O (1), vì vậy bạn cần tính băm một phần mà bạn có thể tăng thêm một ký tự tại một thời điểm để giữ O (n^2) tổng thể. Điều tương tự cũng đúng với tra cứu Trie hoặc DAWG, tất nhiên, bạn muốn giảm dần việc kiểm tra tất cả các chuỗi bắt đầu từ một điểm nhất định, nhưng rõ ràng là nó là điều đúng đắn để làm. –

+0

Đi bộ trie, bắt đầu từ mọi nhân vật có thể bắt đầu và xuất ra tất cả các từ ngữ pháp lý khi bạn thấy chúng có vẻ hiệu quả; bạn ngừng tìm kiếm ngay sau khi bạn tìm thấy một chuỗi ký tự không thể là tiền tố của một từ và bạn không thể làm tốt hơn O (n^2) - có thể mọi chuỗi con đều hợp lệ và có O (n^2) trong số đó. –

Trả lời

1

Tôi không chắc Trie sẽ hoạt động dễ dàng để khớp các từ phụ bắt đầu ở giữa chuỗi hay không.

Một giải pháp khác có khái niệm tương tự là sử dụng máy trạng thái hoặc cụm từ thông dụng. cụm từ thông dụng chỉ là word1 | word2 | .... Tôi không chắc liệu các công cụ biểu thức thông thường có thể xử lý một cụm từ bao gồm toàn bộ ngôn ngữ tiếng Anh hay không, nhưng không khó để xây dựng máy trạng thái tương đương từ điển.

Khi biểu thức chính quy được biên dịch \ máy nhà nước được xây dựng sự phức tạp của việc phân tích một chuỗi cụ thể là O (n)

+0

Điều này về cơ bản giống như giải pháp trie. – biziclop

+1

@ biziclop- Tôi đã làm việc với một thư viện chứa DFA tối thiểu cho tất cả tiếng Anh và gọn nhẹ hơn nhiều so với một Trie chuẩn. Vâng, về cơ bản nó giống như bộ ba, nhưng nó hiệu quả hơn nhiều về bộ nhớ. – templatetypedef

1

Các giải pháp đầu tiên có thể được tinh chế để có một bản đồ băm khác nhau cho mỗi chiều dài từ (để giảm va chạm) nhưng khác hơn là tôi không thể nghĩ ra bất cứ điều gì tốt hơn đáng kể.

6

Aho-Corasick string matching algorithm "xây dựng một máy trạng thái hữu hạn giống như một bộ ba với các liên kết bổ sung giữa các nút nội bộ khác nhau."
Nhưng mọi thứ được coi là "xây dựng một trie từ từ điển tiếng Anh và thực hiện tìm kiếm đồng thời trên tất cả các hậu tố của chuỗi đã cho" nên khá tốt cho một cuộc phỏng vấn.

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