Я читал книгу Введение в алгоритмы поиск лучших способов обработки повторяющихся ключей в двоичном дереве поиска.Спецификация производительности для обработки повторяющихся ключей в двоичном дереве поиска
Там несколько способов, указанные для этого случая использования:
Keep булево флаг
x:b
в узлеx
, и установитьx
к либоx:left
илиx:right
на основе значенияx:b
, который чередуется междуFALSE
иTRUE
каждый раз, когда мы посетимx
, вставляя узел с тем же ключом, что иx
.Сохраните список узлов с равными ключами на
x
и вставьте 'в список.Произвольно установлено
x
либоx:left
, либоx:right
.
Я понимаю, каждая реализация имеет свои хиты производительности/промахи, и STL
может реализовать его по-разному от Boost Containers
.
Является ли ограничение производительности упомянутым в спецификации C++11
наихудшей производительностью обработки дубликатов ключей, например, для multimap
?
FWIW, я являюсь поклонником варианта 2 - хотя для каждого узла может потребоваться дополнительный указатель, он наглядно иллюстрирует ваше намерение другим, кто может проверять/поддерживать ваш код , – Bukes
ya, даже я бы предпочел бы это, но тогда он был бы линейным во времени, и, как вы упомянули, тоже вызвало бы некоторое пространство. – basav
Если вы делаете это для удовольствия, то нет никакой разницы. Если вы заботитесь о производительности, то «неупорядоченные», «навязчивые» и «плоские» версии мультиплексоров и мультимножеств часто избивают бинарные древовидные. –