Таблица может быть упорядочена по возрастанию цифрового ключа или по частоте обращения к записям. В первом случае для поиска записей обычно применяют двоичный поиск, а во втором - последовательный просмотр.
Двоичный поиск состоит в последовательном делении таблицы на две примерно равные части и определении, в какой из двух частей- находится требуемое значение ключа. Последующему делению- каждый раз подвергается часть, содержащая ключ. Поскольку таблица упорядочена по возрастанию ключа, определить в какой части находится требуемое значение ключа нетрудно. Для этого достаточно сравнить значение ключа в точке деления с искомым.
Алгоритм двоичного поиска можно описать следующей процедурой
Procedure bisearch(T,n,K,i);
Value n,K;integer n,K,i;integer array T;
Comment Т [1:n] — массив, содержащий значения ключей, K - заданное значение ключа.
Результат выполнения процедуры:
i¹0- номер табличной записи, имеющей заданное значение ключа,
i=0- если в таблице нет записи с заданным значе-
нием ключа;
begin integer p;p:=1;
for i:=(p+n)%2 while p
if T[i]
i:=if T[p]=K then p else 0
end
Длина двоичного поиска D2 определяется формулой (11), что при достаточно больших n почти равно теоретическому нижнему пределу для методов поиска, основанных только на сравнении признаков (значений ключа). Теоретический нижний предел равен log2(n+1).
В общем случае двоичный поиск значительно эффективнее последовательного просмотра. Например, для таблицы из 1000 записей средняя длина последовательного просмотра равна 500, а длина двоичного поиска — только 11.
Средняя длина последовательного просмотра в таблице, упорядоченной по частоте обращения к записям, существенно зависит распределения частот обращения и определяется по общей формуле (8). Если относительно небольшое число записей приходится отыскивать очень часто, то средняя длина поиска может оказаться значительно меньше, чем при двоичном поиске. Это иногда используют при составлении постоянных таблиц транслятора, например таблиц основных символов входного языка.
Упорядочивание таблиц требует дополнительного расход машинного времени, поэтому упорядоченные таблицы применяют прежде всего как постоянные таблицы транслятора. Однако иногда упорядочивают и временные таблицы, хотя это связано с определенными трудностями. Дело в том, что временные таблицы, составляемые в ходе трансляции, в большинстве случаев тут же используются для поиска. Уже заполнение таких таблиц требует проверки: не включена ли данная запись в таблицу на предыдущих этапах работы транслятора. Поэтому упорядочивание временных таблиц транслятора приходится проводить одновременно с их заполнением.
Для сокращения расхода машинного времени на упорядочивание- временных таблиц иногда применяют способ разделителей, при котором таблица делится на разделы, соответствующие различным интервалам значений ключа. Разделы упорядочены, а внутри разделов записи не упорядочивают. Для поиска записей применяют комбинированный метод. Например, раздел отыскивается путем двоичного поиска, а внутри раздела используют последовательный просмотр.