Có nghiên cứu hay lý thuyết nào đằng sau việc kết hợp tìm kiếm nhị phân và tìm kiếm nội suy không?


14

Tôi vừa đọc Thuật toán này có thể vẫn được coi là thuật toán Tìm kiếm nhị phân không? và nhớ lại rằng một vài năm trước tôi đã viết một bộ chỉ mục / tìm kiếm các tệp nhật ký để tìm các mục nhật ký trong các tệp văn bản lớn bằng cửa sổ ngày / giờ.

Trong khi thực hiện điều này, tôi quyết định thử tìm kiếm nội suy (tôi không biết đó là tên của nó, tôi tự mình vấp phải ý tưởng này). Sau đó, vì một số lý do, tôi tiếp tục ý tưởng xen kẽ các bước nội suy với các bước phân tách nhị phân: Ở bước 0 tôi sẽ nội suy để quyết định điểm kiểm tra, sau đó bước 1 tôi sẽ lấy điểm giữa chính xác, v.v.

Sau đó, tôi đã điểm chuẩn hệ thống bằng cách sử dụng tìm kiếm nội suy thuần túy, tìm kiếm nhị phân thuần túy và nỗ lực kết hợp của tôi. Cách tiếp cận xen kẽ là một người chiến thắng rõ ràng, cả về thời gian và số lượng bài kiểm tra cần thiết trước khi tìm ra một bộ thời gian được chọn ngẫu nhiên.

Lấy cảm hứng từ câu hỏi được liên kết, tôi chỉ thực hiện một tìm kiếm nhanh cho "tìm kiếm nội suy xen kẽ và tìm kiếm nhị phân" và không tìm thấy gì. Tôi cũng đã thử "tìm kiếm nội suy hedged" như đề xuất trên nhận xét của tôi về một trong những câu trả lời.

Tôi đã vấp phải một điều đã biết? Có bất kỳ biện minh lý thuyết nào cho việc nó nhanh hơn đối với một số loại dữ liệu nhất định không? Các tệp nhật ký thường lớn theo thời gian (ví dụ 1-2 GB văn bản với khoảng 10 triệu hàng để tìm kiếm) và sự lan truyền ngày / lần trong đó rất phức tạp với các đợt hoạt động lớn, thời gian cao điểm chung và thời gian yên tĩnh. Các bài kiểm tra điểm chuẩn của tôi được lấy mẫu từ một phân phối đồng đều về thời gian mục tiêu cần tìm.

Câu trả lời:


5

Tôi đã vấp phải một điều đã biết?

Có nhiều phương pháp khác nhau, dựa trên sự kết hợp giữa tìm kiếm nội suy và tìm kiếm nhị phân, với thời gian truy cập trường hợp trung bình (phân phối đồng đều) và O ( l o g n ) thời gian trường hợp xấu nhất (giá trị phân bố không đều):Ôi(tôiog tôiog n)Ôi(tôiog n)

  • Tìm kiếm nội tâm là phương pháp của bạn (lặp lại giữa tìm kiếm nội suy và tìm kiếm nhị phân). Tôi không biết thêm chi tiết.
  • Nội suy - tìm kiếm nhị phân (IBS) của N. Santoro, JB Sidney (1985).

    Ý tưởng chung là tìm kiếm nội suy chỉ hữu ích khi mảng tìm kiếm lớn hơn ngưỡng cho trước. Khi phân đoạn tìm kiếm được xem xét nhỏ hơn ngưỡng do người dùng xác định, tìm kiếm nhị phân được áp dụng vô điều kiện. Ngược lại, vượt qua ngưỡng đó, một bước tìm kiếm nội suy được áp dụng, cuối cùng là bước tìm kiếm nhị phân.

    Điều này có nhiều điểm chung với cách tiếp cận của bạn.

  • Tìm kiếm thích ứng (AS) của Biagio Bonasera, Emilio Ferrara, Giacomo Fiumara, Francesco Pagano, Alessandro Provetti

    Sử dụng từ ngữ của tác giả:

    [Nội suy - tìm kiếm nhị phân] đã nghĩ ra một giải pháp tương tự kết hợp (nhưng không pha trộn) với nội suy và tìm kiếm nhị phân. Mặc dù độ phức tạp tiệm cận là như nhau, có một số khác biệt rõ rệt.

    [CẮT]

    Do đó, có thể chỉ ra rằng đối với bất kỳ đầu vào nào, AS sẽ không thực hiện nhiều thao tác cơ bản hơn IBS.

    Thuật toán có thể tiêu tốn gấp đôi số thao tác so với tìm kiếm nội suy "đơn giản" trong việc tìm hiểu kỹ một nửa tốt nhất của phân đoạn tìm kiếm, điều này sẽ có nghĩa là sẽ cần ít lần lặp hơn để hoàn thành (nhưng bạn có chi phí thậm chí còn lớn hơn) .


6

Xen kẽ hai thuật toán để đạt được kết quả tốt nhất của cả hai thế giới là một kỹ thuật đã biết, mặc dù nó thường được tuyên bố là chạy chúng song song và trả lời ngay khi kết thúc.

Mặc dù về mặt lý thuyết nhanh hơn, tìm kiếm nội suy có hai nhược điểm so với tìm kiếm nhị phân:

  • Nó có hiệu suất trường hợp xấu nhất (tuyến tính)

  • Chi phí hoạt động của máy tính trung điểm khá lớn; một lần lặp tìm kiếm nhị phân nhanh hơn hàng trăm lần so với tìm kiếm nội suy

Tôi hy vọng rằng một cách tiếp cận nơi bạn thực hiện tìm kiếm nội suy trong khi phạm vi lớn và chuyển sang tìm kiếm nhị phân khi phạm vi trở nên nhỏ là hiệu quả nhất. Sẽ thật tuyệt nếu bạn có thể thử thí nghiệm này.

đăng nhậpnđăng nhậpđăng nhậpnđăng nhậpnđăng nhậpđăng nhậpn

Tôi nghĩ rằng kết quả của bạn có thể được giải thích bằng hai hiện tượng:

  • Kết hợp với tìm kiếm nhị phân cho phép bạn tránh hành vi xấu nhất

  • Hiệu quả tích cực của việc chuyển sang tìm kiếm nhị phân trên một tập dữ liệu nhỏ


3
Bạn đã viết: "một lần lặp tìm kiếm nhị phân nhanh hơn hàng trăm lần so với tìm kiếm nội suy". Xin lưu ý rằng trong trường hợp của OP, sự khác biệt giữa tính toán điểm giữa trong hai phương thức đó bị giảm bớt bởi thời gian I / O cần thiết để lấy giá trị của điểm giữa.
liori

@liori: Một vài lần lặp lại đầu tiên của các tìm kiếm nhị phân lặp lại trên cùng một dữ liệu có thể thân thiện với bộ đệm hơn, vì cùng một vài yếu tố được sử dụng. Vì vậy, các phần tư và có thể thứ tám có thể được dự kiến ​​sẽ nóng trong bộ nhớ cache. Bắt đầu với nhị phân và chuyển sang nội suy sau ba lần lặp có thể có ý nghĩa, nếu phạm vi đủ lớn. (Hoặc nếu bạn có thể thực hiện I / O không đồng bộ và sử dụng kết quả nào đến trước).
Peter Cordes

Ngoài ra, ngay cả đối với tìm kiếm trong bộ nhớ, chẳng hạn, lỗi bộ nhớ cache (độ trễ trên 200 chu kỳ) có độ trễ gấp đôi so với phân chia số nguyên 64 bit (32-96 Motorcycle), trên Intel Haswell chẳng hạn . Phân chia số nguyên 32 bit nhanh hơn đáng kể (22-29 xe). Băng thông bộ nhớ chính là tài nguyên được chia sẻ cho tất cả các lõi, nhưng phân chia số nguyên chỉ sử dụng các tài nguyên được nhân đôi trên mỗi lõi.
Peter Cordes

2
Tuy nhiên, độ trễ bộ nhớ kém hơn nhiều so với băng thông bộ nhớ, vì thậm chí nhiều truy cập phân tán đi nhanh hơn nếu chúng đang bay cùng một lúc. Đó là một chiến thắng để tìm nạp trước (có prefetcht0hướng dẫn ) cả hai khả năng cho Lặp lại NEXT trước khi tải điểm giữa hiện tại, cho một bsearch trong bộ nhớ trên phần cứng x86 hiện đại. Bạn không thể làm điều đó nếu bạn không thể dự đoán các địa chỉ tìm nạp tiếp theo trước thời hạn. Vì vậy, chi tiết thực hiện thực tế có thể là đáng kể, ngoài những xem xét lý thuyết .
Peter Cordes

@liori: Chắc chắn I / O trên mỗi điểm giữa là yếu tố chính khi lập chỉ mục một tệp nhật ký, vì nó được đọc theo yêu cầu để tìm bản ghi. Có lẽ có nhiều hơn hai bậc độ lớn giữa tính toán bù trong tệp và đọc một khối - do đó số lượng điểm giữa được tính sẽ là yếu tố quyết định. Tôi nghĩ rằng nếu tôi sao chép ngay bây giờ mà không có tệp nhật ký để lập chỉ mục - thứ gì đó tôi sẽ thử và đăng ở đây - rằng có thể không có sự khác biệt về tốc độ có thể đo được, nhưng có thể có sự khác biệt "số lượng điểm giữa cần thiết".
Neil Slater
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.