【问题标题】:Utilizing a trie Data Struture使用 trie 数据结构
【发布时间】:2015-10-21 00:02:10
【问题描述】:

所以我正在实现一个用于从文件中读取唯一单词的 trie。我在网上寻找如何实现它并遇到了这种方式: //将字符串插入到trie树中 '

void insert(struct node *head, string str)
{
    int i, j;
    for(i = 0;i < str.size(); ++i){
        //if the child node is pointing to NULL
        if(head -> next_char[str[i] - 'a'] == NULL){
            struct node *n;
            //initialise the new node
            n = new struct node;
            for(j = 0;j < 26; ++j){
                n -> next_char[j] = NULL;
            }
            n -> end_string = 0;
            head -> next_char[str[i] - 'a'] = n;
            head = n;
        }
        //if the child node is not pointing to q
        else head = head -> next_char[str[i] - 'a'];
    }
     //to mark the end_string flag for this string
    head -> end_string = 1;
}

我的困惑来自于: 'head -> next_char[str[i] - 'a'] == NULL 在这段代码实现它的所有方式中使用“a”的减法的目的是什么?

【问题讨论】:

    标签: data-structures trie


    【解决方案1】:

    当您的输入字符串由一些相对较小的固定字母表中的字符组成时,Trie 才有意义。

    在这个具体的实现中,假设这些字符在a..z的范围内,总共26个。

    在许多语言中Char 类型实际上是IntByte,您可以使用它执行算术运算。当你这样做时,字符的代码被用作操作数。

    考虑到上述情况,很明显,将字符从某个已知的基于非零的范围映射到基于零的范围的最简单方法是从特定字符的代码中减去该范围的起始元素。

    对于'a'..'z' 范围:

     when you do ('a' - 'a') you get 0
     'b' - 'a' = 1
     ...
     'z' - 'a' = 25
    

    【讨论】:

      【解决方案2】:

      我在@Aivean的答案旁边加了一个小信息,很完美。

      • 在此实现中,Trie 中的每个节点都包含一个大小为 26 的静态数组,以指向其子节点。
      • 这样做的目的是在恒定时间内找到正确的孩子,从而检查它是否存在。
      • 为了找到正确的孩子(在 26 的数组中的位置),我们使用 current_Char - 'a',因为它在 @Aivean 答案中有很好的解释。

      【讨论】:

        猜你喜欢
        • 2018-09-27
        • 2011-04-30
        • 2011-11-18
        • 2020-03-09
        • 2011-04-17
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 2016-03-16
        相关资源
        最近更新 更多