Я буду раскрывать свой комментарий в качестве ответа.
base::unique
(unique.default
) на векторах использует хеш-таблицы и достаточно эффективен, со средней сложностью O (1) - это, скорее всего, общий случай. Наихудшей сложностью является O (n). Но шансы на то, что это происходит при каждом вставке/поиске, должны быть крайне редкими - это должно быть ужасная хеш-функция, если это произойдет.
В вашем вопросе у вас есть только один ключевой столбец, поэтому уникальность базы должна быть достаточно эффективной. Однако в более чем одном столбце unique.data.frame
очень неэффективен - поскольку он коэрцирует все столбцы символам, затем вставляет их вместе, а затем называет unique.default
.
Вы можете использовать:
nrow(unique(z))
unique
метод data.table в, по умолчанию, содержит ключевые столбцы его by
аргумента. И поскольку мы знаем, что данные уже отсортированы, вместо упорядочения мы используем data.table:::uniqlist
, чтобы получить индексы, соответствующие уникальным строкам, намного эффективнее в O(n)
. Поэтому он эффективен для любого количества ключевых столбцов.
Однако мы могли бы добавить эту информацию в качестве атрибута при установке ключа, так как это довольно просто.
@Arun: хэш-таблицы являются «O (N)» _worst case_ (постоянное ожидание), поэтому мы получаем «O (N^2)» наихудший случай. – sds
@sds, это произойдет, если все ваши значения будут сброшены в одно и то же ведро - это должна быть ужасная хеш-функция! – Arun