Tại sao tìm kiếm nhị phân, cần dữ liệu được sắp xếp, được coi là tốt hơn so với tìm kiếm tuyến tính?


20

Tôi đã luôn nghe nói rằng tìm kiếm tuyến tính là một cách tiếp cận ngây thơ và tìm kiếm nhị phân tốt hơn so với hiệu suất do độ phức tạp tiệm cận tốt hơn. Nhưng tôi không bao giờ hiểu tại sao nó tốt hơn tìm kiếm tuyến tính khi cần sắp xếp trước khi tìm kiếm nhị phân?

Tìm kiếm tuyến tính là O(n)và tìm kiếm nhị phân là O(log n). Đó dường như là cơ sở để nói rằng tìm kiếm nhị phân là tốt hơn. Nhưng tìm kiếm nhị phân yêu cầu sắp xếp đó là O(n log n)cho các thuật toán tốt nhất. Vì vậy, tìm kiếm nhị phân không nên thực sự nhanh hơn nó yêu cầu sắp xếp.

Tôi đang đọc CLRS trong đó tác giả ngụ ý rằng trong sắp xếp chèn thay vì sử dụng phương pháp tìm kiếm tuyến tính ngây thơ, tốt hơn là sử dụng tìm kiếm nhị phân để tìm vị trí phải chèn mục. Trong trường hợp này, điều này có vẻ hợp lý vì tại mỗi lần lặp lại có một danh sách được sắp xếp theo đó tìm kiếm nhị phân có thể được áp dụng. Nhưng trong trường hợp chung không có gì đảm bảo về tập dữ liệu mà chúng ta cần tìm kiếm không sử dụng tìm kiếm nhị phân thực sự tồi tệ hơn tìm kiếm tuyến tính do yêu cầu sắp xếp?

Có bất kỳ cân nhắc thực tế nào mà tôi đang xem xét giúp tìm kiếm nhị phân tốt hơn tìm kiếm tuyến tính không? Hoặc là tìm kiếm nhị phân được coi là tốt hơn so với tìm kiếm tuyến tính mà không xem xét thời gian tính toán cần thiết để sắp xếp?


6
Cũng như rất nhiều thứ khác, tất cả đều thuộc về: "Nó phụ thuộc ...;)"
Jeff B

Nếu danh sách đã được sắp xếp, bạn có nghĩ rằng tìm kiếm tuyến tính vẫn tốt hơn không? Đó có thể là một cái gì đó để xem xét ở đây.
JB King

3
Đối với bất cứ ai nghĩ đến việc thay đổi tiêu đề , xin vui lòng không lấy phần về dữ liệu được sắp xếp bởi vì loại bỏ điều đó làm cho điều này có vẻ như là một câu hỏi hoàn toàn khác.
Aseem Bansal

Câu trả lời:


53

Có bất kỳ cân nhắc thực tế nào mà tôi đang xem xét làm cho tìm kiếm nhị phân tốt hơn tìm kiếm tuyến tính không?

Có - bạn phải thực hiện sắp xếp O (n log n) một lần và sau đó bạn có thể thực hiện tìm kiếm nhị phân O (log n) bao nhiêu lần tùy ý, trong khi tìm kiếm tuyến tính là O (n) mỗi lần.

Tất nhiên, đây chỉ là một lợi thế nếu bạn thực sự thực hiện nhiều tìm kiếm trên cùng một dữ liệu. Nhưng kịch bản "viết một lần, đọc thường xuyên" là khá phổ biến.


Nếu bạn chỉ làm một việc gì đó một lần, không có nhiều điểm trong việc tối ưu hóa nó.

14

Giả định cơ bản là bạn không thực hiện một tìm kiếm.

Vì vậy, nếu bạn cần tìm kiếm cùng một dữ liệu nhiều lần thì bạn chỉ phải sắp xếp một lần và có thể kiếm lợi từ tìm kiếm nhị phân.

Nếu bạn tìm kiếm thường xuyên và thay đổi dữ liệu, đáng để sử dụng danh sách được sắp xếp trong đó các mục mới được sắp xếp vào danh sách.

Vì vậy, về cơ bản tìm kiếm nhị phân sẽ tốt hơn khi bạn tìm kiếm cùng một danh sách nhiều lần mà không cần phải nghỉ dưỡng.

Khi bạn cần sắp xếp mỗi lần trước khi tìm kiếm thì không có lợi thế.

Xin lưu ý rằng có các thuật toán sắp xếp rất nhanh khi danh sách đã được sắp xếp (hoặc gần sắp xếp). Hầu hết các quyết định hiệu suất mong đợi một danh sách chưa sắp xếp.


2
Nếu bạn tìm kiếm thường xuyên và chèn thường xuyên, bạn có thể xem xét các cấu trúc dữ liệu phức tạp hơn (ví dụ: cây nhị phân).
MarkJ

@MarkJ câu hỏi cơ bản của người đăng ban đầu là về việc tìm kiếm trong một danh sách. Khác tôi hoàn toàn đồng ý với bạn.
Uwe Plonus

7

bởi vì một khi bạn có một danh sách được sắp xếp, bạn không cần phải sắp xếp lại mỗi lần, điều đó có nghĩa là nếu bạn có nhiều hơn O (log n) các tìm kiếm sắp xếp trước sẽ giúp bạn giành chiến thắng ( O(n log n + k log n)so vớiO(k*n)


5

Hãy tưởng tượng hai cuốn sách điện thoại.

Một cuốn sách điện thoại có tên theo thứ tự bảng chữ cái. Để tìm mục bạn muốn, bạn mở ở giữa, kiểm tra mục, sau đó di chuyển tiến hoặc lùi tùy thuộc vào việc bạn overshot hay nhấp nháy.

Các danh bạ điện thoại khác có tên theo thứ tự ngẫu nhiên. Để tìm mục bạn muốn, bạn bắt đầu từ đầu và tiếp tục cho đến khi bạn tìm thấy những gì bạn muốn.

Cuốn sách thứ hai sẽ làm việc trong bất kỳ thành phố có kích thước hợp lý?


3

Tôi nghĩ rằng giá trị của tìm kiếm nhị phân so với tìm kiếm tuyến tính là theo ngữ cảnh. Nếu bạn bắt đầu với một tập dữ liệu không có thứ tự khổng lồ và chỉ có kế hoạch nhổ một số lượng nhỏ các mục từ nó, thì việc sắp xếp và thực hiện tìm kiếm nhị phân sẽ chậm. Tuy nhiên, nếu bạn duy trì một danh sách theo thứ tự trong suốt vòng đời của ứng dụng của bạn và truy cập nó thường xuyên, thì tìm kiếm nhị phân là một cách tốt hơn để đi.


3

Giống như nhiều người khác đã trả lời, tìm kiếm nhị phân thực sự thích hợp hơn vì bước sắp xếp chỉ có thể được thực hiện một lần và việc tìm kiếm thực tế sau đó có thể được thực hiện bao nhiêu lần tùy thích. Tuy nhiên, đối với các giá trị nhất định của n (tức là kích thước đầu vào nhất định), tìm kiếm nhị phân luôn có hiệu suất cao hơn tìm kiếm tuyến tính (ngay cả đối với một lần chạy).

"Điểm bùng phát" được tính bằng cách giải phương trình phức tạp tiệm cận:

n log n + log n = n

Như bạn có thể thấy trên Wolfram Alpha, có một giá trị bằng số cho n đảm bảo rằng tìm kiếm và sắp xếp nhị phân luôn nhanh hơn so với tìm kiếm tuyến tính một mình. Tất nhiên giá trị thực của n hoạt động trong trường hợp của bạn phụ thuộc vào nhiều yếu tố có thể khó ước tính.

Theo bài viết thú vị này của Mark Probst, bao gồm một số phép đo hiệu suất chuyên sâu trên các bộ xử lý hiện tại:

Nếu bạn cần tìm kiếm trong một mảng số nguyên được sắp xếp và hiệu suất thực sự rất quan trọng, hãy sử dụng tìm kiếm tuyến tính nếu mảng của bạn có kích thước khoảng 64 phần tử, tìm kiếm nhị phân nếu ở trên.


2

Theo cách nói của giáo dân:

Nếu bạn có một danh sách không có thứ tự với mười tỷ mục và mục bạn tìm kiếm là mục cuối cùng, bạn sẽ đọc được mười tỷ mục.

Trong trường hợp tìm kiếm nhị phân, việc lập chỉ mục có thể được thực hiện chỉ một lần. Việc chèn thêm sau này có thể được thực hiện ở đúng nơi để duy trì trật tự.


2

Mặc dù rất nhiều lý do chính đáng để "tìm kiếm nhị phân tốt hơn" đã được liệt kê, chúng tôi cũng có thể xem xét các lợi thế từ góc độ người dùng:

Mặc dù bạn thường có thể sống rất tốt với thời gian chờ nhỏ được phân chia giữa các hành động nhập dữ liệu khi bạn thực hiện thao tác chèn được sắp xếp, bạn muốn "tìm kiếm" càng nhanh càng tốt. Từ quan điểm của người dùng, chèn được sắp xếp kết hợp với tìm kiếm nhị phân mang lại trải nghiệm người dùng tốt nhất có thể.

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.