性能问题:分段树,更新功能

时间:2012-12-06 16:13:47

标签: recursion profiling segment-tree

我用这样的功能更新分段树。分析说这是瓶颈:

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。

我从原始探查器得到的是:

  • 4.39434ms - 对数据进行二元搜索的平均时间
  • 2642.94ms - 单次更新的时间
  • 19.9097ms - 单个RMQ查询的时间。

所以..花在单次更新上的时间是戏剧性的:)。

回答:找到一个隐藏的std :: find over map。

0 个答案:

没有答案