2011-02-10 4 views
2

Я только что понял, что в свои 4+ года программирования Java (в основном, для настольных приложений) я никогда не использовал бинарные методы поиска в классе Arrays для чего-либо практического. Даже не один раз. Некоторые причины, о которых я могу думать:Примеры использования бинарного поиска

  1. 100% времени вы можете уйти с помощью линейного поиска, карт или чего-то еще, что не является бинарным поиском.
  2. Входящие данные почти никогда не сортируются, и для сортировки требуется дополнительный этап сортировки.

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

+0

дубликат http://stackoverflow.com/questions/2130416/what-are-the-applications-of-binary-trees? –

+0

Я проголосовал за закрытие, как дублированное. Однако этот вопрос заслуживает того, что он обращается к точке *, когда данные еще не отсортированы *. Большинство применений, которые я могу придумать для двоичного поиска, дерева хаффмана и т. Д., - это когда данные уже представлены в жестком формате (хотя это как-то, что распространено как файл MPEG). –

+2

@ Виджай - не дубликат. Этот вопрос обсуждает бинарные деревья. Вопрос OPs - именно то, почему эти массивные операции популярны, если их можно легко заменить бинарными деревьями и другими не-массивными качествами. – corsiKa

ответ

5

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

+0

Почему не используются карты для этого ? Просто интересуюсь. –

+1

@python dude, как бы вы нашли ключ на карте? Помните, что данные могут не подходить в память. Вероятно, вы хотите, чтобы бинарный поиск нашел первую запись таблицы соответствия (на диске), а затем загрузил этот диапазон в память. –

+0

Я бы там было больше B-дерева, чем двоичных. Двоичные деревья кажутся более академичными или предварительно испеченными статическими данными. –

3

Я бы сказал, что сводится к следующему:

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

Там еще одна очень важная вещь, чтобы иметь в виду:

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

1

Я почти никогда не использовал бинарный поиск.

Но если бы:

  • Мне нужно найти тот же список несколько раз
  • список был достаточно долго, чтобы иметь проблемы с производительностью (хотя я часто грешат микро- оптимизация)

Однако, я часто использую хэш-таблицы/словари для быстрого поиска.

1

Для производственного кода моей дневной работы Set или Map всегда достаточно хороши.

Для алгоритмических проблем, которые я решаю для развлечения, бинарный поиск - очень полезный метод. Во-первых, если набор элементов никогда не изменяется (т. Е. Вы никогда не собираетесь вставлять или удалять элементы в запросе набора), то Map/Set не имеет преимущества перед двоичным поиском - и двоичный поиск по простому массиву позволяет избежать большого количества связанные с запросом на более сложную структуру данных. Во многих случаях я видел это на самом деле быстрее, чем HashMap.

Двоичный поиск также является более общей техникой, чем просто запрос на членство в наборе. Бинарный поиск может выполняться на любой монотонной функции, чтобы найти значение, для которого функция удовлетворяет определенным критериям. Вы можете найти более подробное объяснение here. Но, как я уже сказал, моя работа не приносит достаточных вычислительных проблем, чтобы это применимо.

0

Предположим, вам нужно найти элемент в списке.

Вы можете использовать линейный поиск, вы получите O (n).

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

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

Смежные вопросы