АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Метод цепочек или гроздей

Читайте также:
  1. A) Метод опроса
  2. I. Метод стандартизации
  3. I. Методы выбора инновационной политики
  4. I. ОРГАНИЗАЦИОННО-МЕТОДИЧЕСКИЙ РАЗДЕЛ
  5. I. Основные характеристики и проблемы философской методологии.
  6. I.ЗАГАЛЬНІ МЕТОДИЧНІ ВКАЗІВКИ
  7. II. ВИРУСОЛОГИЧЕСКИЙ МЕТОД
  8. II. Вывод и анализ кинетических уравнений 0-, 1-, 2-ого порядков. Методы определения порядка реакции
  9. II. Методологічні засади, підходи, принципи, критерії формування позитивної мотивації на здоровий спосіб життя у дітей та молоді
  10. II. Методы прогнозирования и поиска идей
  11. II. Формальная логика как первая система методов философии.
  12. II. Цитогенетический метод

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

Поиск поступившего слова и его добавление к списку, в случае необходимости, осуществляется за 5 шагов следующим образом:

 

1. По входному слову определяется хеш–функция или индекс. Этот индекс определяет номер элемента хеш–таблицы, то есть определяет указатель на список слов с полученным индексом. Если этот указатель равен NIL, то есть указывает на пустой список, то выполняется шаг 2, иначе шаг 3.

 

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

 

3. Найденный элемент хеш–таблицы указывает на некоторый связанный список слов, а именно тех слов, индекс которых совпадает с вычисленным индексом. Поиск в этом списке осуществляется до тех пор, пока не произойдет совпадение входного слова с элементом списка и далее последует шаг 5, или будет достигнут конец списка, и выполнится шаг 4.

 

4. Множество не содержит входного слова, его нужно добавлять, сформировав новый элемент списка и связав его, например, с последним из рассмотренных элементов. Далее выполняется шаг 5.

 

5. Алгоритм завершает работу, возвращая указатель на найденный или сформированный элемент.

 

В литературе неслучайно хеш–методы иногда описываются в терминах “ гроздей “ (buckets). Говорят, что каждый хеш–индекс указывает на некоторую гроздь, и все слова, имеющие этот индекс, принадлежит одной грозди.

Для примера возьмем слова из дерева поиска с рисунка 3.3 и изобразим на рис. 3.9 возможный результат предложенного метода хеширования. Для того чтобы вычислить индекс, в этом примере нужно сложить номера (в алфавитном порядке) двух первых букв слова и взять остаток от деления результата суммирования на 7. Например, индекс слова break получается сложением 2 (номер b) и 18 (номер r) и последующим делением результата (20) на 7. Остаток от деления равен 6. Это значит, что указатель списка, содержащий слово break (если такой список существует), находится в 6 –ой ячейке хеш–таблицы.

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

 

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

Для примера вначале рассмотрим не такую уж случайную хеш–функцию, которая предполагает, что каждое слово относиться к одному из 26 списков по первой букве слова. Так как в английском языке гораздо больше слов, которые начинаются с буквы R, чем слов, начинающихся с буквы О, следует ожидать, что R – список будет содержать гораздо больше элементов, чем О – список. Такая неравномерность еще более усилится, если программирующий на ФОРТРАНе решит, что в его программе все идентификаторы целых переменных будут начинаться с буквы I. Итак, предположенный метод плох всем за исключением способа получения индекса.

Метод индексации по двум буквам, примененный в примере на рис. 3.9, лучше, чем метод индексации по одной букве, так как он ведет к более равномерному заполнению списков. Однако программист может употреблять имена с одинаковым началом (например, alpha1, alpha2, alpha3 и т.д.), что отрицательно повлияет на работу компилятора. Можно добиться быстрого поиска, если вычислять индекс по сумме всех букв. Однако затраты при вычислении индекса могут перекрыть выигрыш во времени поиска. Таким образом, нужно найти компромисс между временем поиска и времени вычисления индекса. На практике используются хеш–функции рассмотренные выше в одноименном разделе.

Определим теперь, насколько большой нужно делать хеш–таблицу. Считая, что слова помещаются в списки случайным образом, можно изучить вопрос об объеме таблицы чисто количественным методом. Пусть в хеш–таблице есть место для С указателей, и пусть случайным образом введены М слов. Если входное слово случайно выбрано из М слов, то ожидаемое число сравнений Е, необходимых для нахождения входного слова, будет равно:

Е = 1 + (М –1) / (2*С).

Чтобы установить, что некоторого нового слова в множестве нет, нужно провести M/C сравнений. Если нам известно число слов, с которыми придется иметь дело, эта формула говорит нам, как именно число сравнений зависит от объема таблицы. В таблице 3.1 помещены результаты вычислений для некоторых значений М и С.

Пусть нас интересует эффективность обработки 500 различных слов, и мы хотим узнать сколько списков выгоднее завести: 500 или 100. Преимуществом 100 списков является то, что экономится место, необходимое для 400 указателей, а недостатком – то, что для идентификации слова необходимо (в среднем) на 2 сравнения больше. Решение сводится к выбору между 400 дополнительными указателями и 2 дополнительными сравнениями, необходимыми для идентификации каждого слова. Но этот поиск выполняются по 10 раз для каждой строки программы. Неизбежно напрашивается вывод, что на размере хеш–таблицы экономить не надо. Еще лучшего эффекта можно достигнуть, сочетая хеш–метод цепочек и деревья поиска.

 

Таблица 3.1.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)