【发布时间】:2014-11-03 04:26:44
【问题描述】:
我的实现在少量、可追溯的项目中表现正确。这个左派堆需要几秒钟才能插入 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;
}
}
忽略不相关的(?)代码。
【问题讨论】:
-
我认为你重新计算排名太频繁了,以至于 O(lg(n))。
-
这个问题比较适合Code Review - StackExchange。
标签: c++ leftist-tree