Thuật toán này vẫn có thể được coi là thuật toán Tìm kiếm nhị phân?


13

Trong khi thực hiện thứ hai kata (yêu cầu bạn thực hiện thuật toán tìm kiếm nhị phân năm lần, mỗi lần với một phương thức khác nhau), tôi đã đưa ra một giải pháp hơi khác, hoạt động như sau:

Nếu tôi có một mảng được sắp xếp theo chiều dài 100 và tôi thấy trường bắt đầu của nó chứa số 200 và trường kết thúc của nó chứa số 400, tôi, với tư cách là một nhà toán học nghiên cứu về con người, có thể sẽ bắt đầu tìm kiếm xung quanh trường 35 nếu tôi đang tìm kiếm số 270, chứ không phải trường 50 như trong thuật toán tìm kiếm nhị phân thông thường.

Sau đó, nếu số trên trường 35 của mảng là 270, 35 là chỉ mục tôi đang tìm kiếm.

Nếu đó không phải là trường hợp tôi có thể so sánh số tôi đã nhận (giả sử 280) và lặp lại thao tác lấy phần dưới của mảng (vì vậy tôi có 35 trường với trường bắt đầu chứa 200 và trường kết thúc chứa 280) nếu số tôi tìm thấy lớn hơn số tôi đang tìm kiếm hoặc phần trên của mảng (giả sử tôi có 260: bây giờ tôi có 65 chỉ mục, số đầu tiên chứa 260 và số cuối cùng chứa 400. Theo định hướng, tôi sẽ hướng về phía trước chỉ số 4 của mảng phụ này, là chỉ số 39 của toàn bộ mảng) nếu số tôi nhận được nhỏ hơn số tôi đang tìm kiếm.

Câu hỏi là: thuật toán này có thể được coi là thuật toán tìm kiếm nhị phân không? Nếu không, nó có tên riêng của nó?


2
Cho dù đó là tìm kiếm nhị phân hay không dường như hoàn toàn là vấn đề quan điểm. Về cơ bản, câu trả lời duy nhất bạn có thể đưa ra là "Vâng, nó đủ gần với tìm kiếm nhị phân để gọi nó là tìm kiếm nhị phân" hoặc "Không, không phải vậy." Tranh cãi nảy sinh.
David Richerby

Câu trả lời:


22

Tôi sẽ không gọi đây là một tìm kiếm nhị phân.

Nó rõ ràng tương tự như tìm kiếm nhị phân và thật tự nhiên khi xem nó như một sàng lọc của tìm kiếm nhị phân. Tuy nhiên, nó có các đặc điểm phức tạp thuật toán khác nhau đáng kể, Tìm kiếm nội suy dự kiến ​​thời gian chạy của O (log (log (n)) giả sử dữ liệu được phân phối đồng đều, tuy nhiên nó trả tiền cho điều này bằng cách có thời gian chạy trường hợp xấu nhất O (n).

Tôi thích nói "Thời gian chạy trường hợp xấu nhất của tìm kiếm nhị phân là O (log (n))" thay vì "Tùy thuộc vào sự lựa chọn các yếu tố giới hạn, thời gian chạy trường hợp xấu nhất của tìm kiếm nhị phân là O (log (n))". Điều này có nghĩa là tôi không thể phân loại tìm kiếm Nội suy thành thuật toán tìm kiếm nhị phân.


Có lẽ nếu bạn thoát ra khỏi tìm kiếm nội suy khi nó đang diễn ra tồi tệ, bạn có thể giữ lại trường hợp xấu nhất O (log n) và O (log log n) trên dữ liệu tuyến tính đủ. Tôi đoán là một cái gì đó như "nếu tôi không tìm thấy mục tiêu sau khi log n cố gắng thì chuyển sang tìm kiếm nhị phân" sẽ hoạt động, nhưng tôi quá lười để chứng minh điều đó. Tất nhiên sẽ có một lớp các đầu vào sát thủ mà về cơ bản phải mất gấp đôi thời gian tìm kiếm nhị phân.
Steve Jessop

Đó là ý tưởng giết người đầu vào là thú vị. Điều gì sẽ xảy ra nếu thay vì cho phép các đầu vào sát thủ ảnh hưởng tiêu cực đến tìm kiếm (nghĩa là bằng cách chia gần cuối mảng), chúng tôi giới hạn / cắt "phạm vi có thể chia tách" thành thứ ba thứ hai của mảng hoặc tương tự. Điều đó sẽ có trường hợp xấu nhất log3 (n) nhưng vẫn được hưởng trường hợp tốt nhất log (log).
Andrew Gallasch

@SteveJessop Hãy nhớ rằng độ phức tạp tiệm cận không phải là bức tranh hoàn chỉnh. O (log n) rất nhanh. Ngoài ra, tìm kiếm nhị phân thực hiện rất ít công việc trong mỗi vòng lặp. Vì vậy, vấn đề đối với tìm kiếm Nội suy là bạn cần đầu vào rất dài để bù cho thực tế là bạn làm nhiều việc hơn trên mỗi vòng lặp. Bạn đề nghị thêm nhiều công việc vào đó. Nếu tôi không thể chấp nhận O (n) cho dữ liệu không thống nhất, tôi nghi ngờ giải pháp tốt nhất là tìm kiếm nhị phân thuần túy, thay vì một phương pháp lai.
Taemyr

@SteveJessop: Không cần chuyển đổi thuật toán; điều này có thể được thực hiện song song. Cho một phạm vi R, bạn có thể xác định điểm P1 là trung điểm thông thường cho tìm kiếm nhị phân và P2 bằng cách sử dụng phép nội suy. Bây giờ bạn đã có ba phần phụ, không có phần nào có thể lớn hơn một nửa phạm vi ban đầu. Kiểm tra giá trị mục tiêu so với cả P1 và P2 và bạn biết phần nào trong ba phần phụ sẽ được lặp lại.
MSalters

16

Ôi(đăng nhậpđăng nhậpn)


Mát mẻ. Bây giờ câu hỏi là nếu tôi có thể sử dụng nó cho mã kata, nhưng đó là vấn đề của tôi lol. Tôi đang tìm thấy nó phức tạp hơn tìm kiếm nhị phân mặc dù vậy tại sao không.
dùng6245072

Tôi đã phát hiện ra điều này một lần khi viết mã để lập chỉ mục một tệp nhật ký vài năm trước. Tôi cũng phát hiện ra rằng đối với dữ liệu của mình, các bước xen kẽ giữa phép nội suy và lát nhị phân tốt hơn so với tùy chọn của chính nó. Tôi không chắc nếu nó có tên, hoặc là một hiệu ứng được biết đến.
Neil Slater

@NeilSlater tìm kiếm nội suy hedged có lẽ?
Steve Cox

@SteveCox: Tôi chỉ tìm kiếm thuật ngữ đó và không tìm thấy gì. Quyết định hỏi đó như một câu hỏi mới: cs.stackexchange.com/questions/59750/ mẹo
Neil Slater

-1

Tôi nghĩ rằng thuật ngữ chính xác sẽ là tìm kiếm suy ngẫm dychotomial.

Bạn tìm kiếm trong một mảng phẳng với tìm kiếm suy ngẫm tiếp theo dựa trên phân phối phẳng được cho là của các số trong đó.

Điều này tương ứng với cách một người sẽ tìm kiếm một từ trong từ điển. Nhưng nó có thể rất không hiệu quả nếu việc phân phối dữ liệu không thường xuyên.

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.