Состав возможных характеристик
и методы их определения зависят
от семантики входного языка.
Состав информации, хранимой в ТИ для каждого элемента исходной программы, зависит от семантики входного языка и типа элемента.
Например, в ТИ может храниться следующая информация:
Таблица идентификаторов заполняется не сразу.
Компилятор может несколько раз выполнять обращение
к данным в ТИ на различных фазах компиляции.
Назначение и особенности построения таблиц идентификаторов
Поскольку функция поиска необходимого элемента выполняется чаще, чем добавление нового (новые идентификаторы описываются в программе гораздо реже, чем используются),
а также перед выполнением функции добавления выполняется функция поиска (чтобы один и тот же элемент не был добавлен несколько раз)
Основным критерием
при выборе метода организации ТИ
является время поиска нужного элемента.
Недостатки: требование упорядочивания ТИ
Форма бинарного дерева зависит
от порядка поступления идентификаторов.
Хеш-функцией (происходит от английского «hash function» – «функция смешивания») F называется некоторое отображение множества входных элементов R на множество целых неотрицательных чисел:
Z:F(r)=n, где r∈R, n∈Z.
Процесс отображения области определения хеш-функции на множество значений называется «хешированием».
При работе с ТИ хеш-функция должна выполнять отображение имен идентификаторов на множество целых неотрицательных чисел.
Областью определения хеш-функции является множество всех возможных имен идентификаторов.
Первоначально ТИ должна быть заполнена информацией, которая позволила бы говорить о том, что все ее ячейки являются пустыми.
В реальном компиляторе
область значений хеш-функции никак не должна превышать размер доступного адресного пространства компьютера.
Недостатки: - неэффективное использование объема памяти под ТИ (размер
массива для ее хранения должен соответствовать области
значений хеш-функции, в то время как реально хранимых в таблице
идентификаторов может быть существенно меньше, и наоборот,
если выбрана неудачная хеш-функция – может не хватить места для
размещения всех идентификаторов);
- необходимость соответствующего разумного выбора хеш-
функции (при неудовлетворительном выборе хеш-функции может
возникнуть такая ситуация, когда двум и более идентификаторам
будет соответствовать одно и то же значение хеш-функции, что
влечет за собой попытку размещения в одной и той же ячейке ТИ
обоих идентификаторов, что явно невозможно.
Такая ситуация называется коллизией).
- длина принимаемой во внимание части имени идентификатора в реальных компиляторах также практически ограничена – обычно она лежит в пределах от 32 до 128 символов (получается, что и область определения хеш-функции конечна), но даже в этом случае количество элементов в конечном множестве, составляющем область определения функции, будет превышать их количество в конечном множестве области значений функции (количество всех возможных идентификаторов все равно больше количества допустимых адресов в современных компьютерах).
hi(A) = (h(A) + pi) mod Nm,
Достоинства: эффективен при неполном заполнении таблицы
Пример: Идентификаторы поступают в следующем порядке:
ab, ac, an, ak, bc, az, ck.
Максимальное значение ХФ Nm=13 (следовательно, под ТИ будет выделен
объем памяти, равный 13).
Используемая ХФ – ASCII-код первой буквы идентификатора.
h(ab)=h(ac)=h(an)=h(ak)=h(az)=d7
h(bc)=d3
h(ck)=d9
ab
Шаг 1
Идентификаторы поступают в следующем порядке:
ab, ac, an, ak, bc, az, ck.
Шаг 2: При размещения идентификатора ac возникает коллизия:
h(ac)= d7, поскольку ячейка занята,
согласно формуле рехеширования, вычисляется новая ХФ:
h1(ac)=(h(ac)+1)mod13=d8
(для размещения данного идентификатора необходимо сделать 2 операции)
ac
Шаг 2
Шаг 3: При размещения идентификатора an возникает коллизия:
h(an)= d7, поскольку ячейка занята,
согласно формуле рехеширования, вычисляется новая ХФ:
h1(an)=(h(an)+1)mod13=d8 – снова коллизия
h2(an)=(h(an)+2)mod13=d9
(для размещения данного идентификатора необходимо сделать 3 операции)
an
Шаг 3
Шаг 4: При размещения идентификатора ak возникает коллизия:
h(ak)= d7, поскольку ячейка занята,
согласно формуле рехеширования, вычисляется новая ХФ:
h1(ak)=(h(ak)+1)mod13=d8 – снова коллизия
h2(ak)=(h(ak)+2)mod13=d9 – снова коллизия
h3(ak)=(h(ak)+3)mod13=d10
(для размещения данного идентификатора необходимо сделать 4 операции)
ak
Шаг 4
Шаг 5: Идентификатор bс размещается в ячейку с адресом d3
h(bс)= d3
(для размещения данного идентификатора необходимо сделать 1 операцию)
bс
Шаг 5
Шаг 6: При размещения идентификатора az возникает коллизия:
h(az)= d7, поскольку ячейка занята,
согласно формуле рехеширования, вычисляется новая ХФ:
h1(az)=(h(az)+1)mod13=d8 – снова коллизия
h2(az)=(h(az)+2)mod13=d9 – снова коллизия
h3(az)=(h(az)+3)mod13=d10 – снова коллизия
h4(az)=(h(az)+4)mod13=d11
(для размещения данного идентификатора необходимо сделать 5 операций)
az
Шаг 6
Шаг 7: При размещения идентификатора ck возникает коллизия, так как ячейка d9 уже занята:
h(ck)= d9,
следовательно, согласно формуле рехеширования, вычисляется новая ХФ:
h1(ck)=(h(ck)+1)mod13=d10 – снова коллизия
h2(ck)=(h(ck)+2)mod13=d11 – снова коллизия
h3(ck)=(h(ck)+3)mod13=d12
(для размещения данного идентификатора необходимо сделать 4 операции)
ck
Шаг 7
Метод рехеширование с помощью произведения
hi(A) = (h(A) * i) mod Nm,
Рехеширование
Метод цепочек
При возникновении коллизии элементы размещаются в ячейках таблицы, связываясь друг с другом последовательно через поле ссылки.
При этом элементы не могут попадать в ячейки с адресами, которые потом будут совпадать со значениями хеш-функции, то есть дополнительные коллизии не возникают.
В результате в ТИ возникают своеобразные цепочки связанных элементов (отсюда и название – «метод цепочек»).
Используемая ХФ – ASCII-код
первой буквы идентификатора.
h(ab)=h(ac)=h(an)=h(ak)=h(az)=d7
h(bc)=d3
h(ck)=d9
a1
a5
a7
для выборки информации из ТИ используется хеш-функция и поле ссылки остается пустым
через поле ссылки организуется поиск идентификаторов, для которых значения хеш-функции совпадают, по одному из рассмотренных выше методов
Недостатком же метода является необходимость работы с динамически распределяемыми областями памяти.
Коллизия
Нет коллизий
Преимуществом данного метода по сравнению с методом цепочек является то, что для хранения идентификаторов с совпадающими значениями хеш-функции используются области памяти, не пересекающиеся с основной ТИ
(их размещение не приведет к возникновению дополнительных коллизий).
Эффективность данного метода
зависит от качества применяемой
хеш-функции и от метода организации
дополнительных хранилищ данных.
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть