【问题标题】:Number of trie nodes required to represent certain number of strings表示一定数量的字符串所需的 trie 节点数
【发布时间】:2019-10-16 09:32:02
【问题描述】:

我应该实现 Trie 数据结构来表示字典。字典中有 1000 个单词(小写字母),每个单词的长度从 1 到 10 不等。我不允许动态分配内存,这意味着我必须事先声明所需的 Trie 节点数。如果在最坏的情况下,任何机构都可以就 1000 字所需的节点数提出任何建议,那将有很大帮助? (1000 * 10 不是可以最小化的答案)

我可以计算几个单词,比如 10 或 20,但我无法将它们形式化。

【问题讨论】:

  • 请尝试解决问题。如果您知道如何使用动态分配来做到这一点,这可能是一个起点。
  • 最快的解决方案是构建一个动态分配的 trie 并计算节点数。
  • 我知道如何动态分配,但我不能这样做。

标签: string trie


【解决方案1】:

绝对最坏的情况是所有单词都是最大大小的 trie,并且您尽可能防止共享前缀。

假设小写 a-z 字母,所有单词都可以是以下形状:

[a-z][a-z][a-z]aaaaaaa

每个单词的 [a-z] 部分都是唯一的。我们需要一个三字母前缀,因为26^2 < 1000 < 26^3

然后我们有以下 trie 布局:

  • 在第一级,所有 26 个节点都已填充(= 26 个节点)
  • 在第二层,每个第一层节点有 26 个子节点(= 676 个节点)
  • 在第三级,将存在 1000 个节点,因为我们有 1000 个单词(= 1000 个节点)
  • 这 1000 个节点中的每一个节点下面都有一个由 7 个“a”节点组成的字符串(= 7000 个节点)

这导致总共有 26 + 676 + 1000 + 7000 = 8702 个节点。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多