树状数组是一种数据结构,它允许两种操作(可以增加更多操作):
- 点更新
update(index, value)
- 前缀和
query(index)
这两个操作的时间复杂度都为O(log(n))
,其中n
是数组的大小。我没有问题理解如何执行这两个操作以及它们背后的逻辑。
我的问题是如何从数组初始化树状数组。显然,我可以通过调用n
次update(i,arr[i])
来达到O(nlog(n))
的时间复杂度,但是否有一种方式可以在O(n)
的时间内进行初始化。
为什么会问这个问题,如果维基百科告诉你可以在nlog(n)
内进行初始化?因为这篇文章太基础了,我不确定它是否是最优的复杂度。此外,将其与朴素堆创建进行对比,后者是通过一个一个地填充堆来完成的,可以在O(nlog(n))
的时间内实现,而智能堆初始化则可以在O(n)
的时间内完成,这让我希望可以在树状数组中实现类似的操作。
O(n*log(n))
的算法,并提供了一个O(n)
的算法。虽然很不错的发现。 - Vesper