我用这样的功能更新分段树。分析说这是瓶颈:
void update (int tree[], int root, int left, int right, int pos, double val)
{
if (left == right)
{
data[tree[root]] = val;
}
else
{
int middle = (left + right) / 2;
if (pos <= middle)
update(tree, root*2, left, middle, pos, val);
else
update(tree, root*2+1, middle+1, right, pos, val);
tree[root] = indexOfMax(tree, tree[root*2], tree[root*2+1]); // simple comparations
}
}
// indexOfMax is just a simple comparation
int indexOfMax(int tree[], int a, int b)
{
//cout << data[tree[a]] << " > " << data[tree[b]] << " ? " << tree[a] << " : " << tree[b] << endl;
return data[a] > data[b] ? a : b;
}
虽然内存操作很快,但我想知道它是否是由递归开销引起的,而它的深度通常不会超过20。
我从原始探查器得到的是:
所以..花在单次更新上的时间是戏剧性的:)。
回答:找到一个隐藏的std :: find over map。