高级数据结构1—Trie(字典树)

作者: 爱秋刀鱼的猫 | 来源:发表于2018-03-02 10:24 被阅读33次

这个高级数据结构系列我会写三中在编程里常见的三种数据机构,分别是Trie 树,并查集和线段树。

trie树(字典树)的基础知识

trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存储字符串的数据结构,它与二叉查找树不同,关键字不是直接保存在节点中,而是由节点在树中的位置决定。 一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 trie树的最大优点就是利用字符串的公共前缀来减少存储空间与查询时间,从而最大限度地减少无谓的字符串比较,是非常高效的字符串查找数据结构。

Trie树 例1:实现trie树(medium)(trie树建立)
首先定义基本的数据结构:
class TrieNode
{
bool IsEnd;//是否为一个单词的结尾
TrieNode* childnodes[26];
TrieNode(): IsEnd(false)
{
        for(int i = 0;i < MAX;i++)
        {
            childNode = nullptr;
        }
}
};
TrieNode

Trie树的基本功能实现:

class Trie {
private:
    std::vector<TrieNode*> _node_vec;
    //用来存储new出来的结点,这样在析构的时候可以释放内存;
    TrieNode* new_node()
    {
        TrieNode* node = new TrieNode();
        _node_vec.push_back(node);
        return node;
    }

public:
    TrieNode* root;
public:
    Trie() {
        root = new TrieNode();
    }
    ~Trie()
    {
        for(int i =0;i<_node_vec.size();i++)
        {
            delete _node_vec[i];
        }
    }

    // Inserts a word into the trie.
    void insert(string word) {
    }
    // Returns if the word is in the trie.
    bool search(string word) {  
        }
     // Returns if there is any word in the trie
    // that starts with the given prefix.
    bool startsWith(string prefix) {
    }
};
        //获取trie树的所有单词
 void get_all_word_from_trie(TrieNode*root,string &word,vector<string> &word_list)
 {
 }

插入:

void insert(string word) {
TrieNode * p=root;
int length = word.length();
for(int i =0;i<length;i++)
{
if(!p->child[word[i]-'a'])
{
p->child[word[i]]=new TrieNode();
}
p=p->child[word[i]];
}
p->isEnd=true;
}

查找:

bool search(string word) {
        int lenth = word.length();
         TrieNode *p = root;
        for(int i = 0;i<lenth;i++)
        {
            int index = word[i]-'a';
            if(!p->next[index])
            {
                return false;
            }
            else
            {
                p = p->next[index];
            }
        }
        if(p->IsLeave)  return true;
        else return false;
 }

前缀:

bool startsWith(string prefix) {
        int lenth = prefix.length();
        TrieNode *p = root;
        for(int i = 0;i<lenth;i++)
        {
            int index = prefix[i]-'a';
            if(!p->next[index])
            {
                return false;
            }
            else
            {
                p = p->next[index];
            }
        }
        return true;
    }

查找Tire树中所有的单词:

void get_all_word_from_trie(TrieNode*root,string &word,vector<string> &word_list)
    {//word是保存字符串的栈,
        if(!root)
            return;
        for(int i =0;i<Max;i++)
        {
            if(root->next[i])
            {
                word.push_back('a'+i);
                if(root->next[i]->IsLeave)
                word_list.push_back(word);
              //深度遍历
                get_all_word_from_trie(root->next[i],word,word_list);
                word.erase(word.length()-1,1);//弹出栈顶字符
            }
        }
}

完整代码可以戳➡️我的GitHub:还有Trie树的模版实现方式哦~
希望大家一起进步~

相关文章

  • 高级数据结构1—Trie(字典树)

    这个高级数据结构系列我会写三中在编程里常见的三种数据机构,分别是Trie 树,并查集和线段树。 trie树(字典树...

  • 数据结构

    高级数据结构搭建 1. Trie树 运行结果 a---b------c---------d--...

  • 树结构之Trie 树(前缀树,字典树)

    前言 最进在看分词源码,发现词库的存储是基于Trie树的数据结构,特此了解了下其原理。Trie树又叫前缀树,字典树...

  • Trie字典树(前缀树)

    对字典树的理解: a.Trie字典树又可以称为前缀树,是一种真正为字典设计的数据结构,其中的核心实现就包含了字典M...

  • 13.Trie树的基本实现与特性

    13.Trie树的基本实现与特性 理解字典树之前我们先提出三个问题,后面我们再来回答: 字典树的数据结构 字典树的...

  • 树结构之Trie

    1. 什么是trie树 1.Trie树 (特例结构树)Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈...

  • 【 数据结构 & 算法 】—— 高级数据结构

    思维导图 1/3:trie树(字典树)的基础知识 trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存...

  • [leetcode刷题笔记]Trie字典树

    在刷题中遇到trie字典树数据结构,于是对trie做了学习,并找来相关例题。本文记录LeetCode刷题一些知识点...

  • 1:Trie树(字典树)

    1:Trie树,也可以叫字典树、前缀树 http://www.cnblogs.com/huangxincheng/...

  • 数据结构与算法(十一)Trie字典树

    本文主要包括以下内容: Trie字典树的基本概念 Trie字典树的基本操作插入查找前缀查询删除 基于链表的Trie...

网友评论

    本文标题:高级数据结构1—Trie(字典树)

    本文链接:https://www.haomeiwen.com/subject/fhwnxftx.html