Быстрый контейнер для установки битов в редком домене и итерации (C++)?

Со страницы документации, на которую вы ссылались, это выглядит довольно ясно:

Таблица 9 Основные записи оператора DICT

Оператор vstore и данные, на которые он указывает, требуются при наличии данных о вариациях и должны быть опущены при отсутствии данных о вариациях .

Итак, не помещайте оператор vstore в topDICT.

5
задан Serge 22 November 2008 в 13:32
поделиться

9 ответов

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

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

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

6
ответ дан 13 December 2019 в 05:44
поделиться

Для используемого набора, который, как ожидают, будет этим маленьким, необъединенная в блок хеш-таблица могла бы быть в порядке. Если можно жить со случайной операцией расширения, вырастить его в полномочиях 2, если это получает полных больше чем 70%. Сумасшедшее хеширование было обсуждено на Stackoverflow прежде и могло бы также быть хорошим подходом для набора это маленькое. Если действительно необходимо оптимизировать для скорости, можно реализовать хеш-функцию и поиск в ассемблере - на линейных структурах данных, это будет очень просто, таким образом, усилие по кодированию и обслуживанию для ассемблерной реализации не должно быть незаконно трудно поддержать.

1
ответ дан 13 December 2019 в 05:44
поделиться

Я не уверен, что понимаю "много вставок, которые поражают те же записи". Вы подразумеваете, что существует только 100 значений, которые являются когда-нибудь участниками, но 500k главным образом дублирующиеся операции, которые вставляют одно из тех 100 значений?

Если так, затем я предположил бы, что самый быстрый контейнер должен будет генерировать без коллизий, долго обсуждают те 100 значений, затем поддерживают массив (или вектор) флагов (интервал или бит, согласно тому, что удается самый быстрый на Вашей архитектуре).

Я оставляю генерацию хеша как осуществление для читателя, так как это - что-то, что я знаю, существует как техника, но я никогда не изучал его сам. Точка должна добраться, быстрое долго обсуждают максимально маленький диапазон, такой что для каждого n, m в Ваших 100 значениях, (n) хеша! = хеш (m).

Таким образом, вставка похожа array[hash(value)] = 1;, удаление похоже array[hash(value)] = 0; (хотя Вам не нужно это), и перечислить Вас работает на основе массива, и для каждого установленного значения в индексе n, inverse_hash (n) находится в Вашем наборе. Для маленького диапазона можно легко поддержать справочную таблицу для выполнения обратного хеша, или вместо того, чтобы сканировать целый массив, ища флаги набора, можно работать на основе 100 потенциально - в значениях, проверяющих каждого в свою очередь.

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

3
ответ дан 13 December 2019 в 05:44
поделиться

Вы могли бы хотеть рассмотреть реализацию HashTree с помощью основы 10 хеш-функций при каждом уровне вместо двоичной хеш-функции. Вы могли или сделать, это не объединило в блок, в этом случае Ваша производительность будет детерминирована (log10) или скорректирует Ваш размер блока на основе Вашего ожидаемого распределения так, чтобы у Вас только было несколько ключей/блоков.

1
ответ дан 13 December 2019 в 05:44
поделиться

Рандомизированная структура данных могла бы идеально подойти для Вашего задания. Смотрите на список пропуска – хотя я не знаю достойной реализации C++ его. Я намеревался отправить тот для Повышения, но никогда не двигался, чтобы сделать это.

1
ответ дан 13 December 2019 в 05:44
поделиться

Возможно, набор с B-деревом (вместо двоичного дерева) как внутренняя структура данных. Я нашел эту статью о codeproject, который реализует это.

0
ответ дан 13 December 2019 в 05:44
поделиться

Сколько памяти Вы имеете? Взятие на 32 бита "только" 4GB/8 байты, который доходит до 512 МБ, не очень для высокопроизводительного сервера. Это сделало бы Ваши вставки O (1). Но это могло сделать повторение медленным. Хотя пропуск всех слов с только обнуляет, оптимизировал бы далеко большинство повторений. Если Ваши 100 чисел находятся в относительно маленьком диапазоне, можно оптимизировать еще больше путем имения в наличии минимума и максимума.

Я знаю, что это - просто грубая сила, но иногда грубая сила достаточно хороша.

0
ответ дан 13 December 2019 в 05:44
поделиться

Обратите внимание, что, в то время как вставка в хеш-таблицу быстра, выполняя итерации по нему, не особенно быстро, так как необходимо выполнить итерации по целому массиву.

Какая операция является медленной для Вас? Вы делаете больше вставок или больше повторения?

0
ответ дан 13 December 2019 в 05:44
поделиться

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

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

0
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: