前缀树数据结构及构造算法一览

前缀树数据结构及构造算法一览,第1张

前缀树,也叫字典树,是一种树形结构,是哈希树的变形。典型应用用于统计和排序大量的字符串,当然不仅限于字符串,常用于文本词频的统计。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。

Trie树的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销,以达到提高效率的目的、

前缀树的3个基本性质:

1.结点上不含有字符,字符视为都在传递路径上。

2.从根结点到某一个结点,路径上经过的字符连接起来,为该节点对应的字符串。

3.相同的字符串有且只有一个路径。

TrieNode结点:

class TrieNode
{
public:
    TrieNode()
    {
        pass=0;end=0;children.resize(26);
    }
    int pass;//表示以该字符为前缀的字符串数量
    int end;//以当前字符结尾的字符串数量
    vector children;//子节点
};

前缀树的构建

class Trie {
public:
    TrieNode* root;
    Trie() {
        root=new TrieNode();
    }
    
    void insert(string word) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        node->pass++;//当前结点pass值++;
        for(int i=0;ichildren[index]==nullptr)//如果说该索引下无节点,那么就创建它
                node->children[index]=new TrieNode();
            node=node->children[index];//结点运动到子节点位置
            (node->pass)++;//结点的pass值++
        }
        (node->end)++;//最终的结点的end值++;
    }
    //搜索字符串是否存在
    bool search(string word) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        for(int i=0;ichildren[index]==nullptr)//如果发现某个字符索引下无节点,
//那太好了,直接false
                return false;
            node=node->children[index];//跟下去
        }
        if(node->end!=0)//跳出循环一定是字符串循环完了,就看下当前结点的end值是否为0,
//为0,说明没有字符串以该字符结尾,返回false
            return true;
        else
            return false;
    }
    
    //查找某字符串是否存在或者是否为前缀字符串
    bool startsWith(string prefix) {
        TrieNode* node=root;//获得根节点
        int index=0;//建立字符索引号
        for(int i=0;ichildren[index]==nullptr)
                return false;
            node=node->children[index];
        }
            return true;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/716470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存