我认为这个问题只是二叉搜索树的直接应用,对于插入和查询,它的平均情况成本(在 n 次随机操作之后)O(1.39log(n))。
您所要做的就是递归地添加新节点并同时更新值和求和。
实现也相当简单(对不起 C#),例如 Add()(AddUp() 类似 - 每次转到左子树或右子树时增加值):
public void Add(int key, int value)
{
Root = Add(Root, key, value);
}
private Node Add(Node node, int key, int value)
{
if (node == null)
{
node = new Node(key, value, value);
}
if (key < node.Key)
{
node.Left = Add(node.Left, key, value);
}
else if (key > node.Key)
{
node.Right = Add(node.Right, key, value);
}
else
{
node.Value = value;
}
node.Sum = Sum(node.Left) + Sum(node.Right) + node.Value;
return node;
}
对于我机器上的 100000 个数字,这将转换为这些数字:
Added(up) 100000 values in: 213 ms, 831985 ticks
Got 100000 values in: 86 ms, 337072 ticks
对于 100 万个数字:
Added(up) 1000000 values in: 3127 ms, 12211606 ticks
Got 1000000 values in: 1244 ms, 4857733 ticks
这段时间是否足够有效?你可以试试完整代码here。