Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 17. Погрешность численного интегрирования




Комбинированные способы построения таблиц идентификаторов.

Построение таблиц идентификаторов по методу цепочек.

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

В ячейках хеш-таблицы может храниться либо пустое значение, либо значение указателя на область памяти из основной таблицы идентификаторов, тогда хеш-функция вычисляет адрес, по которому происходит обращение сначала к хеш-таблице, а потом через нее по найденному адресу – к самой таблице идентификаторов. Если соответствующая ячейка таблицы идентификаторов пуста, то ячейка хеш-таблицы будет содержать пустое значение, и тогда не надо иметь в таблице идентификаторов ячейку для каждого возможного значения хеш-функции, т. е. таблицу можно сделать динамической – ее объем будет расти по мере заполнения (первоначально таблица идентификаторов не содержит ни одной ячейки, а все ячейки хеш-таблицы имеют пустое значение). Этот подход позволяет достичь следующего:

· нет необходимости заполнять пустыми значениями таблицу идентификаторов, поскольку это можно сделать только для хеш-таблицы;

· каждому идентификатору соответствует одна ячейка в таблице идентификаторов (не будет пустых неиспользуемых ячеек);

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

На основе этой схемы можно реализовать уже известный способ организации таблиц идентификаторов с помощью хеш-функций, называемый методом цепочек – в таблицу идентификаторов для каждого элемента добавляется еще одно поле, в котором может содержаться ссылка на любой элемент таблицы; первоначально это поле пустое (никуда не указывает); также необходимо иметь специальную переменную, которая всегда указывает на первую свободную ячейку основной таблицы идентификаторов (первоначально она указывает на начало таблицы).

Алгоритм работы метода цепочек.

· Во все ячейки хеш-таблицы поместить пустое значение, таблица идентификаторов — пуста, переменная HeapPtr (указатель первой свободной ячейки) указывает на начало таблицы идентификаторов; i:=1.

· Вычислить значение хеш-функции ni для нового элемента Ai; если ячейка хеш-таблицы по адресу ni — пустая, то поместить в нее значение переменной FreePtr и перейти к шагу 5; иначе – к шагу 3.

· j:=1; выбрать из хеш-таблицы адрес ячейки таблицы идентификаторов mj и перейти к шагу 4.

· Для ячейки таблицы идентификаторов по адресу mj проверить значение поля ссылки; если оно пустое, то записать в него адрес из переменной FreePtr и перейти к шагу 5; иначе – j:=j+1, выбрать из поля ссылки адрес mj и повторить шаг 4.

· Добавить в таблицу идентификаторов новую ячейку, записать в нее информацию для элемента Ai (поле ссылки должно быть пустым), в переменную FreePtr поместить адрес за концом добавленной ячейки; если больше нет идентификаторов, которые надо разместить в таблице, то выполнение алгоритма закончено, иначе – i:=i+1 и перейти к шагу 2.

Алгоритм поиска элемента в таблице идентификаторов.

· Вычислить значение хеш-функции n=h(A) для искомого элемента A; если ячейка хеш-таблицы по адресу n — пустая, то элемент не найден и алгоритм завершен; иначе – j:=1, выбрать из хеш-таблицы адрес ячейки таблицы идентификаторов mj.

· Сравнить имя элемента в ячейке таблицы идентификаторов по адресу mj с именем искомого элемента A: если они совпадают, то искомый элемент найден и алгоритм завершен, иначе перейти к шагу 3.

· Проверить значение поля ссылки в ячейке таблицы идентификаторов по адресу mj: если оно пустое, то искомый элемент не найден и алгоритм завершен; иначе – j:=j+1, выбрать из поля ссылки адрес mj и перейти к шагу 2.

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

Метод цепочек является эффективным средством организации таблиц идентификаторов.

Достоинства метода цепочек:

· среднее время на размещение одного элемента и на поиск элемента в таблице для него зависит только от среднего числа коллизий, возникающих при вычислении хеш-функции;

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

· позволяет более экономно использовать память, но требует организации работы с динамическими массивами данных.

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

Как правило, применяются комбинированные методы. В этом случае, как для метода цепочек, в таблице идентификаторов организуется специальное дополнительное поле ссылки, которое, в отличие от метода цепочек, имеет иное значение: при отсутствии коллизий для выборки информации из таблицы используется хеш-функция, поле ссылки остается пустым; если возникает коллизия, то через поле ссылки организуется поиск идентификаторов, для которых значения хеш-функции совпадают по одному из методов – неупорядоченный список, упорядоченный список или бинарное дерево. При хорошо построенной хеш-функции коллизии будут возникать редко, поэтому количество идентификаторов, для которых значения хеш-функции совпали, будет не слишком велико, тогда и время поиска будет незначительным (при высоком качестве хеш-функции подойдет даже перебор по неупорядоченному списку).

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

Недостатком метода является необходимость работы с динамически распределяемыми областями памяти.

Эффективность такого метода, в первую очередь, зависит от качества применяемой хеш-функции, а во вторую – от метода организации дополнительных хранилищ данных.

Хеш-адресация – это метод, который применяется не только для организации таблиц идентификаторов в компиляторах, а в операционных системах, в системах управления базами данных.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 423; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.