Алгоритмы поиска числовой записи в списке упорядоченных чисел - PullRequest
0 голосов
/ 23 апреля 2010

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

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

Ваш объект должен навести курсор на значение x

Первое число (наименьшее) - это s, а последнее число (наибольшее) - это g.

  1. Возьмите среднюю точку m1 из набора: вычислите x
  2. Если да, то s <= x <m1 </li>
  3. Если нет, то m1
  4. Если m1 = x, то все готово.

Продолжайте повторять, пока не найдете х. В основном деление набора на две части с каждой итерацией, пока вы не нажмете x.

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

Я бы предположил, что это самый простой вид индексации, есть ли улучшения?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2010

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

В частности, если вы обращаетесь к своим данным с диска, то время доступа к диску будет доминировать во всемостальное.В этом случае вы хотите уменьшить количество отдельных блоков данных, к которым необходимо получить произвольный доступ с диска.Это то, что делают B-деревья, B +-деревья и тому подобное: они хранят данные в форме дерева и обеспечивают большую разветвленность узлов, поэтому они могут ограничивать глубину и, следовательно, не требуютмного случайных поисков.

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

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

1 голос
/ 23 апреля 2010

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

1 голос
/ 23 апреля 2010

Бинарный поиск быстрый, очень быстрый ...


Возможно, вы захотите сосредоточить свои усилия по оптимизации здесь:

  • Использование большинства эффективный тип данных для числового поля.

  • Сокращение повторного доступа к тем же полям.


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

GOODLUCK !!

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