左派堆很慢地合并

时间:2014-10-31 12:37:14

标签: c++ leftist-tree

我的实现行为正确,只有少量可追踪的项目。这个左派堆需要几秒钟来插入50,000个物品,当它需要一个倾斜堆几毫秒。

所以我相信我已正确实施算法,但效率不高。

struct Lode
{
    int getRank()
    {
        rank = 1;

        if (left || right)
        {
            int rankL = 0, rankR = 0;

            if (left)  rankL =  left->getRank();
            if (right) rankR = right->getRank();

            if (rankL < rankR)
                rank = rankL + 1;
            else
                rank = rankR + 1;
        }
        return rank;
    }
};

struct Leap
{
    Lode* merge(Lode* x, Lode* y)
    {
        if (!x) return y;
        if (!y) return x;

        if (x->data > y->data)
            swap(x,y);

        x->right = merge(x->right, y);

        x->getRank();
        int rankL = 0, rankR = 0;
        if (x->left)  rankL = x->left->rank;
        if (x->right) rankR = x->right->rank;

        if (rankL < rankR)
            swap(x->left, x->right);

        return x;
    }
}

省略了Irrelevent(?)代码。

1 个答案:

答案 0 :(得分:0)

这是排名计算的一个问题,正如molbdnilo所说。唯一需要的计算是

x->rank = x->right->rank + 1;

递归地询问每个子节点的等级是完全不必要和低效的。