2013-04-17 1 views
2

У меня есть класс Node, который имеет свойство float Distance.Какую родовую коллекцию я должен выбрать в C# для поддержания отсортированного «списка»

Мне нужна структура данных, которую я могу разместить внутри всех моих узлов, и они будут отсортированы (например, в дереве AVL или Red Black Tree).

  • Я хочу, чтобы вставить в O (журнал (п))
  • Я хочу, чтобы извлечь и удалить минимум в O (журнал (п))

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

Использование списка и сортировки я из вопроса, так как удаление (O (п)) и найти минимальное также (O (п))

Все мне нужно, это простой общий красный черный древовидная структура, которая будет Сортировка по некоторому предикату, который я предоставил (чтобы сравнить расстояние внутри узла)

Есть ли такая структура данных в BCL?

+1

О, я не знаю .. как насчет 'SortedList <>'? Я знаю, что имя неопределенное и запутанное;) http://msdn.microsoft.com/en-us/library/ms132319.aspx SortedDictionary можно использовать как список, и он имеет вложение и удаление O (log n). –

+1

Вы попробовали класс SortedList? http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx –

+0

Что вы хотите, это куча, и я не думаю, что BCL имеет встроенную систему, поэтому вам придется написать свое собственное или найти какую-то существующую реализацию. – Lee

ответ

4

Вы хотите использовать класс библиотеки c5 Collections Library TreeBag<T>. Это красно-черное дерево, которое позволяет дублировать (отсюда сумка, а не комплект). доступ по индексу значения элемента - O (log n); вставка и удаление O (log n) амортизируются.

Библиотека C5 Collection финансировалась Microsoft; он с открытым исходным кодом и доступен gratis. Цена правильная.

http://www.itu.dk/research/c5/

2

Другим вариантом является skip list. .NET Framework не имеет одного, но я реализовал один в C# некоторое время назад. См. A More Memory-Efficient Skip List.

В списке пропусков есть вставка, поиск и удаление O (log n), а O (1) удаление верхнего элемента.

Если вы хотите кучу, см. A Generic Binary Heap Class.

3

На самом деле, для этого вы можете использовать SortedDictionary. Но то, что вам нужно (при условии, что расстояние int) является SortedDictionary<int, List<Item>>.

Если вы хотите, чтобы добавить расстояние, недоступное в словаре, добавьте новый List содержащий единственный объект. Если вы хотите добавить расстояние, которое уже находится в словаре, найдите правильный список и добавьте к нему элемент.

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

С удалением от начала в List неэффективно, вам нужно будет либо удалить с конца List (в результате LIFO порядка для элементов с одинаковым ключом), или использовать Queue вместо List.

Это, вероятно, не самое эффективное решение, но вставка, поиск наименьшего элемента и удаление наименьшего элемента - все O (log n).

+0

+1 Полное объяснение. Боковое замечание. Я подозреваю, что ваши оптимизации части «удалить из списка» неприменимы, так как наиболее вероятные элементы с одним и тем же ключом должны сравниваться с «Equals», чтобы найти правильный, а не просто удалить произвольный. –

+0

@AlexeiLevenkov Вопрос задает вопрос об удалении самого маленького предмета, а не определенного элемента. – svick

+0

Я вижу это сейчас - как-то я прочитал его как «удалить элемент» вместо «удалить элемент с минимальным ключом» - удалил мой ответ как не связанный из-за него. –

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