В C # BCL уже есть BST, он называется SortedDictionary<TKey, TValue>
, если вам не нужны пары значений ключей, но вместо этого вам нужны отдельные элементы, вы можете использовать SortedSet<T>
(SortedSet находится в .NET 4.0 ).
Звучит так, будто из вашего примера вы хотите SortedDictionary<int, WhateverValueType>
. Хотя я не совсем уверен, что вы ищете, когда говорите «равномерный случайный выбор».
Конечно, Dictionary<TKey, TValue>
- это O (1), что намного быстрее. Поэтому, если вам не нужен отсортированный порядок ключей, я бы использовал это.
ОБНОВЛЕНИЕ : Судя по вашим потребностям, вы поймете, как повысить эффективность. Как часто вы будете вставлять / удалять, чтобы иметь возможность перейти к случайному смежному индексу в структуре данных? Если не часто, вы можете использовать массив и просто Sort () после (O (n log n)), или всегда вставлять / удалять по порядку (O (n)).
Или вы можете обернуть Dictionary<int, YourType>
и сохранить параллель List<int>
и обновлять его после каждого добавления / удаления:
_dictionary.Add(newIndex, newValue);
_indexes.Add(newIndex);
А затем просто получите случайный индекс из списка при поиске. Приятно то, что в этом методе действительно Add () будет ~ O (1) (если только List не изменяет размеры, но вы можете установить начальную емкость, чтобы избежать некоторых из этого), но вы бы понесли затраты O (n) на удаление .
Боюсь, проблема в том, что вы либо жертвуете временем при поиске, либо при удалении / вставке. Проблема в том, что все лучшие контейнеры времени доступа не являются смежными. Однако с двойной комбинацией List<int>/Dictionary<int, YourValue>
вы получите довольно хороший микс.
ОБНОВЛЕНИЕ 2 : По нашему постоянному обсуждению звучит так, что, если это абсолютное качество - ваше требование, вам, возможно, повезет больше. Хотя было интересно подумать, я обновлю, если что-нибудь еще придумаю.