在线查找n个最大元素的总和

时间:2014-07-21 14:13:56

标签: algorithm data-structures

我正在解决一个问题,但我被困在这一部分。

有3种类型的查询:添加元素(整数),删除元素,获得n的总和( n 可以是任何整数)最大元素。我怎么能这样做有效?我目前使用此解决方案:添加元素,删除元素(二进制搜索, O(lg n))。 getSum(天真,O(n))。

2 个答案:

答案 0 :(得分:3)

段树通常用于查找sum of a given range。在二叉搜索树之上构建应该获得您要查找的数据结构O(log N)添加,删除和求和范围。通过查询k个最大元素所在的范围(大约N-k to N),可以得到O(log N)中k个最大元素的总和。结果是一个可变的有序段树而不是标准的不可变(静态)无序段。

基本上,您只需添加变量来保存子节点数及其值与每个父节点的总和,并使用该信息通过O(log N)添加和/或减法来查找总和。

如果k已修复,您可以使用允许O(1)查找最小值/最大值的相同方法,以允许O(1)找到k个最大元素总和在每个O(log N)添加/删除期间更新保存该值的变量。

答案 1 :(得分:1)

很大程度上取决于查询的相对频率,但是如果我们假设总和查询比添加 - 删除请求更频繁(并且添加比删除更频繁)的典型情况,解决方案是存储总和和数字的元组。

所以第一个元素是(a 1 1 ),列表中的第二个元素是(a 2 , a 1 + a 2 )等等。 (请注意,当您在第k个位置插入新元素时,您仍然不需要执行全部求和,只需将新数字添加到前一个元素的总和中。)

删除将非常昂贵,但这是O(1)总和查询的权衡。