利用trie Data Struture

时间:2015-10-21 00:02:10

标签: data-structures 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;
}

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

2 个答案:

答案 0 :(得分:1)

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

在这个具体实现中,假设这些字符在<IfModule mod_expires.c> .. ExpiresByType application/font-woff "access 1 month" ExpiresByType application/font-woff2 "access 1 month" ExpiresByType application/vnd.ms-fontobject "access 1 month" ExpiresByType application/x-font-ttf "access 1 month" ExpiresByType font/opentype "access 1 month" 的范围内,总共26个。

与许多语言a类型实际上是zChar一样,您可以使用它执行算术运算。执行此操作时,字符的代码将用作操作数。

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

Int范围:

Byte

答案 1 :(得分:0)

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

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