Сбалансированный BST предпочтителен, если вам нужно защитить структуру данных от всплесков задержки и атак хеш-коллизий.
Первое происходит, когда структура на основе массива растет и изменяется в размерах, последнее является неизбежным свойством алгоритма хеширования в виде проекции из бесконечного пространства в ограниченный целочисленный диапазон.
Другая проблема в .NET заключается в том, что существует LOH, и при достаточно большом словаре вы сталкиваетесь с фрагментацией LOH. В этом случае вы можете использовать BST, заплатив цену за больший класс алгоритмической сложности.
Короче говоря, с BST, подкрепленным кучей распределения, вы получаете время O (log (N)) для наихудшего случая, с хеш-таблицей вы получаете время наихудшего случая O (N).
BST поставляется по цене O (log (N)) среднего времени, худшей локальности кэша и большего количества кучи, но имеет гарантии задержки и защищен от атак по словарю и фрагментации памяти.
Стоит отметить, что BST также подвержен фрагментации памяти на других платформах, не использующих сборщик мусора.
Что касается объема памяти, класс .NET Dictionary`2 более эффективен для памяти, поскольку он хранит данные в виде связанного списка без кучи, в котором хранятся только данные о значениях и смещениях.
BST должен хранить заголовок объекта (так как каждый узел является экземпляром класса в куче), два указателя и некоторые дополненные данные дерева для сбалансированных деревьев. Например, красно-черному дереву потребуется логическое значение, интерпретируемое как цвет (красный или черный). Это как минимум 6 машинных слов, если я не ошибаюсь. Итак, каждый узел в красно-черном дереве в 64-битной системе имеет минимум:
3 слова для заголовка = 24 байта
2 слова для дочерних указателей = 16 байт
1 слово для цвета = 8 байт
хотя бы 1 слово для значения 8+ байтов
= 24 + 16 + 8 + 8 = 56 байт (+8 байт, если дерево использует указатель родительского узла).
В то же время минимальный размер словарной статьи будет всего 16 байтов.