6

Должен ли я поддерживать
1.) SortedDictionary (двойной, STRUCT)
2.) или просто обычный словарь (двойной, STRUCT) плюс SortedSet (двойной)?Производительность: SortedDictionary против SortedSet

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

Я чувствую, что время работает мудро - Оба такие же, SortedSet<double> просто делает дополнительную работу. Можете вы, ребята, подтвердить?

Часть, о которой я не знаю, поддерживает ли сортировка, SortedDictionary перемещается только по клавишам (удваивает) или обе клавиши и значения. В последнем случае 2.) превысит 1.), не так ли?

Кроме того, неясно, как SortedDictionary внутренне реализован. Sortedset - это красно-черное дерево, которое является проверенным исполнителем.

+0

Вы сделали какой-либо бенчмаркинг, чтобы узнать, какая из них лучше? –

+1

Это звучит как микро-оптимизация. По логике, в сортированную структуру данных и несортированные данные потребуется больше времени. Я считаю, что производительность между вставкой в ​​sorteddictionary vs sortedset должна быть одинаковой, поскольку они оба используют ключ того же типа для сортировки. Итак, вопрос в том, хотите ли вы 1 структуру или 2? – brcpar

+0

Учитывая, что все, что вам нужно, это значения 'max', почему вам нужно отслеживать все предметы? – wdosanjos

ответ

9

SortedDictionary<K, V> - это путь. Не только потому, что это правильная структура для вашего использования, но даже с точки зрения производительности и обслуживания, это будет только лучше.


Я просто хочу быстро вставки

  1. Во втором случае вам придется вставить как в Dictionary<K, V>, а также SortedSet<K>. Это две вставки (одна O (1) и другая O (log n)). Я ожидал бы, что это будет медленнее, чем одиночная вставка в SortedDictionary<K, V> (O (log n)).

  2. SortedDictionary<K, V> внутренне реализована как SortedSet<KeyValuePair<K, V>> с сравнение делается на Key части KeyValuePair<K, V>. Поэтому, если вас устраивает производительность SortedSet<T>, тогда не стоит оглядываться назад.

в SortedDictionary движется вокруг только ключи (двойные), или и ключи и значения

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

его непонятно, как отсортированныйdictionary внутренне реализован. Сортировка - это красно-черное дерево, которое является проверенным исполнителем.

SortedDictionary<K, V> внутренне реализована как SortedSet<KeyValuePair<K, V>> с сравнение делается на Key части KeyValuePair<K, V>. It is a red-black tree. Так что это доказанный исполнитель тоже ...


Также отметим, что SortedDictionary<K, V> будет легче на память, а также приводит к более быстрому удалению, а также перечисление. Гибридный подход даст вам быстрый поиск, но он должен будет выполнить поиск каждого ключа в словаре для соответствующей части значения во время перечисления. Это будет медленнее.


Alert: я не читаю ваши комментарии, когда я писал выше !!

структура Я использую это своего рода тяжелый ~ 100 байт

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

Я сделал быстрый и грязный Dictionary<K, V>/SortedSet<K> гибридной конструкции и протестировал его.

  • Действительно, это было быстрее для 100-байтовой структуры, когда дело дошло до ввода (более чем в два раза быстрее). Конечно, существует штраф (кто создал бы 100-байтовую структуру?).

  • Когда я изменил его на класс, они оба дали одинаковые показатели вставки.

  • Когда я уменьшил размер структуры, даже тогда производительность вставки была сопоставимой.

Таким образом, мое предложение переключается на класс и использует SortedDictionary<K, V>. Если вы застряли со структурой, то Dictionary<K, V>/SortedSet<K> будет лучше. Хорошее q и +1.

+1

Просто nitpick. В примечании с большим О, O (1) + O (log N) не определяется как больше или меньше O (log N). Все, что вы можете сказать, если это единственная информация, которую вы даете, это неоднозначно. – Shiv

+0

@ Действительно! Хороший момент, он будет отредактирован. – nawfal

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

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