我不完全确定摊销的复杂性意味着什么。采用平衡的二叉搜索树数据结构(例如,红黑树)。正常搜索的成本自然是log(N),其中N是节点的数量。但是,一系列m次搜索的摊销复杂性是什么,比方说,升序。它只是log(N)/ m?
答案 0 :(得分:1)
您可以将渐近分析视为一种严格的方法来设置算法运行时间的上限,其中摊销分析是一种自由的方法。
例如,考虑具有两个语句S1和S2的算法A.执行S1的成本是10,S2是100.两个语句都放在循环中,如下所示。
n=0;
while(n<100)
{
if(n % 10 != 0)
{
S1;
}
else
{
s2;
}
n++;
}
这里S1执行的次数是S2的计数的10倍。但是渐近分析只会考虑S2需要10个单位时间的事实,并且它处于执行100次的循环中。因此,执行时间的上限大约为10 * 100 = 1000.其中,摊销分析平均了执行语句S1和S2的次数。因此,执行的上限时间约为200.因此,摊销分析可以更好地估计执行算法的上限。
答案 1 :(得分:0)
我认为它是mlog(N),因为你必须进行m次搜索操作(每次从根节点downto目标节点),而单个操作的复杂性是log(N)。
编辑:@ user1377000你是对的,我错误地从渐近复杂性中分摊了复杂性。但我不认为它是log(N)/ m ...因为不能保证你可以在O(logN)时间内完成所有m次搜索操作。What is amortized analysis of algorithms? 我认为这可能有所帮助。
答案 2 :(得分:0)
如果是平衡搜索树,则摊销的复杂性等于渐近复杂度。每次搜索操作都需要O(logn)
次,无论是渐近还是平均。因此,对于m
次搜索,平均复杂度为O(mlogn)
。
答案 3 :(得分:0)
立即传入要查找的项目。
你可以用分而治之的方式来思考它。
x
。x
二进制搜索到您的m
项目数组中。x
且大于x
的内容。 (忽略等于x
的内容,因为您已找到它。)最糟糕的情况:您的项目数组只是叶节点中的事物列表。 (n
大致为2m
。)您必须访问每个节点。您的搜索费用为lg(n) + 2*lg(n/2) + 4*lg(n/4) + ...
。这是线性的。可以把它想象成做越来越小的二进制搜索,直到你击中数组中的每个元素一次或两次。
我认为还有一种方法可以通过跟踪搜索后您在树中的位置来实现。 C ++的std::map
和std::set
返回可以在树中左右移动的迭代器,它们可能有方法可以利用树中的现有迭代器。