2013-02-16 3 views

ответ

23

Это не должно быть документально оформлено, так как оно представляет собой деталь реализации.

Например, существует более одной реализации SortedDictionary: есть Microsoft и есть реализация Mono.

И реализация Mono фактически использует красно-черное дерево в текущей версии (2.10.9). Так же и в текущей версии .NET (вы можете найти это путем декомпиляции кода, например, используя Reflector, ildasm.exe или встроенный просмотрщик IL в MonoDevelop).

Однако, это, вероятно, изменится в будущем, так как there are actually more efficient implementations (как B trees).

Итак, опять же: эта информация не полезна, это деталь реализации, и она is будет изменяться с высокой вероятностью.

2

Со своей странице MSDN:

SortedDictionary шаблонный класс представляет собой бинарное дерево поиска с O (Log п) поиска, где п число элементов в словаре

1

Вы можете декомпилируйте его (например, с Reflector) ... НО, так как это «деталь реализации», я бы не стал полагаться на него, его можно было изменить в любое время с любым обновлением.

Не знаете, насколько важна такая деталь реализации, но если вам действительно нужно дерево RedBlack, THEN реализуйте его явно ... что-нибудь еще будет «техническим долгом»/«desaster ждет, чтобы произойти» ИМХО.

+0

Почему декомпилировать, когда Microsoft выпустила .Net как с открытым исходным кодом? http://referencesource.microsoft.com/#System/compmod/system/collections/generic/sorteddictionary.cs – nivs1978

6

Это официальная документация фирмы MSDN страница;

SortedDictionary общий класс представляет собой бинарное дерево поиска с O (журнал п) извлечения, где п число элементов в словаре


Является SortedDictionery красно- черное дерево?

Ну, я не слишком много fimiliar с red-black tree, но я просто декомпилированы SortedDictionary класс с dotPeek (который свободен), но алгоритм удаления красно-черного дерева и Remove SortedDictionary (в) код метода не кажется аналогичный. Итак, мои деньги за No.

SortedDictionary сохраняет ключи всегда отсортированными. Это позволяет избежать сортировки ключей самостоятельно. Его производительность поиска медленнее, чем Dictionary. Он имеет преимущества, если вам нужна отсортированная таблица поиска в памяти.

enter image description here

Dictionary lookup time:  Close to O(1) 
SortedDictionary lookup time: O(log n) 

Проверьте больше деталей из here.

+2

Не уверен, что вы декомпилировали, но 'SortedDictionary' внутренне использует' TreeSet', который является внутренним классом и, реализуется с точки зрения красно-черного дерева. –

+0

@ KonradRudolph Хмм, я декомпилировал метод 'Remove()', который использовал метод 'internal virtual bool DoRemove (T item)', но, похоже, это не похоже на «красно-черное дерево» (которое является двоичным поиск дерева) [алгоритм удаления] (http://en.wikipedia.org/wiki/Binary_search_tree#Deletion). Здесь я чего-то не хватает? –

+0

Я на самом деле не получил доступ к реализации .NET на данный момент (я нахожусь на Mac), но я проверил связанные ресурсы и реализацию ссылок Rotor (что, конечно же, не является официальным), и я почти все что 'SortedDictionary' * does * использует' TreeSet', который является красно-черным деревом. –

5

Документация, похоже, гарантирует O (log n) для извлечения из BST. Если они сообщают «в среднем» с соответствующими деревьям, то даже не балансирующие реализации могут утверждать это. Даже если это была худшая гарантия, это вместе с бытием BST недостаточно, чтобы сказать, является ли оно или не реализовано как красно-черные деревья, не прибегая к декомпиляции. Это также может быть AVL, splay или какой-либо другой балансирующий сорт.

Я вытащил точку заглядывания. На сборке 4.0.0.0. В OrderedDictionary используется Treeset, который подклассы SortedSet. Вероятно, это будет красно-черное дерево. Тем не менее, это не типичный пример, подобный многим примерам в Интернете, который обеспечивает балансировку реализации после вставки или удаления. Реализация в первую очередь повторяется, и вставка, как представляется, исправляет цвета по пути вниз, а не после вставки (сверху вниз - есть пара статей по подобному подходу). Нечто похожее было на удаление, но у него нет времени проверить его. Конечно, не что-то прямо сопоставимое.

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

+0

Ничего себе приятное исследование! – Nahum