Fenwick tree - это структура данных, которая позволяет выполнять два вида операций (вы можете увеличить ее с помощью большего количества операций):
- обновление точки
update(index, value)
- префикс sum
query(index)
Обе операции находятся в O(log(n))
, где n
- размер массива. У меня нет проблем с пониманием того, как выполнять обе операции и логику, лежащую в их основе.
Мой вопрос в том, как я могу инициализировать дерево Fenwick из массива. Ясно, что я могу достичь этого в O(nlog(n))
, вызывая n
times update(i, arr[i])
, но есть способ инициализировать его в O(n)
.
Почему я спрашиваю об этом, если википедия говорит, что вы можете инициализировать в nlog(n)
? Поскольку статья настолько рудиментарна, что я не уверен, что это лучшая сложность, которую можно достичь. Кроме того, рисование параллелей с наивным созданием кучи, которое делается путем заполнения кучи один за другим и может быть достигнуто в O(nlog(n))
по сравнению с умной инициализацией кучи в O(n)
, дает мне надежду на то, что что-то подобное можно сделать в дереве Фенвика.