Tìm kiếm nội suy so với Tìm kiếm nhị phân


13

Khi nào tôi nên sử dụng tìm kiếm nội suy thay vì tìm kiếm nhị phân?

Ví dụ: tôi có một tập dữ liệu được sắp xếp, trong những tình huống tôi sẽ sử dụng tìm kiếm nhị phân để tìm một mục trong tập dữ liệu này hoặc trong tình huống nào tôi nên sử dụng tìm kiếm nội suy?

Những tính chất của bộ dữ liệu sẽ là yếu tố quyết định?

Câu trả lời:


12

Rõ ràng, để thực hiện tìm kiếm nội suy, bạn cần một số loại khóa được biết nhiều hơn thứ tự - bạn phải có thể tính toán trên các khóa để ước tính khoảng cách có thể, không chỉ so sánh các khóa để xác định khóa nào lớn hơn hoặc ít hơn

Theo như các thuộc tính của bộ dữ liệu, nó chủ yếu thuộc về một thuộc tính: khả năng các khóa được phân bổ hợp lý (hoặc ít nhất là có thể dự đoán) được phân bổ trong phạm vi khả năng. Không có điều đó, một tìm kiếm nội suy thực sự có thể chậm hơn tìm kiếm nhị phân.

Ví dụ, hãy xem xét một tập dữ liệu với các chuỗi chữ cái viết thường làm khóa. Giả sử bạn có một khóa bắt đầu bằng "x". Một tìm kiếm nội suy sẽ chỉ rõ rằng bạn nên bắt đầu tìm kiếm rất gần với phần cuối của tập hợp. Tuy nhiên, nếu hầu hết các khóa của bạn thực sự bắt đầu bằng 'z' và hầu như không có bất kỳ thứ gì từ 'a' mặc dù 'y', thì khóa bạn đang tìm kiếm có thể thực sự rất gần với phần đầu của tập hợp. Nó có thể / có thể mất một số lần lặp đáng kể trước khi tìm kiếm gần với điểm bắt đầu mà chuỗi bắt đầu bằng 'w' cư trú. Mỗi lần lặp sẽ chỉ loại bỏ ~ 10% bộ dữ liệu khỏi xem xét, do đó, sẽ mất vài lần lặp trước khi nó gần với điểm bắt đầu trong đó các khóa bắt đầu bằng 'w'

Ngược lại, một tìm kiếm nhị phân sẽ bắt đầu ở giữa, đến điểm một phần tư ở lần lặp thứ hai, một phần tám trên phần ba, v.v. Hiệu suất của nó sẽ gần như không bị ảnh hưởng bởi độ lệch trong các phím. Mỗi lần lặp sẽ loại bỏ một nửa tập dữ liệu khỏi xem xét, giống như các khóa được phân bổ đều.

Tôi đẩy nhanh thêm, tuy nhiên, nó thực sự không mất khá một bản phân phối lệch phải thực hiện một suy tìm kiếm đáng tồi tệ hơn một tìm kiếm nhị phân. Nó có thể, ví dụ, hoạt động khá tốt ngay cả khi có sự phân cụm cục bộ.

Tôi cũng nên đề cập rằng tìm kiếm nội suy không nhất thiết phải sử dụng phép nội suy tuyến tính. Ví dụ: nếu các khóa của bạn được biết là tuân theo một số phân phối phi tuyến tính (ví dụ: đường cong hình chuông), việc xem xét điều đó trong hàm nội suy để có kết quả khác với việc phân phối đồng đều trở nên khá dễ dàng.


1
Vấn đề bạn mô tả có thể dễ dàng điều chỉnh bằng cách sử dụng các yếu tố đầu tiên và cuối cùng để xác định phạm vi thay vì giả sử Int.MIN_VALUE và Int.MAX_VALUE, mà tôi tin rằng (ít nhất đó là cách tôi học thuật toán) là cách mà hầu hết đã làm.
Malfist

2
@Malfist: Điều đó có thể giúp, nhưng không nhất thiết phải khắc phục vấn đề. Trong ví dụ, nếu bạn có các phím 0 bắt đầu bằng bất cứ thứ gì từ (giả sử) 'a' đến 'q', phép nội suy sẽ diễn ra khá suôn sẻ. Một ngoại lệ duy nhất bắt đầu với a, tuy nhiên, sẽ làm giảm hiệu suất đáng kể.
Jerry Coffin

1

Tôi có thể nghĩ rằng câu hỏi là làm thế nào bạn có thể dễ dàng đưa ra một hàm nội suy thực sự tốt hơn tìm kiếm nhị phân.

Từ Wikipedia về Tìm kiếm nội suy:

Sử dụng ký hiệu big-O, hiệu suất của thuật toán nội suy trên tập dữ liệu có kích thước N là O (N); tuy nhiên theo giả định phân phối dữ liệu thống nhất trên thang đo tuyến tính được sử dụng cho phép nội suy, hiệu suất có thể được hiển thị là O (log log N).

Hiệu suất thực tế của tìm kiếm nội suy phụ thuộc vào việc số lượng đầu dò giảm có lớn hơn các phép tính phức tạp hơn cần thiết cho mỗi đầu dò hay không. Nó có thể hữu ích cho việc định vị một bản ghi trong một tệp được sắp xếp lớn trên đĩa, trong đó mỗi đầu dò liên quan đến tìm kiếm đĩa và chậm hơn nhiều so với số học nội suy.

Các cấu trúc chỉ mục như cây B cũng làm giảm số lượng truy cập đĩa và thường được sử dụng để lập chỉ mục dữ liệu trên đĩa vì chúng có thể lập chỉ mục nhiều loại dữ liệu và có thể được cập nhật trực tuyến. Tuy nhiên, tìm kiếm nội suy có thể hữu ích khi người ta buộc phải tìm kiếm một số bộ dữ liệu trên đĩa được sắp xếp nhưng không được lập trình.


0

Tìm kiếm nhị phân và tìm kiếm nội suy đều được coi là phương pháp tìm kiếm tuyến tính.

Cả hai đều mong muốn danh sách đang được tìm kiếm sẽ được sắp xếp trên cột được gọi là khóa . Cái này rất quan trọng.

Tìm kiếm nhị phân hoạt động cho các chuỗi hoặc số miễn là chúng được lưu trữ theo thứ tự được sắp xếp. Ý tưởng chính đằng sau tìm kiếm nhị phân là nó dựa trên việc kiểm tra phần tử ở giữa. Tìm kiếm nội suy là một biến thể. Thay vì sử dụng phần tử chính xác ở giữa, nó đoán vị trí của phần tử tiếp theo để so sánh với giá trị được truyền. Xem tài liệu tham khảo được cung cấp bởi câu trả lời của JB King hoặc câu trả lời dưới đây trong câu trả lời này để biết chi tiết về cách thuật toán tìm kiếm nội suy tính toán giá trị khóa tiếp theo.

"Tìm kiếm nội suy chỉ hoạt động trên các phần tử số được sắp xếp theo thứ tự mảng được sắp xếp với phân bố đồng đều (nghĩa là khoảng giữa các phần tử liên tiếp gần như không đổi" (trích dẫn từ tham chiếu bên dưới P 737, cũng bao gồm so sánh hiệu suất giữa các phương pháp tìm kiếm tuyến tính khác nhau ).

Sách của Google - Cấu trúc dữ liệu cổ điển 2Nd Ed.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.