平衡二叉搜索树的摊销复杂性

时间:2013-03-14 14:44:38

标签: binary-search-tree time-complexity red-black-tree amortized-analysis

我不完全确定摊销的复杂性意味着什么。采用平衡的二叉搜索树数据结构(例如,红黑树)。正常搜索的成本自然是log(N),其中N是节点的数量。但是,一系列m次搜索的摊销复杂性是什么,比方说,升序。它只是log(N)/ m?

4 个答案:

答案 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)

立即传入要查找的项目。

你可以用分而治之的方式来思考它。

  1. 在根节点中获取项目x
  2. x二进制搜索到您的m项目数组中。
  3. 将数组分区为小于x且大于x的内容。 (忽略等于x的内容,因为您已找到它。)
  4. 递归搜索左侧孩子的前一个分区,右侧孩子的后一个分区。
  5. 最糟糕的情况:您的项目数组只是叶节点中的事物列表。 (n大致为2m。)您必须访问每个节点。您的搜索费用为lg(n) + 2*lg(n/2) + 4*lg(n/4) + ...。这是线性的。可以把它想象成做越来越小的二进制搜索,直到你击中数组中的每个元素一次或两次。

    我认为还有一种方法可以通过跟踪搜索后您在树中的位置来实现。 C ++的std::mapstd::set返回可以在树中左右移动的迭代器,它们可能有方法可以利用树中的现有迭代器。