【发布时间】:2010-11-22 23:04:58
【问题描述】:
例如,假设您在列表中按给定顺序有以下数字:
list = [4, 10, 3, 5, 1]
所以列表[0] == 4,列表[4] == 1。
现在假设您需要一个求和查询,它会告诉您直到该给定位置的所有先前值的总和。
list.sum(0) == 4
list.sum(1) == 14
list.sum(2) == 17
list.sum(3) == 22
list.sum(4) == 23
此外,我还想要以下操作,同时仍保持求和查询不变:
list.swap(0, 1) // swap the two positions
list == [10, 4, 3, 5, 1]
list.slideBefore(0, 3) // slides 1st position value to before the 2nd position
list == [4, 3, 10, 5, 1]
list.slideAfter(2, 3) // slide 1st position value to after 2nd position
list == [4, 3, 5, 10, 1]
list.replace(3, 9) // replace value at 1st param with literal value 2nd param
list == [4, 3, 5, 9, 1]
list.append(17) // adds value to end
list == [4, 3, 5, 9, 1, 17]
这可以通过数组轻松处理。但是总和查询总是 O(n)。我希望找到一种数据结构,将求和查询保持在 O(1) 或 O(lg n),同时将上述操作保持在 O(1) 或 O(lg n)。
我相信我可能能够操纵fast array 数据结构来完成我想要的,但我还没有完全解决。
我查看的另一个数据结构是 Fenwick 树,但我不清楚它是否可以工作。
有什么建议、想法、技巧或技巧吗?
【问题讨论】:
标签: arrays data-structures tree sum