【问题标题】:Time complexity of travel a trie旅行的时间复杂度
【发布时间】:2022-01-08 10:54:48
【问题描述】:

是否会是 O(26n),其中 26 是字母表中的字母数,n 是 trie 的级别数?例如,这是打印 trie 的代码:

public void print() 
{
    for(int i = 0; i < 26; i++) 
    {
        if(this.next[i] != null) 
        {
            this.next[i].print();
        }
    }
    if(this.word != null) 
    {
        System.out.println(this.word.getWord());
    }
}

所以看这段代码让我觉得我对时间复杂度的近似值在最坏的情况下是正确的,即 26 个节点已满 n 级。

【问题讨论】:

  • 数字 26 是一个常数,它不依赖于数据的大小,因此在 O 表示法中应该忽略它。
  • 关于landau符号的备注:没有O(26n)。因为26 是一个常数,所以它应该是O(n)

标签: java data-structures tree nodes trie


【解决方案1】:

会是 O(26n),其中 26 是字母表中的字母数,n 是 trie 的级别数吗?

没有。必须访问 trie 中的每个节点,并且为每个节点执行 O(1) 工作(忽略可归因于处理子节点的工作,这些工作单独计算)。子节点的数量在每个节点的基础上并不重要,只要它受一个常数(例如 26)的限制。

一共有多少个节点?通常超过存储在 trie 中的单词数,并且可能更多。对于一个简单实现的、完美平衡的、根下有 n 层的完全 trie,每一层的节点数是前一层的 26 倍,因此节点总数为 1 + 26 + 262 + ... + 26n。即 O(26n+1) == O(26n) == O(2n),或“指数”层数,也对应于其中存储的最长单词的长度。

但人们更有可能对根据存储在 trie 中的单词数量来衡量复杂性感兴趣。通过仔细的实现,可以只为这些词和两个或多个这些词共有的每个最大初始子字符串设置节点。在这种情况下,每个节点要么有零个子节点,要么至少有两个,因此对于 w 个总单词,节点的总数由 w + w/2 + w/4 + ...,收敛到 2w。因此,遍历具有这些结构属性的 trie 的成本为 O(2w) == O(w)。

此外,稍加思考,可以得出结论,我描述的特定结构属性对于 O(w) 遍历并不是真正必要的。

【讨论】:

    【解决方案2】:

    我不熟悉 trie,但大 O 表示法主要用于描述运行时间或资源消耗相对于输入大小的增长速度。我认为它只是指图表上曲线的一般形状,而不是图表上的精确点。 O(1) 看起来像一条平线,而 O(n) 看起来像一条 45 度角的线,等等。

    来源:https://medium.com/dataseries/how-to-calculate-time-complexity-with-big-o-notation-9afe33aa4c46

    现在讨论问题中的算法。我不熟悉 trie,但乍一看我会说它是 O(1)(恒定时间),因为循环的迭代次数是恒定的(总是 26)。然而,在循环中它有this.next[i].print(),它可以根据的复杂性完全改变答案,并揭示了一个我们需要知道的重要问题:n 是什么?

    我将假设this.next[i]this 属于同一类型,从而使this.next[i].print() 成为一种递归调用。在这种情况下,完成执行所需的时间将完全取决于必须迭代(访问)的实例数量。该算法类似于Depth First Search,但不能防止无限递归。这可能基于一些已知的关于next[i] 实例(节点)的附加信息,例如一个实例最多只能被另一个实例引用。在这种情况下,运行时复杂度将按O(n) 的顺序排列,其中n 是实例或节点的数量。

    ...假设this.word.getWord() 也以恒定时间运行。如果它依赖于其他单词输入,那么运行时间也可能是O(n * w),其中n 是节点数,w 是单词的大小。

    【讨论】:

    • 循环的迭代次数是固定的工作。
    • 约翰,如果不清楚,请随时编辑我的答案,但这正是我所指出的。为了找到实际的运行时间复杂度,我们需要更多的上下文——实际的“输入”是什么。
    猜你喜欢
    • 2021-03-24
    • 2022-06-28
    • 1970-01-01
    • 2016-02-13
    • 2012-08-14
    • 1970-01-01
    • 2013-09-12
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多