Где бинарный поиск используется на практике? - PullRequest
26 голосов
/ 12 февраля 2009

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

Ответы [ 22 ]

27 голосов
/ 12 февраля 2009

Бинарный поиск используется везде . Возьмите любую отсортированную коллекцию из любой языковой библиотеки (Java, .NET, C ++ STL и т. Д.), И все они будут использовать (или иметь возможность использовать) бинарный поиск для поиска значений. Хотя это правда, что вам приходится применять его редко, вы все равно должны понимать принципы, лежащие в его основе, чтобы воспользоваться этим преимуществом.

20 голосов
/ 12 февраля 2009

Двоичный поиск можно использовать для быстрого доступа к упорядоченным данным , когда в памяти мало . Предположим, что вы хотите хранить набор из 100 000 32-битных целых чисел в упорядоченной структуре данных с возможностью поиска, но вы не собираетесь часто менять набор. Вы можете легко хранить целые числа в отсортированном массиве 400 000 байтов, и вы можете использовать двоичный поиск для быстрого доступа к нему. Но если вы положите их, например, в B-дерево, RB-дерево или любую более «более динамичную» структуру данных вы начинаете нести нагрузку на память. Чтобы проиллюстрировать это, хранение целых чисел в любом виде дерева, в котором вы оставили указатели на дочерний и правый дочерние элементы, заставило бы вас использовать как минимум 1 200 000 байт памяти (при условии 32-разрядной архитектуры памяти). Конечно, есть оптимизация, которую вы можете сделать, но в целом это так.

Поскольку упорядоченный массив очень медленно обновляется (выполняется вставка или удаление), двоичный поиск бесполезен, если массив часто меняется.

Вот несколько практических примеров, где я использовал бинарный поиск:

  • Реализация конструкции "switch () ... case:" в виртуальной машине, где метки case являются отдельными целыми числами. Если у вас есть 100 случаев, вы можете найти правильную запись за 6-7 шагов, используя бинарный поиск, где в качестве последовательности условных переходов требуется в среднем 50 сравнений.
  • Выполнение быстрого поиска подстроки с использованием массивов суффиксов, которые содержат все суффиксы набора доступных для поиска строк в лексикографическом порядке (я хотел сохранить память и сохранить простоту реализации)
  • Поиск численных решений уравнения (если вы ленивы и не против реализовать метод Ньютона)
15 голосов
/ 12 февраля 2009

Каждый программист должен знать, как использовать двоичный поиск при отладке.

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

7 голосов
/ 12 февраля 2009

Двоичный поиск - это хороший и быстрый способ!

До появления STL и .NET Framework и т. Д. Вы довольно часто сталкивались с ситуациями, когда вам нужно было развернуть свои собственные настроенные классы коллекций. Всякий раз, когда отсортированный массив будет возможным местом хранения данных, бинарный поиск будет способом поиска записей в этом массиве.

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

6 голосов
/ 12 февраля 2009

Я реализовал бинарный поиск в реализациях BTree.

Алгоритмы поиска BTree использовались для поиска следующего блока узла для чтения, но внутри самого блока 4K (который содержал количество ключей в зависимости от размера ключа) был использован двоичный поиск для поиска либо номера записи (для листовой узел) или следующий блок (для неконечного узла).

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

3 голосов
/ 12 февраля 2009

Мы все еще интенсивно используем его в нашем коде для поиска в тысячах ACLS много тысяч раз в секунду. Это полезно, потому что списки ACL являются статическими, как только они поступают из файла, и мы можем страдать за счет увеличения массива при добавлении к нему при загрузке. Слишком быстро, когда он тоже работает.

Если вы можете выполнить поиск в массиве из 255 элементов не более чем в 7 сравнениях / переходах (511 в 8, 1023 в 9 и т. Д.), Вы увидите, что бинарный поиск выполняется почти так же быстро, как вы можете.

3 голосов
/ 12 февраля 2009

Однажды я реализовал это (даже не подозревая, что это действительно бинарный поиск) для графического элемента управления, отображающего двумерные данные на графике. Щелчок мышью должен установить курсор данных в точку с ближайшим значением x. При работе с большим количеством точек (несколько тысяч, это было в далеком прошлом, когда x86 только начинал набирать частоту процессора более 100 МГц), это было не очень удобно для интерактивного использования - я делал линейный поиск с самого начала. После некоторого размышления мне пришло в голову, что я мог бы подойти к этому по принципу «разделяй и властвуй». Мне потребовалось некоторое время, чтобы заставить его работать под всеми крайними случаями.

Только через некоторое время я узнал, что это действительно фундаментальный алгоритм CS ...

3 голосов
/ 01 ноября 2015

Отвечая на ваш вопрос с практическим примером.

В языке программирования R есть пакет data.table . Это известно из C-внедренного, короткого синтаксиса, высокопроизводительного расширения для преобразования данных. Он использует бинарный поиск. Даже без бинарного поиска он масштабируется лучше конкурентов.
Вы можете найти тесты против python pandas и против R dplyr в вики проекта группировка 2E9 - данные случайного порядка. Есть также хороший тест по сравнению с базами данных против bigdata benchm-database .

В последней версии data.table (1.9.6) бинарный поиск был расширен и теперь может использоваться как индекс для любого атомарного столбца.

Я только что нашел хорошее резюме, с которым я полностью согласен - см. .

Любой, кто делает сравнения R, должен использовать data.table вместо data.frame. Тем более для ориентиров. data.table - лучшая структура данных / языка запросов, которую я нашел в своей карьере. Он лидирует в мире R и, по-моему, на всех языках, ориентированных на данные.

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

2 голосов
/ 12 февраля 2009

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

Другим примером является алгоритм целочисленного деления, который выполняется во время регистрации.

2 голосов
/ 02 марта 2014

Двоичный поиск можно использовать для отладки с помощью Git. Это называется git bisect .

...