Вы правы в том, что ha sh вставка таблицы не гарантируется равной O(1)
из-за коллизий. Если вы используете стратегию открытой адресации для борьбы со столкновениями, процесс вставки элемента займет время, пропорциональное 1/(1-a)
, где a
- это пропорция того, сколько емкости таблицы было использовано. Когда таблица заполняется, a
становится равным 1, и время для вставки увеличивается без ограничений.
Секрет сохранения сложности времени при O(1)
заключается в том, что в таблице всегда есть место. Таким образом, a
никогда не станет слишком большим. Вот почему вам нужно изменить размер таблицы, когда она начинает исчерпывать емкость.
Проблема: изменение размера таблицы с помощью элемента N
занимает O(N)
время.
Решение: экспоненциально увеличить емкость Например, удваивайте его каждый раз, когда вам нужно изменить размер. Таким образом, размер таблицы изменяется очень редко. Стоимость случайных операций изменения размера «амортизируется» из-за большого количества вставок, и поэтому люди говорят, что вставка таблицы ha sh имеет «амортизированную O (1)» сложность времени.
TLDR: Удостоверьтесь, что вы увеличиваете емкость таблицы, когда она заполняется, возможно использование на 70-80%. Когда вы увеличиваете емкость, убедитесь, что она постоянна, например, удвоите ее.