Со страницы документации, на которую вы ссылались, это выглядит довольно ясно:
Оператор
blockquote>vstore
и данные, на которые он указывает, требуются при наличии данных о вариациях и должны быть опущены при отсутствии данных о вариациях .Итак, не помещайте оператор
vstore
в topDICT.
В зависимости от распределения входа Вы смогли получать некоторое улучшение, не изменяя структуру.
Если Вы склонны получать много выполнений единственного значения, то можно, вероятно, ускорить вставки путем ведения учета последнего значения, которое Вы вставили, и не потрудитесь делать вставку, если это соответствует. Это стоит дополнительного сравнения на вход, но сохраняет поиск для каждого элемента в вышедшем за пределы первое. Таким образом, это могло улучшить вещи, какую структуру данных Вы используете, в зависимости от частоты повторений и относительной стоимости сравнения по сравнению со вставкой.
Если Вы не получаете выполнения, но Вы склонны находить, что значения не равномерно распределяются, то косое дерево делает доступ к большинству наиболее часто используемых элементов более дешевый. Это работает путем создания сознательно несбалансированного дерева с частыми элементами около вершины, как код Хаффмана.
Для используемого набора, который, как ожидают, будет этим маленьким, необъединенная в блок хеш-таблица могла бы быть в порядке. Если можно жить со случайной операцией расширения, вырастить его в полномочиях 2, если это получает полных больше чем 70%. Сумасшедшее хеширование было обсуждено на Stackoverflow прежде и могло бы также быть хорошим подходом для набора это маленькое. Если действительно необходимо оптимизировать для скорости, можно реализовать хеш-функцию и поиск в ассемблере - на линейных структурах данных, это будет очень просто, таким образом, усилие по кодированию и обслуживанию для ассемблерной реализации не должно быть незаконно трудно поддержать.
Я не уверен, что понимаю "много вставок, которые поражают те же записи". Вы подразумеваете, что существует только 100 значений, которые являются когда-нибудь участниками, но 500k главным образом дублирующиеся операции, которые вставляют одно из тех 100 значений?
Если так, затем я предположил бы, что самый быстрый контейнер должен будет генерировать без коллизий, долго обсуждают те 100 значений, затем поддерживают массив (или вектор) флагов (интервал или бит, согласно тому, что удается самый быстрый на Вашей архитектуре).
Я оставляю генерацию хеша как осуществление для читателя, так как это - что-то, что я знаю, существует как техника, но я никогда не изучал его сам. Точка должна добраться, быстрое долго обсуждают максимально маленький диапазон, такой что для каждого n, m в Ваших 100 значениях, (n) хеша! = хеш (m).
Таким образом, вставка похожа array[hash(value)] = 1;
, удаление похоже array[hash(value)] = 0;
(хотя Вам не нужно это), и перечислить Вас работает на основе массива, и для каждого установленного значения в индексе n, inverse_hash (n) находится в Вашем наборе. Для маленького диапазона можно легко поддержать справочную таблицу для выполнения обратного хеша, или вместо того, чтобы сканировать целый массив, ища флаги набора, можно работать на основе 100 потенциально - в значениях, проверяющих каждого в свою очередь.
Извините, если я неправильно понял ситуацию, и это бесполезно Вам. И честно говоря, это не намного быстрее, чем регулярная хеш-таблица, с тех пор реалистично для 100 значений можно легко измерить таблицу, таким образом, что будут немногие или никакие коллизии, не используя такую память для выдувания кэшей.
Вы могли бы хотеть рассмотреть реализацию HashTree с помощью основы 10 хеш-функций при каждом уровне вместо двоичной хеш-функции. Вы могли или сделать, это не объединило в блок, в этом случае Ваша производительность будет детерминирована (log10) или скорректирует Ваш размер блока на основе Вашего ожидаемого распределения так, чтобы у Вас только было несколько ключей/блоков.
Рандомизированная структура данных могла бы идеально подойти для Вашего задания. Смотрите на список пропуска – хотя я не знаю достойной реализации C++ его. Я намеревался отправить тот для Повышения, но никогда не двигался, чтобы сделать это.
Возможно, набор с B-деревом (вместо двоичного дерева) как внутренняя структура данных. Я нашел эту статью о codeproject, который реализует это.
Сколько памяти Вы имеете? Взятие на 32 бита "только" 4GB/8 байты, который доходит до 512 МБ, не очень для высокопроизводительного сервера. Это сделало бы Ваши вставки O (1). Но это могло сделать повторение медленным. Хотя пропуск всех слов с только обнуляет, оптимизировал бы далеко большинство повторений. Если Ваши 100 чисел находятся в относительно маленьком диапазоне, можно оптимизировать еще больше путем имения в наличии минимума и максимума.
Я знаю, что это - просто грубая сила, но иногда грубая сила достаточно хороша.
Обратите внимание, что, в то время как вставка в хеш-таблицу быстра, выполняя итерации по нему, не особенно быстро, так как необходимо выполнить итерации по целому массиву.
Какая операция является медленной для Вас? Вы делаете больше вставок или больше повторения?
Так как никто явно не упомянул это, Вы думали о местности памяти? Действительно большая структура данных с алгоритмом для вставки, которая вызывает отсутствие страницы, сделает Вас отрицательный результат. На самом деле структура данных со вставкой, которая просто вызывает неудачное обращение в кэш, вероятно, была бы действительно плоха для перфекта.
Вы удостоверились наивный незаказанный набор элементов, упакованных в фиксированном массиве простой подкачкой к передней стороне, когда вставка collisides является слишком медленной? Это - простой эксперимент, который мог бы показать, что у Вас есть проблемы местности памяти, а не алгоритмические проблемы.