【问题标题】:Starting with an empty tree, what is the complexity of inserting into Red Black Tree in big-O notation?从一棵空树开始,以大 O 表示法插入红黑树的复杂度是多少?
【发布时间】:2010-12-16 17:27:51
【问题描述】:

如果我有 10 个元素并从一棵空树开始,以大 O 表示法将 10 个元素插入 Red Black 的复杂性是多少?

会不会超过 O(log 10),因为每次插入一个元素时,它都必须为该元素寻找合适的位置,并在祖先节点和子节点之间执行一系列旋转。因此,如果我有 N 个元素并在 Red Black Tree 中插入 N 次,那不是 O(n log n) 吗?

感谢您的帮助。

【问题讨论】:

    标签: c algorithm tree binary-tree red-black-tree


    【解决方案1】:

    您永远不要使用带常量的 big-O(1 除外),因为 O(10) 的含义与 O(1) 或 O(128291) 完全相同,因此按照惯例,您始终使用 O(1)!

    那么,让我们看看将 K 项插入到最初为空的 RB-tree 中的大 O 是什么。第一次插入是一个常数时间,所以称之为 O(1);并在有 X 个项目时插入 X+1st 是 O(log(X)) (即使你必须向下旋转每一步,它仍然是与 log(X) 成比例的最坏情况,所以,O(log(X) ),因为“层”或“层”的数量仅与 X 成对数增长——因为 K 层的 RB 树的节点数量会增长为 2 的 K 次方)。

    所以我们想要 X 从 2 到 N 的 log(X) 总和(加上一个常数),它恰好等于 N 的阶乘的对数。根据Stirling's approx,大约是 N log(N ) - N,在大 O 术语中再次归结为 N log(N)。

    【讨论】:

    • @John,所以如果你喜欢它,为什么不接受它(使用问题左上角“赞成票数”大数字下的复选标记)——这是基本的礼仪,会得到您从 SO 声誉阶梯开始(是的,您通过接受获得声望!-)。
    • @AlexMartelli 我相信你有一个小错字:当有 X 个项目时插入是 O(logX) 而不是 O(X)。不错的答案顺便说一句,+1。
    • @MiljenMikic,你是对的 - 编辑修复并祝贺你在 5 年多的时间里第一个发现这个问题!-)
    【解决方案2】:

    @Justice 和 @Alex 真正了解的是,O(f(N)) 复杂性度量谈到了 N 趋于无穷大时的限制行为(例如运行时间、比较次数等)。

    他们说如果你用一个特定的值代替 N,O 术语就不再有意义了。

    还有一点他们没有提出。也就是说,您不能使用O(...) 表示法中的语句来告诉您当 N 很小时会发生什么。根据定义,“大 O”符号不会告诉您在这种情况下会发生什么。

    这不仅仅是迂腐。例如,成本函数F(N) = 1,000,000 * N + N**2O(N**2),但对于小于 1,000 的 N 值,第一项占主导地位。如果您在这种情况下尝试使用O(N**2) 度量作为估计器,您将得到完全错误的答案。

    【讨论】:

      【解决方案3】:

      将单个元素插入 RB 树的时间复杂度为 O(log n),其中 n 是树的当前大小。

      因此,将n 元素插入空 RB 树的时间复杂度为O(n log n)

      10 元素插入空的 RB 树的时间复杂度是恒定的,即O(1)。因为树一开始是空的,而且插入的元素数量是固定的,所以这里没有可变元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-15
        • 2018-11-06
        • 2013-11-17
        • 2021-10-11
        • 1970-01-01
        • 2020-03-03
        • 2014-01-01
        相关资源
        最近更新 更多