Частые вставки в отсортированную коллекцию

2

Я отсортировал коллекцию (List), и мне нужно постоянно ее сортировать.

В настоящее время я использую List.BinarySearch в своей коллекции, а затем вставляю элемент в нужное место. Я также попробовал список сортировки после каждой вставки, но производительность неприемлема.

Есть ли решение, которое даст лучшую производительность? Может быть, я должен использовать другую коллекцию.

(Я знаю SortedList, но он ограничен уникальными ключами)

  • 1
    По какому типу вы сортируете? ... string, int, other ..
Теги:
performance
collections

3 ответа

3
Лучший ответ

PowerCollections имеет тип OrderedBag, который может быть хорош для того, что вам нужно. Из документов

Вставка, удаление и поиск все элементы выполняются в log (N) + M время, где N - количество ключей в дерево, а M - текущее число копий элемента, являющегося обрабатываются.

Однако для встроенных типов .NET 3.5 использование List.BinarySearch и вставка каждого элемента в правильное место - это хороший старт, но он использует массив внутри, чтобы ваша производительность снижалась из-за всего копирования. делая, когда вы вставляете.

Если вы можете группировать свои вставки в партии, которые улучшат ситуацию, но если вы не сможете перейти только к одной операции сортировки после всей вашей вставки, вам, вероятно, лучше использовать OrderedBag от PowerCollections, если сможете.

  • 0
    PowerCollections и его OrderedBag великолепны, однако я использовал приоритетную очередь (также недоступную в .NET)
  • 0
    это все еще так через 6 лет?
Показать ещё 1 комментарий
3

Если вы используете .Net 4, вы можете использовать SortedSet<T>

http://msdn.microsoft.com/en-us/library/dd412070.aspx

Для .Net 3.5 и ниже, посмотрите, работает ли SortedList<TKey,TValue>.

http://msdn.microsoft.com/en-us/library/ms132319.aspx

  • 2
    SortedSet не допускает дублирования. И ни один не будет SortedList
1

Попробуйте объединить вставки в партии и отсортировать только в конце каждой партии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню