IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 前缀树(Trie)两种方式实现详解--C++数据结构的实现 -> 正文阅读

[C++知识库]前缀树(Trie)两种方式实现详解--C++数据结构的实现

动态前缀树的实现

动态前缀树实现的关键在于利用指针的动态分配,但这也带来了一个问题,内存的释放问题。所以我们采用将每一个申请的内存空间通过vector进行存储,最后方便释放。

Trie_dyn.h

//
// Created by Alone on 2021/8/3.
//

#ifndef MY_TINY_STL_TRIE_DYN_H
#define MY_TINY_STL_TRIE_DYN_H
#include <cstring>
#include <string>
#include <vector>
using namespace std;
struct Trie{
    bool f;
    Trie* children[26];
    Trie():f(false){
        memset(children,0,sizeof(children));
    }
};
class Trie_dyn {
private:
    vector<Trie*>pool;
    Trie* searchPrefix(const string s);
public:
    Trie_dyn():pool(1){
        pool[0] = new Trie;
    }
    ~Trie_dyn();
    void insert(string word);
    bool search(string word);
    bool startWith(string prefix);
};


#endif //MY_TINY_STL_TRIE_DYN_H


Trie_dyn.cpp

//
// Created by Alone on 2021/8/3.
//

#include "Trie_dyn.h"
//每次入新的表需要把它们加入到内存池,方便最后析构函数的清理
void Trie_dyn::insert(string word) {
    Trie* node = pool[0];
    for(auto&&t:word){
        if(!(node->children[t-'a'])){
            node->children[t-'a'] = new Trie;
            pool.emplace_back(node->children[t-'a']);
        }
        node = node->children[t-'a'];
    }
    node->f = true;
}
Trie * Trie_dyn::searchPrefix(const string s) {
    Trie* node = pool[0];
    for(auto&&t:s){
        if(!(node->children[t-'a']))
            return nullptr;
        node = node->children[t-'a'];
    }
    return node;
}
bool Trie_dyn::search(string word) {
    Trie* t = searchPrefix(word);
    return t!= nullptr&&t->f;
}
bool Trie_dyn::startWith(string prefix) {
    return searchPrefix(prefix)== nullptr?false:true;
}
Trie_dyn::~Trie_dyn() {
    for(auto t:pool){
        delete t;
    }
}

静态前缀树的实现

静态前缀树有很多好处,最大的一条就是不需要进行内存释放,坏处在于申请的内存空间有限,没有堆上那么大的内存申请。还有一个好处在于平时很好写。而且效率相对动态的实现方式要高。

需要注意的地方:静态实现方式利用二维数组,其中第一个下标代表一个结点,第二个下标代表这个结点的表。其中下标0默认为根节点。还需要利用 tot 指针对结点进行正确的连接。

Trie_static.h

//
// Created by Alone on 2021/8/3.
//
//静态字典树(前缀树)用二维数组来实现,第一维度表示结点,第二维度表示当前结点的表表指针。

#ifndef MY_TINY_STL_TRIE_STATIC_H
#define MY_TINY_STL_TRIE_STATIC_H
#include <cstring>
#include <string>
#define maxn 10000
using namespace std;
class Trie_static {
private:
    int tot;
    bool isEnd[maxn];
    int son[maxn][26];
    int searchPrifix(string word);
public:
    Trie_static(){
        tot = 0;
        memset(isEnd,0,sizeof(isEnd));
        memset(son,0,sizeof(son));
    }
    void insert(string word);
    bool search(string word);
    bool startWith(string word);
};


#endif //MY_TINY_STL_TRIE_STATIC_H

Trie_static.cpp

//
// Created by Alone on 2021/8/3.
//
#include "Trie_static.h"
void Trie_static::insert(string word) {
    int p = 0;
    for(auto&&t:word){
        int&& ch = t-'a';
        if(!son[p][ch]){
            son[p][ch] = ++tot;
        }
        p = son[p][ch];
    }
    //标记单词结尾的结点
    isEnd[p] = true;
}
int Trie_static::searchPrifix(const string word) {
    int p = 0;
    for(auto && t:word){
        int&& ch = t-'a';
        if(!son[p][ch])
            return 0;
        p = son[p][ch];
    }
    return p;
}
bool Trie_static::search(string word) {
    int&& t = searchPrifix(word);
    return t&&isEnd[t];
}
bool Trie_static::startWith(string word) {
    return searchPrifix(word);
}

前缀树的好处

  • 前缀树,就是通过已有的单词构建出的一颗单词查找树,能较快的查找出是否存在某个前缀。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:00:48  更:2021-08-04 11:02:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 0:46:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码