2015-03-27 4 views
0

Я пытаюсь выполнить тест производительности на контейнере std :: unordered_map C++ 11.std :: unordered_map заблокировать подсчет ведра

Я хочу видеть, как коэффициент загрузки контейнера влияет на производительность для вставок. В частности, потому что я заинтересован в использовании хеш-таблицы в качестве базовой структуры данных для нахождения пар в огромном наборе чисел.

Насколько я понимаю документацию, это не представляется возможным. Я могу установить количество ведер с rehash(), но это делается автоматически при превышении max_load_factor.

Я могу установить max_load_factor но, как я понимаю, это только определяет при выполнении перепевы, он не позволяет таблице быть размещены под сильным напряжением, которое является то, что я хочу сделать.

Есть ли какой-либо способ для меня ограничить количество ведер в хеш-таблице?

ответ

0

Не уверен, что это хороший ответ, но это объяснение, почему это может быть невозможно.

Если у вас есть открытая адресация, вам необходимо указать resize, но это детали реализации. У вас может быть реализация с использованием разрешения столкновения цепочки и ограничения места на длину цепи и изменения размера, когда она нарушена. Под капотом может случиться многое.

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

Конечно, некоторые реализации могут обрабатывать сколь угодно большие коэффициенты нагрузки, но это не общее свойство.

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

+0

Ваша логика звучит из хэш-таблиц адресации Comp Sci в целом, но 'std :: unordered_map' специально имеет коэффициент максимальной нагрузки по умолчанию 1.0, который не является допустимым, если нет цепочки для каждого ведра. –

+0

Я не нашел значение IMO, которое оно реализовало. Можете ли вы указать источник для значения «1.0»? Очевидно, что это макс для некоторых реализаций, но стандарт не определяет, какой из них следует использовать. – luk32

+0

23.5.4.2/1 и/3 говорят о эффектах конструктора 'std :: unordered_map' (post-conditions):« 'max_load_factor()' return 1.0. " Это включает конструктор, который заполняет контейнер на основе аргументов итератора, поэтому это не просто по умолчанию для пустых контейнеров, которые могут быть изменены сразу после добавления элемента. Такая же сделка для ... 'multi' ... и ...' set' контейнеров, кстати. –

2

Установите max_load_factor на номер INFINITY. Таким образом, в контейнере никогда не должно возникнуть соблазна сделать автоматический rehash, чтобы сохранить load_factor ниже max_load_factor.

 Смежные вопросы

  • Нет связанных вопросов^_^