Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Primery_lectiy.doc
Скачиваний:
145
Добавлен:
20.06.2014
Размер:
722.43 Кб
Скачать
  1. Быстрый поиск: бинарный и последовательный поиски в массивах, хеширование Бинарный поиск

Если заранее известна некоторая информация о данных, среди которых ведется поиск, например, известно, что массив данных отсортирован, то удается сократить время поиска, используя бинарный (двоичный, дихотомический, методом деления пополам — все это другие названия алгоритма, основанного на той же идее) поиск. Итак, требуется определить место Х в отсортированном (например, в порядке неубывания) массиве А. Делим пополам и сравниваем Х с элементом, который находится на границе этих половин. Отсортированность А позволяет по результату сравнения со средним элементом массива исключить из рассмотрения одну из половин.

Пример.Пусть Х = б, а массивАсостоит из 10 элементов: 3 5 6 8 12 15 17 18 20 25.1-й шаг.Найдем номер среднего элемента:т=[(1+10)/2] = 5. Так как 6 < А [5], далее можем рассматривать только элементы, индексы которых меньше 5: 3 5 6 812 15 17 18 20 25.

2-й шаг.Рассматриваем лишь первые 4 элемента массива, находим индекс среднего элемента этой частит=[(1+4)/2] = 2, 6 > А [2], следовательно, первый и второй элементы ,из рассмотрения исключаются:3 56 812 15 17 18 20 25.

3-и шаг.Рассматриваем два элемента, значениет=[(3+4)/2] = 3:3 56812 15 17 18 20 25. А [3]= б. Элемент найден, его номер — 3.

Эффективность алгоритма:

Каждое сравнение уменьшает диапазон поиска приблизительно в два раза. Следовательно, общее количество сравнений имеет порядок O (logN).

 

Хеширование

Рассмотрим простую задачу. Количество различных буквосочетаний длиной не более 4 символов из 32 букв русского алфавита чуть больше 10^6. Мы проанализировали какой-то текст и выписали в соответствующий массив все встреченные буквосочетания. После этого на вход нашей простой системы анализа текста поступает некоторое буквосочетание. Нам необходимо ответить, встречалось оно ранее или нет. Очевидно, что каждому буквосочетанию соответствует некоторый цифровой код. Поэтому задача сводится к поиску в массиве некоторого цифрового значения — ключа.

При линейном поиске в худшем случае для ответа на вопрос "есть или нет" потребуется 106 сравнений, при бинарном — порядка 50.

Можно ли уменьшить количество сравнений и уменьшить объем требуемой оперативной памяти, резервировать не 106, а, например, 103 элементов памяти? Обозначим цифровой аналог буквосочетания символом R, а адрес в массиве (таблице) через А.

(1)Если будет найдено преобразование (R), дающее значение А такое, что выполняется достаточно быстро; (2)случаев, когда (R1) = (R2), будет минимальное количество, то задача поиска трактуется совсем иначе, чем рассмотрено выше. Этот способ поиска называется ХЕШИРОВАНИЕМ (расстановкой ключей, рандомизацией и т.д.).

Итак, ключ преобразуется в адрес, в этом суть метода. Требование по быстродействию очевидно — это одна из задач при составлении любого алгоритма, ибо быстродействие компьютера ограничено. Второе требование не столь очевидно. Предположим, что анализируется текст из специфической страны "Д..", в которой все слова начинаются с буквы "о" и в качестве выбран цифровой аналог первой буквы. В этом случае получаем одно значение А для всех слов (от чего уходили, к тому и пришли, но в стране "Д..." все возможно). Следовательно, необходимо выбирать такое преобразование , чтобы количество совпадений адресов (А) для различных значений ключей (R) (такие совпадения называют коллизиями) было минимально. Полностью избежать коллизий не удается. Для любого преобразования (хеш-функции) можно подобрать такие исходные данные, что рассматриваемый метод поиска превращается в линейный поиск. Однако цель построения хеш-функции ясна — как можно более равномерно "разбрасывать" значения ключей по таблице адресов (ее размер обозначим через М) так, чтобы уменьшить количество коллизий.

Реализация метода логически разбивается на две составляющие: 1 - построение ; 2 - схема разрешения коллизий. 1.      Так или иначе для значения ключа R находится цифровой аналог, обозначим его через t. Первый способ: в качестве М выбирается простое число и находится остаток от деления t на М(t MOD М). Второй способ: находится значение t2. Из этого значения "вырезается" q каких-то разрядов (лучше средних). Значение q выбирается таким образом, чтобы 2q было равно М.

Третий способ: w разрядов для представления ключа t разбиваются на части длиной q разрядов. Выполняется, например, логическое

сложение этих частей, и его результатом является номер элемента в таблице адресов. Считается (если не заниматься подбором специальных входных данных), что все эти способы дают достаточно хорошие в смысле количества возможных коллизий хеш-функции. Из известных методов разрешения коллизий рассмотрим один — "метод цепочек". Его суть в том, что элементом таблицы является ссылка на список элементов, имеющих одно значение хеш-функции. Рисунок справа иллюстрирует этот метод. Качество хеш-функции оценивается средней длиной списков. Рассмотрим следующую простую задачу. Дано N(1<=N<=15 000) различных двоичных чисел длины L (1 <= L <= 100), а также Q (1 <= Q <= 20 000) запросов или двоичных чисел также длины L. Требуется определить для каждою запрошенного числа, встречается оно или нет среди N ранее определенных чисел. Время решения задачи ограничено 30 секундами. Заметим, что сложность "лобового" решения имеет порядок O(N • L• M), поэтому по временному ограничению оно вряд ли приемлемо. Используем метод хеширования. Построим три различные хеш-функции, а для разрешения коллизий будем использовать "метод цепочек". Проверим решения на случайных тестах. Обозначим цифрой "1" хеш-функцию, использующую деление на простое число, "2" — возведение в квадрат, "3" — логические операции с подстроками фиксированной длины, выделяемые из значения ключа. Оцениваем минимальную и максимальную длины списков (Мin, Мах) и время решения ( t ). В таблице приведены результаты нескольких экспериментов.

Таблица 9.1.

N

L

Q

Хеш-функция

Min

Мах

t

15000

100

20000

1 2 3

14 16 11

46 45 50

9 27 10.9

15000

80

20000

1 2 3

13 14 16

46 49 48

7.3 18 8.9

10000

50

20000

1 2 3

6 10 0

34 34 106

4.3 8.7 5.8



Соседние файлы в папке Лекции