Изменения

Перейти к: навигация, поиск

Разрешение коллизий

694 байта добавлено, 19:07, 18 мая 2013
Удаление элемента без пометок (в разработке)
== Удаление элемента без пометок (в разработке) ==
Рассуждение будет описывать случай с линейным поиском хеша. Будем при удалении элемента сдвигать всё последующие на шаг назад. При этом необходимо, чтобы:
* если в цепочке встречается элемент с другим хешем, то он должен остаться на своём месте (такая ситуация может возникнуть если оставшаяся часть цепочки была добавлена позже этого элемента)
* в цепочке не должно оставаться "дырок", тогда любой элемент с данным хешем будет доступен из начала цепи
Учитывая это будем действовать следующим образом: при поиске следующего элемента цепочки будем пропускать все ячейки с другим значением хеша, копировать первый найденный элемент копировать в текущую ячейку , и затем рекурсивно его удалять. Если такой следующей ячейки нет, то текущий элемент можно просто удалить, сторонние цепочки при этом не разрушатся (кстати это неверно для квадратичного поиска).
=== Псевдокод=== delete(i) j = i + q while !isFree(table[j]) && == null || table[j].key != table[i].key if (isFree(tabletalbe[j])== null) table[i].makeFree()= null exit j += q table[i] = table[j] delete(j);
Массив считаем зацикленным
Асимптотика=== Время работы ===Заметим что указатель j в каждой итерации перемещается вперёд на q (с учётом рекурсивных вызовов delete). То есть этот алгоритм просто проходит по всей цепочке, и асимптотика у delete такая же как у find.
Случай зацикливания мы не рассматриваем, поскольку если q взаимнопросто с размером хеш-таблицы, то для зацикливания в ней вообще не должно быть свободных элементов
==Двойное хеширование==
308
правок

Навигация