【问题标题】:Amortized complexity of a balanced binary search tree平衡二叉搜索树的摊销复杂度
【发布时间】:2013-03-02 23:42:55
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    好吧,您可以将渐近分析视为设置算法运行时间上限的严格方法,而摊销分析是一种较为宽松的方法。

    例如考虑一个算法 A 有两个语句 S1 和 S2。执行 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。因此,摊销分析可以更好地估计执行算法的上限。

    【讨论】:

    • 谢谢。所以在平衡二叉搜索树的情况下,它只是 O(logN)/m? (因为 O(logN) 是搜索的最坏情况)。其实我们每次都要回根吗?
    【解决方案2】:

    我认为是 mlog(N),因为你必须做 m 个搜索操作(每次从根节点到目标节点),而单个操作的复杂度是 log(N)。

    编辑:@user1377000 你是对的,我把分期复杂度和渐近复杂度弄错了。但我不认为它是 log(N)/m... 因为不能保证你可以在 O(logN) 时间内完成所有 m 搜索操作。

    What is amortized analysis of algorithms? 我认为这可能会有所帮助。

    【讨论】:

    • 你确定吗?摊销复杂性似乎是一种平均值。我不确定如何。
    • 好吧,我认为搜索的最坏情况是 O(logN)。所以从技术上讲,它应该是 O(log(N)/m)。但我也听到有人说它是 O(log(N/m))... 也许如果我们不每次都从根搜索,但记住位置。
    【解决方案3】:

    平衡搜索树的情况下,摊销复杂度等于渐近复杂度。每个搜索操作都需要O(logn) 时间,包括渐近和平均时间。因此对于m 搜索,平均复杂度将为O(mlogn)

    【讨论】:

      【解决方案4】:

      一次性输入要找到的所有物品。

      你可以从分而治之的角度来思考它。

      1. 在根节点中取项目x
      2. x 进行二进制搜索到您的 m 项目数组中。
      3. 将数组划分为小于x 和大于x 的事物。 (忽略等于 x 的东西,因为你已经找到了。)
      4. 在您的左孩子中递归搜索前一个分区,在您的右孩子中搜索后者。

      一个最坏的情况:您的项目数组只是叶节点中的事物列表。 (n 大约是2m。)您必须访问每个节点。您的搜索将花费lg(n) + 2*lg(n/2) + 4*lg(n/4) + ...。那是线性的。可以将其视为进行越来越小的二进制搜索,直到您将数组中的每个元素都命中一次或两次。

      我认为还有一种方法可以做到这一点,即在搜索后跟踪您在树中的位置。 C++ 的 std::mapstd::set 返回可以在树中左右移动的迭代器,并且它们可能具有可以利用现有迭代器进入树的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        相关资源
        最近更新 更多