
- •3.1. Сущность и задачи лексического анализа
- •3.2. Способы организации таблиц идентификаторов
- •Организация таблицы идентификаторов в виде неупорядоченного массива записей. Метод линейного поиска.
- •Организация таблицы идентификаторов в виде упорядоченного массива записей. Метод бинарного поиска.
- •Использование бинарного дерева поиска для построения таблицы идентификаторов.
- •Построение таблиц идентификаторов с использованием методов хеширования.
-
Организация таблицы идентификаторов в виде упорядоченного массива записей. Метод бинарного поиска.
Помещение элементов в таблицу идентификаторов компилятором происходит значительно реже, чем поиск требуемого идентификатора в таблице. Более того, каждая операция добавления нового элемента в таблицу обычно влечет за собой не менее одной операции поиска на предмет проверки наличия такого же идентификатора в таблице, поскольку в большинстве языков программирования идентификатор не может быть описан более одного раза. Отсюда следует, что значительно повысить скорость работы компилятора можно за счет увеличения скорости поиска. Если элементы таблицы идентификаторов упорядочены по значению ключа (отсортированы), тогда возможно применить достаточно эффективный метод бинарного (логарифмического) поиска, сущность которого состоит в следующем. Пусть в таблице n элементов. Заданное значение ключа сравнивается с ключом элемента, располагающегося в середине таблицы (номер этого элемента - (n + 1)/2). Если они равны, то искомый элемент найден. В противном случае, повторяем алгоритм для элементов, расположенных выше или ниже серединного элемента в зависимости от того, меньше или больше искомое значение того, с которым его сравнили. Поиск прекращается, как только найден элемент с заданным значением ключа, или в рассматриваемом блоке элементов не останется ни одного элемента. Так как на каждом шаге число элементов, среди которых производится поиск, сокращается наполовину, то максимальное число сравнений равно 1+ log2 n. Так, при n = 128 бинарный поиск требует не больше 8 сравнений, а поиск в неупорядоченной таблице - в среднем 64 сравнения. При этом время поиска Тп логарифмически зависит от количества элементов в таблице идентификаторов:
Тп =О(log2 n).
Легко видеть, что при использовании метода бинарного поиска время поиска искомого элемента существенно сокращается по сравнению с методом линейного поиска. Однако время, затрачиваемое на помещение элемента в таблицу, увеличивается, поскольку таблица должна все время поддерживаться в упорядоченном состоянии. С этой целью для построения таблицы идентификаторов необходимо использовать стандартные алгоритмы организации упорядоченных массивов данных [10]. Если применять стандартные алгоритмы сортировки массивов данных, а поиск места включения идентификатора в таблицу осуществлять методом бинарного поиска, то среднее время Тз заполнения таблицы из n идентификаторов оценивается следующим образом:
Тз=О(n*log2 n)+k*О(n2),
где k - коэффициент, выражающий соотношение между временем выполнения компьютером операции сравнения и временем выполнения операции переноса данных.
Таким образом, использование метода бинарного поиска при работе с таблицей идентификаторов позволяет существенно сократить время поиска требуемого элемента за счет увеличения времени, затрачиваемого на помещение нового элемента в таблицу. Очевидно, что добавление новых идентификаторов в таблицу происходит значительно реже, чем последующее обращение к ним. Более того, каждая операция добавления нового элемента в таблицу идентификаторов требует, как правило, не менее одной операции поиска, поскольку в большинстве языков программирования идентификатор не может быть описан более одного раза. Поэтому рассмотренный метод организации таблицы идентификаторов следует признать более эффективным, чем метод организации неупорядоченной таблицы.