Почему unordered_multiset плохо работает для многих равных ключей

У меня есть этот кусок кода:

unordered_multiset<int> t;
for (int i = 0; i < 1000000; i++) {
    if (i % 10000 == 0)
        cout << i << endl;

    t.insert(10);
}

Так что это просто помещает много равных элементов в unordered_multiset, Но я узнал, что чем больше элементов в хэше, тем медленнее это работает? И я не могу понять причину. По моему мнению, после применения хеш-функции и нахождения сегмента равных элементов (поскольку все равные элементы сгруппированы вместе), stl просто помещает их в конец сегмента.

Так что здесь не так?

UDP: я нашел описание функции unordered_multiset::insert

Вставки отдельных элементов: Средний регистр: постоянный. В худшем случае: линейный по размеру контейнера.

Таким образом, вопрос теперь можно перефразировать так: "Почему наихудший случай является линейным"

2 ответа

Все идет в одном ведре. Чтобы положить что-то в конец ведра, вы должны найти конец ведра, и чем больше вещей в ведре, тем дольше это занимает.

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

Когда вы сохраняете одинаковое значение во всех элементах, они все равно окажутся в одном и том же сегменте. Наихудшее условие для хеш-таблицы!

Другие вопросы по тегам