Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB-2012 / 2-cеместр / Дневники / Самостоятельная работа / Лекция 2_9. Хеширование.doc
Скачиваний:
19
Добавлен:
26.03.2015
Размер:
2.41 Mб
Скачать
        1. Первичная кластеризация

Линейная проверка имеет одно неприятное свойство, которое называется первичной кластеризацией(primaryclustering). После добавления большого числа элементов в таблицу, возникает конфликт между новыми элементами и уже имеющимися кластерами, при этом для вставки нового элемента нужно обойти кластер, чтобы найти пустую ячейку.

Чтобы увидеть, как образуются кластеры, предположим, что вначале имеется пустая хеш‑таблица, которая может содержать Nэлементов. Если выбрать случайное число и вставить его в таблицу, то вероятность того, что элемент займет любую заданную позициюPв таблице, равна 1/N.

При вставке второго случайно выбранного элемента, он может отобразиться на ту же позицию с вероятностью 1/N. Из‑за конфликта в этом случае он помещается в позициюP+ 1. Также существует вероятность 1/N, что элемент и должен располагаться в позицииP+ 1, и вероятность 1/N, что он должен находиться в позицииP- 1. Во всех этих трех случаях новый элемент располагается рядом с предыдущим. Таким образом, в целом существует вероятность 3/Nтого, что 2 элемента окажутся расположенными вблизи друг от друга, образуя небольшой кластер.

По мере роста кластера вероятность того, что следующие элементы будут располагаться вблизи кластера, возрастает. Если в кластере находится два элемента, то вероятность того, что очередной элемент присоединится к кластеру, равна 4/N, если в кластере четыре элемента, то эта вероятность равна 6/N, и так далее.

Что еще хуже, если кластер начинает расти, то его рост продолжается до тех пор, пока он не столкнется с соседним кластером. Два кластера сливаются, образуя кластер еще большего размера, который растет еще быстрее, сливается с другими кластерами и образует еще большие кластеры.

В идеальном случае хеш‑таблица должна быть наполовину пуста, и элементы в ней должны чередоваться с пустыми ячейками. Тогда с вероятностью 50 процентов алгоритм сразу же найдет пустую ячейку для нового добавляемого элемента. Также существует 50‑процентная вероятность того, что он найдет пустую ячейку после проверки всего лишь двух позиций в таблице. Средняя длина тестовой последовательности равна 0,5 * 1 + 0,5 * 2 = 1,5.

В наихудшем случае все элементы в таблице будут сгруппированы в один гигантский кластер. При этом все еще есть 50‑процентная вероятность того, что алгоритм сразу найдет пустую ячейку, в которую можно поместить новый элемент. Тем не менее, если алгоритм не найдет пустую ячейку на первом шаге, то поиск свободной ячейки потребует гораздо больше времени. Если элемент должен находиться на первой позиции кластера, то алгоритму придется проверить все элементы в кластере, чтобы найти свободную ячейку. В среднем для вставки элемента при таком распределении потребуется гораздо больше времени, чем когда элементы равномерно распределены по таблице.

На практике, степень кластеризации будет находиться между этими двумя крайними случаями. Вы можете использовать программу Linearдля исследования эффекта кластеризации. Запустите программу и создайте хеш‑таблицу со 100 ячейками, а затем добавьте 50 случайных элементов со значениями до 999. Вы обнаружите, что образовалось несколько кластеров. В одном из тестов 38 из 50 элементов стали частью кластеров. Если добавить еще 25 элементов к таблице, то большинство элементов будут входить в кластеры. В другом тесте 70 из 75 элементов были сгруппированы в кластеры.