2017-01-28 2 views
0

Глядя на документацию на https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx, и я не вижу пути. В идеале я бы хотел найти медиана (средний элемент или сумма как среднего) SortedSet<int> в O(log(n)) времени (очевидно, я знаю, что могу сделать это в O(n) времени, преобразовывая в список или массив).Простой запрос: У SortedSet <T> есть простой способ найти медианный элемент?

ответ

3

Ну, к сожалению, вы правы. SortedSet не обеспечивает встроенный способ получения медианы. Это связано с тем, что базовая структура данных SortedSet является красно-черным деревом. (например, см. Red-black tree в Википедии)

Возможно ли использовать другую коллекцию или она должна быть SortedSet? В противном случае я бы предложил преобразовать его в список или массив и получить медианное значение в O (1) раз, обратившись к элементу с индексом length+1/2 для нечетного значения length или в среднем по элементам length/2 и length/2 - 1.

+0

Хороший ответ. Кроме того, я полагаю, что красно-черное дерево может быть изменено, чтобы отслеживать общее количество элементов каждого узла, и, если подсчет известен, достаточно информации для доступа к элементу по индексу в O (log (n)) время. 'SortedSet' не делает этого, но настраиваемая реализация, которая может быть хорошо подходит для OP. – hvd

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