- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Хеширование
Хеширование - это специальный метод адресации данных для быстрого поиска нужной информации по уникальным ключам (key).
Термин «хеширование» (hashing - перемешивание) ввел в 1967 году Хеллерман (Hellerman). Дословный перевод означает - рубить, крошить, но академик А.П.Ершов предложил довольно удачный эквивалент - «расстановка».
Хеш-таблица является базовым понятием. Хеш-таблица представляет собой обычный массив со специальной адресацией, задаваемой некоторой функцией (хеш-функция). Функция, которая преобразует ключ элемента данных в некоторый индекс в таблице (хеш-таблица), называется функцией хеширования или хеш-функцией:
i = h(key);
где key - преобразуемый ключ, i - получаемый индекс таблицы, т.е. ключ отображается во множестве, например, целых чисел (хеш-адреса), которые впоследствии используются для доступа к данным. Совершенная хеш-функция - это функция:
i = h(key) = key.
Хеширование, таким образом, – это способ, который подразумевает использование значения ключа для определения его позиции в таблице без сравнения с самим ключом.
Т.е. строится обыкновенный массив с индексами i = h(key) = key; и если ключи располагаются, например, в диапазоне от 0 до 100, то никаких проблем не возникает. Но если это номера страховых карточек с девятью значащими цифрами, то для работы с ними потребуется массив с 109 элементами. Это и послужило одной из основных причин разработки различных схем хеширования, т.е. установления такой взаимосвязи между значением ключа и местоположением записи в массиве, когда размер массива будет пропорционален количеству записей, а не значениям ключа.
Таким образом, алгоритмы хеширования – это способы сведения хранения одного большого множества к более меньшему.
Однако функция расстановки может для нескольких уникальных значений ключа давать одинаковое значение позиции i в таблице. Ситуация, при которой два или более ключа получают один и тот же индекс (хеш-адрес) называется коллизией при хешировании или столкновением. (Совершенная хеш-функция не порождает коллизий).
Поэтому схема хеширования должна включать алгоритм разрешения конфликтов, определяющий порядок действий, если позиция i = h(key) оказывается уже занятой записью с другим ключом.
Имеется множество схем хеширования, различающихся и используемой хеш-функцией h(key) и алгоритмами разрешения конфликтов.
Наиболее распространенный метод задания хеш-функции: метод деления.
Исходными данными являются: - некоторый целый ключ key и размер таблицы m. Результатом данной функции является остаток от деления этого ключа на размер таблицы.
Общий вид такой функции на языке программирования С/С++:
int h(int key, int m)
{
return key % m;
}
Для m = 10 хеш-функция возвращает младшую цифру ключа.
Хеш-таблица
(m=10)
key
= 756 Коллизия
0
1
2
3
4
5
6
7
8
9
Хеш-адреса
i :
key
= 342
key
= 55556
Для m = 100 хеш-функция возвращает две младших цифры ключа.
key
= 3402 Хеш-таблица
(m=100) key=
55597 key
= 7597 Коллизия
00
01
02
.
. .
97
98
99
Хеш-адреса
i :
В рассмотренных примерах хеш-функция i = h(key) только определяет позицию, начиная с которой нужно искать (или первоначально - поместить в таблицу) запись с ключом key. Далее необходимо воспользоваться какой – либо схемой (алгоритмом) хеширования.