Каковы за и против [закрытого] TreeSet

Это не ответ, но интересно, находится ли понимание в этом направлении:

> tapply((my.data$item[my.data$fixed==0])[-1], my.data$year[my.data$fixed==0][-1], sum)

tapply производит таблицу статистики (суммы, в этом случае; третий аргумент) сгруппированный параметром, данным как второй аргумент. Например

2001 2003 2005 2007
1    3    5    7

[-1] нотация отбрасывает наблюдение (строка) один от выбранных строк. Так, Вы могли циклично выполнить и использовать [-i] на каждом цикле

for (i in 1:length(my.data$item)) {
  tapply((my.data$item[my.data$fixed==0])[-i], my.data$year[my.data$fixed==0][-i], sum)
}

учет того факта, что, если у Вас есть какие-либо годы только с 1 наблюдением, затем таблицы, возвращенные последовательными вызовами tapply, не будут иметь того же числа столбцов. (т.е. если бы Вы опускаете единственное наблюдение на 2001, затем 2003, 2005, и 2007 был бы te только возвращенные столбцы).

19
задан Lightness Races with Monica 12 June 2011 в 05:09
поделиться

5 ответов

Один из классов Коллекции. Он позволяет вам получить доступ к элементам в вашей коллекции по ключу или последовательно по ключу. У него значительно больше накладных расходов, чем у ArrayList или HashMap. Используйте HashSet, когда вам не нужен последовательный доступ, просто ищите по ключу. Используйте ArrayList и используйте массивы. сортируйте, если вы просто хотите, чтобы элементы были в порядке. TreeSet постоянно поддерживает порядок элементов. С ArrayList вы просто сортируете, когда вам нужно. С помощью TreeSets ключ должен быть встроен в объект, который вы храните в коллекции. Часто у вас может быть TreeSet of Strings. Все, что вы можете сделать, это сказать, находится ли данная строка в наборе. Он не найдет вам связанный объект, как Treemap. В TreeMap ключи и объекты, с которыми они связаны, разделены.

TreeSet и его брат TreeMap, как ни странно, не имеют ничего общего с представлением деревьев. Внутри они используют древовидную организацию, чтобы дать вам отсортированный по алфавиту набор / карту, но вы не можете контролировать связи между родителями и детьми.

Внутренне TreeSet использует красно-черные деревья. Нет необходимости предварительно сортировать данные, чтобы получить хорошо сбалансированное дерево. С другой стороны, если данные отсортированы (по возрастанию или по убыванию), это не повредит, как это происходит с некоторыми другими типами дерева.

Если вы не предоставляете Comparator для определения желаемого порядка, TreeSet требует реализации Comparable в классе элементов для определения естественного порядка.

24
ответ дан 30 November 2019 в 03:34
поделиться

Минусы: Одна ловушка с TreeSet заключается в том, что он неожиданным образом реализует интерфейс Set. Если TreeSet содержит объект a, то объект b считается частью набора, если a.compareTo (b) возвращает 0, даже если a.equals (b) имеет значение false, поэтому, если compareTo и equals не реализованы согласованным образом , вас ждет плохая поездка.

Это особенно проблема, когда метод возвращает Set, и вы не знаете, является ли реализация TreeSet или, например, HashSet.

Урок для здесь учиться, всегда избегайте непоследовательной реализации compareTo и equals. Если вам нужно упорядочить объекты способом, несовместимым с равенством, используйте компаратор.

9
ответ дан 30 November 2019 в 03:34
поделиться

TreeSet:
Плюсы: сортировка, основанная на алгоритме красного / черного дерева, обеспечивает сложность операций O (log (N)).
Минусы: значение должно быть либо Comparable , либо вам необходимо указать Comparator в конструкторе. Более того, реализация HashSet обеспечивает лучшую производительность, поскольку обеспечивает сложность ~ O (1).

3
ответ дан 30 November 2019 в 03:34
поделиться

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

-1
ответ дан 30 November 2019 в 03:34
поделиться

TreeSet фрагментирует память и имеет дополнительные накладные расходы на память. Вы можете просмотреть источники и рассчитать объем дополнительной памяти и количество дополнительных объектов, которые она создает. Конечно, это зависит от характера хранимых объектов, и вы также можете заподозрить, что я параноик по поводу памяти :) но лучше не тратить его здесь и там - у вас есть сборщик мусора, у вас есть промахи в кеше, и все эти вещи медленные.

Часто можно использовать PriorityQueue вместо TreeSet. И в вашем типичном случае лучше просто отсортировать массив строк.

2
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: