.NET эквивалент Java's TreeSet.floor & TreeSet.ceiling - PullRequest
0 голосов
/ 05 сентября 2018

Например, есть дерево бинарного поиска, которое содержит диапазон значений. Прежде чем добавить новое значение, мне нужно проверить, не содержит ли оно «почти дубликат». У меня есть решение Java, которое просто выполняет пол и потолок и дальнейшее условие, чтобы сделать работу.

JAVA : Учитывая TreeSet, floor() возвращает наибольший элемент в этом наборе, меньший или равный данному элементу; ceiling() возвращает наименьший элемент в этом наборе, больший или равный данному элементу

TreeSet<Long> set = new TreeSet<>();

long l = (long)1;  // anything
Long floor = set.floor(l);
Long ceil = set.ceiling(l);

C # : Ближайшая структура данных выглядит как SortedSet<>. Кто-нибудь может посоветовать лучший способ получить результаты для пола и потолка для входного значения?

SortedSet<long> set = new SortedSet<long>();

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Выше, как уже упоминалось, не является ответом, так как это дерево, мы ожидаем логарифмические времена. Методы пола и потолка Java являются логарифмическими. GetViewBetween является логарифмическим, как и Max и Min, поэтому:

этаж для SortedSet<long>: sortedSet.GetViewBetween(long.MinValue, num).Max

потолок для SortedSet<long>: sortedSet.GetViewBetween(num, long.MaxValue).Min

0 голосов
/ 05 сентября 2018

Вы можете использовать что-то вроде этого. В Linq есть метод LastOrDefault:

var floor = sortedSet.LastOrDefault(i => i < num);
// num is the number whose floor is to be calculated
if (! (floor < sortedSet.ElementAt(0)))
{
  // we have a floor
}
else
 // nothing is smaller in the set
{
}
...