Список вопросов по теме «Хеширование» 1. Абстрактный тип данных «множество» Множеством называется некая совокупность элементов, каждый элемент или сам является множеством, или является примитивным элементом, называемым атомом. Все элементы одного множества имеют одинаковый тип данных (целые, символы, строки символов и т.п.) - мб и не надо, но все-таки Операторы АТД, основанные на множествах: 1.UNION (A, B, C) - объединение множеств C = A B 2. INTERSECTION (A, B, C)- пересечение множеств C=AB 3. DIFFERENCE (A, B, C)- разность множеств C = A \ B 4. MERGE (A, B, C)- слияние (объединение) непересекающихся множеств C = A B. Результат не определен, если A B ≠ 5. функция MEMBER (x, A) имеет аргументами множество A и объект x того же типа, что и элементы множества A, и возвращает булево значение true, если x A, и значение false, если x A 6. MAKENULL(A) – процедура присваивает множеству A значение пустого множества. 7. Процедура INSERT (x, A) делает x элементом множества A. 8. Процедура DELETE (x, A) удаляет элемент x из множества A. 9. Процедура ASSIGN(A, B) присваивает множеству A в качестве значения множество B. 10 Функция MIN (A) возвращает наименьший элемент множества A. Для применения функции необходимо, чтобы множество A было параметризовано и его элементы были линейно упорядочены. 11. Функция EQUAL (A, B) возвращает значение true тогда и только тогда, когда множества A и B состоят из одних и тех же элементов. 12. Функция FIND (x) оперирует в среде, где есть набор непересекающихся множеств. Она возвращает имя (единственное) множества, в котором есть элемент x 2. Абстрактный тип данных «словарь» Абстрактый тип множеств с операторами MAKENULL, INSERT, DELETE и MEMBER называется DICTIONARY (Словарь) Ну или если брать из интернета АТД Словарь используется для манипулирования набором элементов, встроенных в линейном порядке. Он поддерживает динамическое редактирование элементов (создание, внесение и удаление) и различные формы поиска внутри набора (например, поиск заданного элемента, наименьшего, наибольшего элемента, предшественника или последователя элемента). Как правило, для эффективного доступа словари организуются на основе упорядоченных структур данных. 3. Способы реализации словарей – их достоинства и недостатки 1. Сортированные или неотсортированные связанные списки; 2. Двоичные векторы (когда элементы множества можно сопоставить с элементами множества целых чисел 1,…., N для некоторого N; 3. использование массивов фиксированной длины с указателями на последнюю заполненную ячейку этого массива Оператор INSERT DELETE MEMBER 1 O(N) O(N) O(N) Способ реализации словаря 2 O(1) O(1) O(1) 3 O(N) O(N) O(N) 4. Прямая адресация Прямая адресация применяется, когда количество возможных значений невелико Ключи – числа из множества U= {0, 1, …, m-1} Для хранения множества используется массив T[0..m-1], называемый таблицей с прямой адресацией (direct-address table). Или если из интернета прямая адресация. В ней каждый ключ соответствует одной и только одной ячейке массива. Другими словами, каждый индекс, вычисленный в результате хэширования, уникальный. (При представлении разреженного массива в виде массива указателей хэш-функция не должна обязательно реализовывать прямую адресацию — просто это был очевидный подход к реализации электронной таблицы.) 5. Хеш-таблицы Или если из интернета Хеш-табли́ца — это структура данных, реализующая интерфейс ассоциативного массива, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу. 6. Разрешение коллизий с помощью цепочек (открытое хеширование). Коллизия – совпадение хеш-значений двух разных ключей. Или если из интернета Каждая ячейка массива H является указателем на связный список(цепочку) пар ключ-значение, соответствующих одному и тому же хеш-значению ключа. Коллизии просто приводят к тому, что появляются цепочки длиной более одного элемента. Операции поиска или удаления элемента требуют просмотра всех элементов соответствующей ему цепочки, чтобы найти в ней элемент с заданным ключом. Для добавления элемента нужно добавить элемент в конец или начало соответствующего списка, и, в случае, если коэффициент заполнения станет слишком велик, увеличить размер массива H и перестроить таблицу. При предположении, что каждый элемент может попасть в любую позицию таблицы H с равной вероятностью и независимо от того, куда попал любой другой элемент, среднее время работы операции поиска элемента составляет Θ(1 + α), где α — коэффициент заполнения таблицы. 7. Анализ хеширования с цепочками Гипотеза равномерного хеширования – предполагаем, что каждый данный элемент может попасть в любую из позиций таблицы с равной вероятностью, независимо от того, куда попал другой элемент. Теорема 1. Пусть T - хеш-таблица с цепочками, имеющая коэффициент заполнения α. Предположим, что хеширование равномерно. Тогда при поиске элемента, отсутствующего в таблице, будет просмотрено в среднем α элементов таблицы, а среднее время такого поиска (включая время на вычисление хеш-функции) будет равно θ (1+ α) Теорема 2. При равномерном хешировании среднее время успешного поиска в хеш-таблице с цепочками есть θ (1+ α), где α - коэффициент заполнения. Или если из интернета Для добавления элемента нужно добавить элемент в конец или начало соответствующего списка, и, в случае, если коэффициент заполнения станет слишком велик, увеличить размер массива H и перестроить таблицу. При предположении, что каждый элемент может попасть в любую позицию таблицы H с равной вероятностью и независимо от того, куда попал любой другой элемент, среднее время работы операции поиска элемента составляет Θ(1 + α), где α — коэффициент заполнения таблицы 8. Требования к хеш-функции Хорошая функция для заданного кол-ва ключей имеет равномерное распределение хеш функции от 0 до m-1 Или если из интернета Функцией хэширования (в широком смысле) называется функция , удовлетворяющая минимум двум требованиям [1]: 1.Сжатие √ функция - отображает входное сообщение произвольной конечной длины в хэш-значение небольшой фиксированной длины, при этом входное сообщение будем называть прообразом. 2.Простота вычисления √ для заданной функции чем с полиномиальной сложностью. и сообщения , вычисляется не выше 9. Способы отображения произвольного ключа в множество натуральных чисел ?????????????????????????????????????????????? Мб просто то, что ниже? 10. Построение хеш- функции методом деления с остатком Деление с остатком h(k) = k mod m 11. . Построение хеш- функции методом умножения Умножение h(k ) mkAmod 1 Или если из интернета 12. универсальное хеширование Использование одной из многих возможных функций Или если из интернета Однако в конкретной ситуации все может быть совсем не так, и значения хеш-функции могут "скучиваться": для каждой конкретной хеш-функции есть "неудачные" ситуации, когда число действий оказывается большим. Прием, называемый универсальным хешированием, позволяет обойти эту проблему. Идея состоит в том, что берется семейство хеш-функций, причем любая ситуация оказывается неудачной лишь для небольшой части этого семейства. Пусть - семейство функций, каждая из которых отображает множество в множество из элементов (например, ). Говорят, что - универсальное семейство хеш-функций, если для любых двух различных значений и из множества вероятность события для случайной функции (Другими словами, те функции из всех функций в .) , для которых из семейства , составляют равна . -ую часть 13. Открытая адресация (закрытое хеширование). Все записи хранятся в самой хэш-таблице. Каждая ячейка таблицы содержит либо элемент динамического множества, либо NIL. h:U × {0, 1, …, m-1} {0, 1, …, m-1} Последовательность испробованных мест для данного ключа k имеет вид ‹h(k,0), h(k,1), . . . , h(k,m-1)› Функция h должна быть такой, чтобы каждое из чисел от 0 до m - 1 встретилось в этой последовательности ровно один раз. Или если из интернета В массиве H хранятся сами пары ключ-значение. Алгоритм вставки элемента проверяет ячейки массива H в некотором порядке до тех пор, пока не будет найдена первая свободная ячейка, в которую и будет записан новый элемент. Этот порядок вычисляется на лету, что позволяет сэкономить на памяти для указателей, требующихся в хеш-таблицах с цепочками. Последовательность, в которой просматриваются ячейки хеш-таблицы, называется последовательностью проб. В общем случае, она зависит только от ключа элемента, то есть это последовательность h0(x), h1(x), …, hn — 1(x), где x — ключ элемента, а hi(x) — произвольные функции, сопоставляющие каждому ключу ячейку в хеш-таблице. Первый элемент в последовательности, как правило, равен значению некоторой хеш-функции от ключа, а остальные считаются от него одним из приведённых ниже способов. Для успешной работы алгоритмов поиска последовательность проб должна быть такой, чтобы все ячейки хештаблицы оказались просмотренными ровно по одному разу. 14. Линейная последовательность проб при открытой адресации Пусть h’:U {0, 1, …, m-1} – обычная хеш-функция. Линейная последовательность проб h(k,i) = (h’(k) + i) mod Или если из интернета ячейки хеш-таблицы последовательно просматриваются с некоторым фиксированным интервалом kмежду ячейками (обычно, k = 1), то есть i-й элемент последовательности проб — это ячейка с номером (hash(x) + ik) mod N. Для того, чтобы все ячейки оказались просмотренными по одному разу, необходимо, чтобы k было взаимно-простым с размером хештаблицы. 15. квадратичная последовательность проб при открытой адресации Квадратичная последовательность проб h(k,i) = (h’(k) +с1i + c2i2 ) mod m Или если из интернета интервал между ячейками с каждым шагом увеличивается на константу. Если размер хештаблицы равен степени двойки (N = 2p), то одним из примеров последовательности, при которой каждый элемент будет просмотрен по одному разу, является: hash(x) mod N, (hash(x) + 1) mod N, (hash(x) + 3) mod N, (hash(x) + 6) mod N, … 16. Двойное хеширование при открытой адресации Двойное хеширование h(k,i) = (h’1(k) +i h’2(k) ) mod m Или если из интернета интервал между ячейками фиксирован, как при линейном пробировании, но, в отличие от него, размер интервала вычисляется второй, вспомогательной хеш-функцией, а значит может быть различным для разных ключей. Значения этой хеш-функции должны быть ненулевыми и взаимно-простыми с размером хеш-таблицы, что проще всего достичь, взяв простое число в качестве размера, и потребовав, чтобы вспомогательная хеш-функция принимала значения от 1 до N — 1.