2012-03-01 32 views
5

Tôi đoán đây là một trong những câu hỏi phỏng vấn thường gặp nhất, nhưng tôi không thể giải quyết nó một cách hiệu quả (hiệu quả có nghĩa là độ phức tạp và thời gian sử dụng thấp hơn) Cấu trúc dữ liệu phù hợp). Vấn đề là theo cách này: Nếu có một số m x n matrix của ký tự (nói haystack) và một chuỗi ký tự có độ dài là char nhất định (kim). Viết chương trình để kiểm tra xem đống cỏ khô có chứa kim hay không. Xin lưu ý rằng chúng ta cần phải tìm kiếm haystack chỉ từ trên xuống dưới hoặc sang trái sang phải. Ví dụTìm kiếm "kim" trong hai "haystack" số

Haystack 

ahydsfd 
sdflddl 
dfdfd 
dfdl 
uifddffdhc 

Needle: 
hdffi 

Output: 
Yes Found!! 
+0

Có vấn đề gì khi tìm kiếm từ trái sang phải một cách riêng biệt? –

+0

Tôi được hai người phỏng vấn liên tiếp nói rằng có cách tiếp cận tốt hơn. Tôi không chắc chắn, "tốt hơn" theo ý nghĩa của chúng. – hytriutucx

+0

@ javacoder990: bạn đã không hỏi người phỏng vấn ý của họ là gì? –

Trả lời

8

Bruteforce ngây thơ là O (m * n * k). Dưới đây là một số ý tưởng để tối ưu hóa.

Độc thân Tìm kiếm
Thay vì làm một tìm kiếm cho horizontals và sau đó khác cho ngành dọc, làm cả hai cùng một lúc. Mỗi khi bạn tìm thấy một sự xuất hiện của lá thư đầu tiên của kim tìm kiếm một kết hợp ngang và dọc bắt đầu từ chữ đó. Điều này sẽ không cải thiện sự phức tạp, nhưng trong nhiều trường hợp, điều này có thể giảm một nửa thời gian vì bạn sẽ chỉ nhìn vào những khởi đầu tồi tệ một lần.

Chữ cái hiếm
Thay vì tìm chữ cái đầu tiên của kim, hãy tìm chữ hiếm nhất xuất hiện trong kim. Điều này sẽ loại trừ rất nhiều các trận đấu có thể. Để xác định các chữ cái nào là hiếm nhất hoặc quét qua toàn bộ bảng hoặc sử dụng lấy mẫu ngẫu nhiên.

Efficient Chuỗi Tìm kiếm
Sử dụng tốt hơn string searching algorithm như Knuth–Morris–Pratt. Tìm kiếm từng hàng và từng cột riêng lẻ bằng thuật toán. Cá cược của tôi là đây là những gì mà những người phỏng vấn đang theo dõi, vì nó làm giảm độ phức tạp của O (m * n).

Khai thác hàng ngắn
Tôi nhận thấy rằng không phải tất cả các hàng đều có cùng độ dài. Khi bạn tìm kiếm các đối sánh theo chiều dọc, bạn có thể ngừng tìm kiếm trên hàng đó ngay khi kim 'bật ra' của bao, vì tất cả các kim dọc theo hàng cũng sẽ thoát khỏi bao tải và do đó không thể khớp.

+1

Xác định các chữ cái hiếm nhất bằng cách quét toàn bộ có nghĩa là bạn truy cập mọi ô, trong hầu hết các trường hợp là số lượng công việc lớn nhất, ngoại trừ bảng chỉ chứa gần - ví dụ - 'd' và kim bắt đầu bằng d và bao gồm chủ yếu là 'd's quá. Nhưng nếu không có kiến ​​thức thêm (thậm chí phân phối các ký tự, ký tự mã thông báo từ một văn bản trong ngôn ngữ x, ...) về văn bản, phân tích văn bản có thể mất nhiều thời gian hơn là chỉ bắt đầu làm việc. Miễn là kích thước ma trận không được biết, ngay cả một mẫu ngẫu nhiên của 100 ký tự có thể không có sẵn. Chúng ta cũng không biết, nếu nó là đại diện. –

0

Phương pháp brute force sẽ có độ phức tạp thời gian tồi tệ nhất của m * n.That là nếu kim là nhân vật duy nhất và chúng tôi bắt đầu phân tích ma trận hàng khôn ngoan hoặc cột khôn ngoan.

+0

Tất nhiên nếu kim có độ dài x ký tự thì nó có thể được tối ưu hóa để có độ phức tạp của (m-x-1) * n! – mawia

+0

Vấn đề là với kim dài hơn. –

0

Bạn có thể hạn chế tìm kiếm từ cột đầu tiên đến cột n và k và hàng m-k. Sau khi tìm thấy, 2 (k-1) sẽ so sánh được yêu cầu cho câu trả lời.

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