2010-09-07 39 views
6

Đối với những người không quen thuộc với tìm kiếm nội suy, đó là phương pháp tìm kiếm một giá trị trong một mảng được sắp xếp có khả năng tìm kiếm nhanh hơn tìm kiếm nhị phân. Bạn nhìn vào phần tử đầu tiên và cuối cùng và (giả sử rằng nội dung của mảng được phân bố đồng đều) nội suy tuyến tính để dự đoán vị trí.Tìm kiếm nội suy trên các chuỗi

Ví dụ: chúng tôi có một mảng có độ dài 100 với mảng [0] = 0 và mảng [99] = 99. Nếu chúng ta đang tìm kiếm 80, nó là trực quan để thử mảng [80] trên mảng [50], và nếu mảng gần phân phối đồng đều, thời gian chạy dự kiến ​​sẽ giảm xuống log(log(N))

Để biết số, vị trí cần kiểm tra được xác định theo phương trình: low + ((toFind - sortedArray[low]) * (high - low + 1))/(sortedArray[high] - sortedArray[low]).

Một ví dụ phổ biến được sử dụng để thể hiện bản chất trực quan của tìm kiếm nội suy là: hãy tưởng tượng cố gắng tìm từ 'vàng' trong từ điển. Bạn sẽ không sử dụng tìm kiếm nhị phân và đi đến một nửa điểm. Thay vào đó, bạn sẽ đi đến vị trí mong đợi.

Con người có thể tự nội suy tuyến tính chuỗi, nhưng tôi không thể tìm ra cách mã nó lên. Làm cách nào để chúng ta nội suy tuyến tính?

Trả lời

13

Để tìm "khoảng cách" giữa hai chuỗi, một phương pháp đơn giản là xem chữ cái đầu tiên khác nhau giữa chúng và gán giá trị số cho mỗi chuỗi, sau đó lấy sự khác biệt.

Ví dụ: khoảng cách từ "a" đến "y" sẽ là 24 và khoảng cách từ "y" đến "z" sẽ là 1, nếu mỗi chữ cái được gán giá trị bằng vị trí của nó trong bảng chữ cái.

Phương pháp hoạt động tốt hơn sẽ đi qua từ điển để cân các chữ cái khác nhau theo mức độ thông dụng của từ.

Một sàng lọc khác là xem hai ký tự - "aa" cách xa "bz" hơn "az" là từ "ba", ví dụ. Đi xa hơn hai nhân vật sẽ không mua cho bạn nhiều.

Lý do phương pháp này không phổ biến hơn là nó làm phức tạp thuật toán tìm kiếm nhị phân mà không có nhiều lợi ích. Nếu bạn đã đến lúc nó thậm chí bạn có thể thấy rằng tìm kiếm nhị phân chuẩn nhanh hơn; những gì bạn đạt được trong việc so sánh ít hơn bạn bị mất trong sự phức tạp của việc xác định khoảng cách.

Cũng lưu ý rằng hiệu suất xấu nhất của thuật toán này kém hơn tìm kiếm nhị phân. Hãy xem xét ví dụ tìm kiếm "ae" trong danh sách "aa", "ab", "ac", "ad", "ae", "zz" - outlier "zz" sẽ thiên vị tìm kiếm để luôn cố gắng bắt đầu phạm vi tìm kiếm. Nó giảm xuống O (n) trong các điều kiện này.

+0

Những điểm tốt xung quanh. +1 –

+0

Độ phức tạp thêm là 2 mult/div + 5 add/sub. Tôi đã thử nghiệm nó và, có, nó là một chút chậm hơn so với tìm kiếm nhị phân (nếu N không phải là vô lý). Nhưng nếu so sánh là không tầm thường (như trong trường hợp dây) thì nó có thể trở nên đáng giá. – user108088

+0

@ user108088, độ phức tạp cũng nằm trong khoảng cách tính toán, điều này cũng sẽ không nhỏ trong trường hợp chuỗi. Xem chỉnh sửa của tôi. –