Почему двоичный поиск, для которого нужны отсортированные данные, считается лучше, чем линейный поиск?


20

Я всегда слышал, что линейный поиск - это наивный подход, и бинарный поиск лучше, чем он, по производительности из-за лучшей асимптотической сложности. Но я никогда не понимал, почему это лучше, чем линейный поиск, когда перед двоичным поиском требуется сортировка?

Линейный поиск есть O(n)и бинарный поиск есть O(log n). Кажется, это основание говорить, что бинарный поиск лучше. Но бинарный поиск требует сортировки O(n log n)для лучших алгоритмов. Таким образом, бинарный поиск не должен быть на самом деле быстрее, поскольку он требует сортировки.

Я читаю CLRS, в которой автор подразумевает, что в сортировке вставки вместо использования наивного подхода линейного поиска лучше использовать двоичный поиск, чтобы найти место, где должен быть вставлен элемент. В этом случае это кажется оправданным, поскольку на каждой итерации цикла имеется отсортированный список, к которому можно применить бинарный поиск. Но в общем случае, когда нет никакой гарантии относительно набора данных, в котором нам нужно искать, разве бинарный поиск на самом деле не хуже линейного поиска из-за требований сортировки?

Есть ли какие-то практические соображения, которые я пропускаю, которые делают бинарный поиск лучше, чем линейный поиск? Или двоичный поиск считается лучше, чем линейный поиск без учета времени вычислений, необходимого для сортировки?


6
Как и во многих других вещах, все сводится к следующему: «Это зависит ...;)»
Джефф Б.

Если список уже отсортирован, думаете ли вы, что линейный поиск все еще лучше? Это может быть что-то, чтобы рассмотреть здесь.
JB King

3
Для тех, кто думает об изменении названия , пожалуйста, не вынимайте часть о отсортированных данных, потому что удаление, которое делает этот вопрос совершенно другим.
Aseem Bansal

Ответы:


53

Есть какие-то практические соображения, которые я упускаю из виду, что делает бинарный поиск лучше, чем линейный поиск?

Да - вы должны выполнить O (n log n) сортировку только один раз, а затем вы можете выполнять O (log n) бинарный поиск так часто, как вы хотите, тогда как линейный поиск - это O (n) каждый раз.

Конечно, это только преимущество, если вы действительно выполняете многократный поиск по одним и тем же данным. Но сценарии «пиши один раз, читай часто» довольно распространены.


Если вы делаете что-то только один раз, нет особого смысла в оптимизации.

14

Основным предположением является то, что вы не делаете один поиск.

Поэтому, если вам нужно искать одни и те же данные несколько раз, вам нужно будет выполнить сортировку только один раз, и вы сможете извлечь выгоду из двоичного поиска.

Если вы часто выполняете поиск и меняете данные, стоит использовать отсортированный список, в котором новые записи сортируются в списке.

Так что в основном бинарный поиск лучше, когда вы просматриваете один и тот же список несколько раз без необходимости прибегать к помощи.

Когда вам нужно сортировать каждый раз перед поиском, это не дает никаких преимуществ.

Пожалуйста, обратите внимание, что существуют алгоритмы сортировки, которые очень быстры, когда список уже отсортирован (или почти отсортирован). Большинство определений производительности ожидают несортированный список.


2
Если вы часто выполняете поиск и часто вставляете, вы можете посмотреть на более сложные структуры данных (например, двоичные деревья).
MarkJ

@MarkJ основной вопрос оригинального постера был о поиске в списке. Иначе я полностью согласен с вами.
Уве Плонус

7

потому что как только у вас есть отсортированный список, вам не нужно каждый раз пересортировать его, что означает, что если у вас больше O (log n) поисков, то сортировка заранее принесет вам выигрыш ( O(n log n + k log n)противO(k*n)


5

Представьте себе две телефонные книги.

Одна телефонная книга имеет имена в алфавитном порядке. Чтобы найти нужную запись, вы открываете ее посередине, проверяете запись и затем двигаетесь вперед или назад в зависимости от того, были ли вы промахнуты или нет.

Другая телефонная книга имеет имена в случайном порядке. Чтобы найти запись, которую вы хотите, вы начинаете с начала и продолжаете, пока не найдете то, что вы хотите.

Будет ли вторая книга работать в каком-либо городе разумного размера?


3

Я думаю, что значение бинарного поиска по сравнению с линейным поиском является контекстным. Если вы начнете с огромного неупорядоченного набора данных и планируете извлечь из него только небольшое количество элементов, сортировка и выполнение двоичного поиска будут медленными. Если, однако, вы поддерживаете упорядоченный список в течение всего времени жизни вашего приложения и регулярно обращаетесь к нему, тогда бинарный поиск - гораздо лучший способ.


3

Как и многие другие ответили, бинарный поиск действительно предпочтительнее, потому что шаг сортировки может быть выполнен только один раз, а фактический поиск может быть выполнен столько раз, сколько вы хотите. Однако для определенных значений n (т. Е. Определенных входных размеров) бинарный поиск всегда более эффективен, чем линейный поиск (даже для одного прогона).

«Точка перелома» вычисляется путем решения асимптотического уравнения сложности:

n log n + log n = n

Как вы можете видеть на Wolfram Alpha, есть числовое значение для n, которое гарантирует, что двоичный поиск и сортировка всегда быстрее, чем только линейный поиск. Конечно, фактическое значение n, которое работает в вашем случае, зависит от многих факторов, которые может быть трудно оценить.

Согласно этой интересной статье Марка Пробста, которая включает в себя некоторые хорошие подробные измерения производительности на современных процессорах:

Если вам нужен поиск в отсортированном массиве целых чисел и производительность действительно очень важна, используйте линейный поиск, если размер вашего массива меньше 64 элементов, и бинарный поиск, если он выше.


2

По словам непрофессионала:

Если у вас есть неупорядоченный список с десятью миллиардами элементов, и элемент, который вы ищете, является последним, вы в конечном итоге прочитаете десять миллиардов элементов.

В случае двоичного поиска индексация может быть выполнена только один раз. Более поздние вставки могут быть сделаны в нужном месте, чтобы поддерживать порядок.


2

Хотя много веских причин для «бинарного поиска лучше» уже были перечислены, мы могли бы также взглянуть на преимущества с точки зрения пользователя:

Хотя обычно вы можете очень хорошо жить с небольшим временем ожидания между действиями по вводу данных, когда вы выполняете сортированную вставку, вы хотите, чтобы «поиск» был максимально быстрым. С точки зрения пользователя, сортированная вставка в сочетании с бинарным поиском обеспечивает наилучшее взаимодействие с пользователем.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.