Содержание
- 2. Хэширование–это преобразование входного массива данных определенного типа и произвольной длины в выходную битовую строку фиксированной длины.
- 3. Хеширование применяется для сравнения данных: если у двух массивов хеш-коды разные, массивы гарантированно различаются; если одинаковые
- 4. Существует множество массивов, дающих одинаковые хеш-коды — так называемые коллизии. Вероятность возникновения коллизий играет немаловажную роль
- 5. Идея хеширования впервые была высказана Г.П. Ланом при создании внутреннего меморандума IBM в январе 1953 г.
- 6. В открытой печати хеширование впервые было описано Арнольдом Думи (1956 год), указавшим, что в качестве хеш-адреса
- 7. Хэш-таблица – это структура данных, реализующая интерфейс ассоциативного массива, то есть она позволяет хранить пары вида
- 8. С точки зрения практического применения, хорошей является такая хэш-функция, которая удовлетворяет следующим условиям: функция должна быть
- 9. Если бы все данные были случайными, то хэш-функции были бы очень простые (например, несколько битов ключа).
- 10. При возникновении коллизий (разным ключам соответствует одно значение хэш-функции) необходимо найти новое место для хранения ключей,
- 11. Хэш-таблицы должны соответствовать следующим свойствам: Выполнение операции в хэш-таблице начинается с вычисления хэш-функции от ключа. Получающееся
- 12. Хэширование полезно, когда широкий диапазон возможных значений должен быть сохранен в малом объеме памяти, и нужен
- 13. Методы разрешения коллизий Коллизии, когда разным ключам соответствует одно значение хэш-функции, осложняют использование хэш-таблиц, т.к. нарушают
- 14. Метод цепочек Технология сцепления элементов состоит в том, что элементы множества, которым соответствует одно и то
- 15. Пример реализации метода цепочек при разрешении коллизий: ? на ключ 002 претендуют два значения, которые организуются
- 16. Операции поиска или удаления данных требуют просмотра всех элементов соответствующей ему цепочки, чтобы найти в ней
- 17. При предположении, что каждый элемент может попасть в любую позицию таблицы с равной вероятностью и независимо
- 18. Метод открытой адресации В отличие от хэширования с цепочками, при открытой адресации никаких списков нет, а
- 19. При любом методе разрешения коллизий необходимо ограничить длину поиска элемента!!!!!!!!. Если для поиска элемента необходимо более
- 20. Алгоритмы хэширования Существует несколько типов функций хеширования, каждая из которых имеет свои преимущества и недостатки и
- 21. Таблица прямого доступа Простейшей организацией таблицы, обеспечивающей идеально быстрый поиск, является таблица прямого доступа. В такой
- 22. Пространство ключей - множество всех теоретически возможных значений ключей записи. Пространство записей - множество тех ячеек
- 23. В большинстве реальных задач размер пространства записей много меньше, чем пространства ключей. Например, если в качестве
- 24. В целях экономии памяти можно назначать размер пространства записей равным размеру фактического множества записей или превосходящим
- 25. Метод остатков от деления Простейшей хэш-функцией является деление по модулю числового значения ключа Key на размер
- 26. Если ключей меньше, чем элементов массива, то в качестве хэш-функции можно использовать деление по модулю, то
- 27. //функция создания хеш-таблицы: //метод деления по модулю (самый //распространённый) int Hash(int Key,int HashTableSize) { return Key
- 28. Функция середины квадрата преобразует значение ключа в число, возводит это число в квадрат, из числа выбирает
- 29. Цифровое представление ключа разбивается на части, каждая из которых имеет длину, равную длине требуемого адреса. Над
- 30. Ключ, записанный как число в некоторой системе счисления P, интерпретируется как число в системе счисления Q>P.
- 31. Открытое хэширование Основная идея базовой структуры при открытом (внешнем) хэшировании заключается в том, что ✵ потенциальное
- 32. Часто классы называют сегментами, поэтому будем говорить, что элемент х принадлежит сегменту h(x). Массив, называемый таблицей
- 33. //Пример 1. Программная реализация открытого хэширования. #include #include using namespace std; typedef int T; // тип
- 34. //функция поиска местоположения и вставки вершины в таблицу Node *insertNode(T data) { Node *p, *p0; hashTableIndex
- 35. //функция удаления вершины из таблицы void deleteNode(T data) { Node *p0, *p; hashTableIndex bucket; p0 =
- 36. //функция поиска вершины со значением Node *findNode (T data) { Node *p; p = hashTable[myhash(data)]; while
- 37. int main() { int i, *a, maxnum; cout cin >> maxnum; cout cin >> hashTableSize; a
- 38. // вывод эдементов массива в файл List.txt ofstream out("List.txt"); for (i = 0; i { out
- 39. //очистка хэш-таблицы for (i = maxnum-1; i >= 0; i--) deleteNode(a[i]); return 0; } 50 элементов
- 40. Закрытое хеширование При закрытом (внутреннем) хэшировании в хэш-таблице хранятся непосредственно сами элементы, а не заголовки списков
- 41. При поиске элемента х необходимо просмотреть все местоположения h(x),h1(х),h2(х),..., пока не будет найден х или пока
- 42. Если в хэш-таблице допускается удаление элементов, то при достижении пустого сегмента, не найдя элемента х, нельзя
- 43. Важно различать константы DEL и NULL – последняя находится в сегментах, которые никогда не содержали элементов.
- 44. Линейное опробование Это последовательный перебор сегментов таблицы с некоторым фиксированным шагом: адрес=h(x)+ci, где i – номер
- 45. Квадратичное опробование отличается от линейного тем, что шаг перебора сегментов нелинейно зависит от номера попытки найти
- 46. Двойное хэширование Основана на нелинейной адресации, достигаемой за счет суммирования значений основной и дополнительной хэш-функций: адрес=h(x)+ih2(x).
- 47. В случае многократного превышения адресного пространства и, соответственно, многократного циклического перехода к началу будет происходить просмотр
- 48. Например, методика линейного опробования для разрешения коллизий – не самый лучший выбор: Как только несколько последовательных
- 49. //Пример 2. Программная реализация закрытого хеширования. #include #include using namespace std; typedef int T; // тип
- 50. int _tmain(int argc, _TCHAR* argv[]) { int i, *a, maxnum; cout cin >> maxnum; cout cin
- 51. //выделить память used = new bool[hashTableSize]; //выделить память для флажков //заполнение нулями for (i = 0;
- 52. // очистка хеш-таблицы for (i = maxnum-1; i >= 0; i--) { deleteData(a[i]); } system("pause"); return
- 53. // функция поиска величины, равной data bool findData (T data) { hashTableIndex bucket; bucket = myhash(data);
- 54. bucket = (bucket + 1) % hashTableSize; else if(dist(myhash(hashTable[bucket]),bucket) bucket = (bucket + 1) % hashTableSize;
- 55. 25 элементов и размер таблицы тоже 25 10 элементов и размер таблицы тоже 10
- 56. До сих пор рассматривались способы поиска в таблице по ключам, позволяющим однозначно идентифицировать запись. Такие ключи
- 57. Ключевые термины: Вторичные ключи – это ключи, не позволяющие однозначно идентифицировать запись в таблице. Закрытое хэширование
- 58. Пространство записей – это множество тех ячеек памяти, которые выделяются для хранения таблицы. Пространство ключей –
- 59. Контрольные вопросы Каков принцип построения хеш-таблиц? Существуют ли универсальные методы построения хеш-таблиц? Почему возможно возникновение коллизий?
- 61. Скачать презентацию