【发布时间】:2015-06-26 08:32:02
【问题描述】:
Fenwick tree 是一种允许两种操作的数据结构(您可以通过更多操作来扩充它):
- 点更新
update(index, value) - 前缀和
query(index)
这两个操作都在O(log(n)) 中,其中n 是数组的大小。我对如何执行这两种操作及其背后的逻辑没有任何问题。
我的问题是如何从数组中初始化 Fenwick 树。显然我可以在O(nlog(n)) 中实现这一点,通过调用n 次update(i, arr[i]),但是有没有办法在O(n) 中初始化它。
如果维基百科告诉你可以在nlog(n) 中初始化,我为什么要问这个?因为这篇文章太简陋了,所以我不确定它是否是可以达到的最佳复杂性。还与简单的堆创建相似,这是通过逐个填充堆来完成的,可以在O(nlog(n)) 中实现,而O(n) 中的智能堆初始化让我希望可以在 Fenwick 树中完成类似的事情。
【问题讨论】:
-
@DavidEisenstat 没有重复,因为检查了
O(n*log(n))的算法,这里要求并提供了一个O(n)算法。虽然很好找。 -
@Vesper 这是一个 O(n log n) 时间的算法,更仔细地分析为 O(n)。
-
关于@DavidEisenstat 链接到的问题的更新表明,所讨论的算法毕竟不是天真的算法(从经验上看似乎是 Omega(n log n)),而是一个实际上与我的非常相似——唯一的区别是它“拉”值而不是“推”它们。