Я всегда слышал, что линейный поиск - это наивный подход, и бинарный поиск лучше, чем он, по производительности из-за лучшей асимптотической сложности. Но я никогда не понимал, почему это лучше, чем линейный поиск, когда перед двоичным поиском требуется сортировка?
Линейный поиск есть O(n)
и бинарный поиск есть O(log n)
. Кажется, это основание говорить, что бинарный поиск лучше. Но бинарный поиск требует сортировки O(n log n)
для лучших алгоритмов. Таким образом, бинарный поиск не должен быть на самом деле быстрее, поскольку он требует сортировки.
Я читаю CLRS, в которой автор подразумевает, что в сортировке вставки вместо использования наивного подхода линейного поиска лучше использовать двоичный поиск, чтобы найти место, где должен быть вставлен элемент. В этом случае это кажется оправданным, поскольку на каждой итерации цикла имеется отсортированный список, к которому можно применить бинарный поиск. Но в общем случае, когда нет никакой гарантии относительно набора данных, в котором нам нужно искать, разве бинарный поиск на самом деле не хуже линейного поиска из-за требований сортировки?
Есть ли какие-то практические соображения, которые я пропускаю, которые делают бинарный поиск лучше, чем линейный поиск? Или двоичный поиск считается лучше, чем линейный поиск без учета времени вычислений, необходимого для сортировки?
источник
Ответы:
Да - вы должны выполнить O (n log n) сортировку только один раз, а затем вы можете выполнять O (log n) бинарный поиск так часто, как вы хотите, тогда как линейный поиск - это O (n) каждый раз.
Конечно, это только преимущество, если вы действительно выполняете многократный поиск по одним и тем же данным. Но сценарии «пиши один раз, читай часто» довольно распространены.
источник
Основным предположением является то, что вы не делаете один поиск.
Поэтому, если вам нужно искать одни и те же данные несколько раз, вам нужно будет выполнить сортировку только один раз, и вы сможете извлечь выгоду из двоичного поиска.
Если вы часто выполняете поиск и меняете данные, стоит использовать отсортированный список, в котором новые записи сортируются в списке.
Так что в основном бинарный поиск лучше, когда вы просматриваете один и тот же список несколько раз без необходимости прибегать к помощи.
Когда вам нужно сортировать каждый раз перед поиском, это не дает никаких преимуществ.
Пожалуйста, обратите внимание, что существуют алгоритмы сортировки, которые очень быстры, когда список уже отсортирован (или почти отсортирован). Большинство определений производительности ожидают несортированный список.
источник
потому что как только у вас есть отсортированный список, вам не нужно каждый раз пересортировать его, что означает, что если у вас больше O (log n) поисков, то сортировка заранее принесет вам выигрыш (
O(n log n + k log n)
противO(k*n)
источник
Представьте себе две телефонные книги.
Одна телефонная книга имеет имена в алфавитном порядке. Чтобы найти нужную запись, вы открываете ее посередине, проверяете запись и затем двигаетесь вперед или назад в зависимости от того, были ли вы промахнуты или нет.
Другая телефонная книга имеет имена в случайном порядке. Чтобы найти запись, которую вы хотите, вы начинаете с начала и продолжаете, пока не найдете то, что вы хотите.
Будет ли вторая книга работать в каком-либо городе разумного размера?
источник
Я думаю, что значение бинарного поиска по сравнению с линейным поиском является контекстным. Если вы начнете с огромного неупорядоченного набора данных и планируете извлечь из него только небольшое количество элементов, сортировка и выполнение двоичного поиска будут медленными. Если, однако, вы поддерживаете упорядоченный список в течение всего времени жизни вашего приложения и регулярно обращаетесь к нему, тогда бинарный поиск - гораздо лучший способ.
источник
Как и многие другие ответили, бинарный поиск действительно предпочтительнее, потому что шаг сортировки может быть выполнен только один раз, а фактический поиск может быть выполнен столько раз, сколько вы хотите. Однако для определенных значений n (т. Е. Определенных входных размеров) бинарный поиск всегда более эффективен, чем линейный поиск (даже для одного прогона).
«Точка перелома» вычисляется путем решения асимптотического уравнения сложности:
Как вы можете видеть на Wolfram Alpha, есть числовое значение для n, которое гарантирует, что двоичный поиск и сортировка всегда быстрее, чем только линейный поиск. Конечно, фактическое значение n, которое работает в вашем случае, зависит от многих факторов, которые может быть трудно оценить.
Согласно этой интересной статье Марка Пробста, которая включает в себя некоторые хорошие подробные измерения производительности на современных процессорах:
источник
По словам непрофессионала:
Если у вас есть неупорядоченный список с десятью миллиардами элементов, и элемент, который вы ищете, является последним, вы в конечном итоге прочитаете десять миллиардов элементов.
В случае двоичного поиска индексация может быть выполнена только один раз. Более поздние вставки могут быть сделаны в нужном месте, чтобы поддерживать порядок.
источник
Хотя много веских причин для «бинарного поиска лучше» уже были перечислены, мы могли бы также взглянуть на преимущества с точки зрения пользователя:
Хотя обычно вы можете очень хорошо жить с небольшим временем ожидания между действиями по вводу данных, когда вы выполняете сортированную вставку, вы хотите, чтобы «поиск» был максимально быстрым. С точки зрения пользователя, сортированная вставка в сочетании с бинарным поиском обеспечивает наилучшее взаимодействие с пользователем.
источник