博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
trie树【简化的】1
阅读量:6573 次
发布时间:2019-06-24

本文共 2263 字,大约阅读时间需要 7 分钟。

hot3.png

Trie

又称单词查找树,,是一种,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约,最大限度地减少无谓的字符串比较。

Trie树最典型直观的应用:

热词提示中的应用

 

现在以只包含小写英文字母的英文单词的trie树做下说明:

        

Trie树的结构:

例如只有四个字符串:

abc  d  da  dda

则结构为:

 

 

Trie树的时空复杂度:

 

查找和插入的时间复杂度均为o(n), n为字符个数,假设只有26个小写英文字母, n26,如果为2000个汉字,n2000

 

 

Trie树的空间复杂度:

空间复杂度较高,是一个典型的空间换时间的结构,假设每个词平均长度为5,则空间复杂度为n^5

 

 上代码:此代码只处理包含26个小写英文字符情况:

#ifndef _TRIE_H_#define _TRIE_H_#include 
#include 
using namespace std;const int kMaxBranchSize = 26;struct TrieNode {  bool is_word;  TrieNode* next[kMaxBranchSize];  TrieNode() : is_word(false) {    for (int i = 0; i < kMaxBranchSize; i++) {      next[i] = NULL;    }  }};class Trie {  public:    Trie() {      root_ = new TrieNode();    }    ~Trie() {      DeleteTrie(root_);    }  public:    void DeleteTrie(TrieNode* root) {      for (int i = 0; i < kMaxBranchSize; i++) {        if (root->next[i] != NULL) {          DeleteTrie(root->next[i]);        }      }      if (root != NULL) {        delete root;        root = NULL;      }    }    int Insert(const char* word) {      if (NULL == word) {        return -1;      }      TrieNode* now_node = root_;      if (now_node == NULL) {        return -2;      }      while (*word) {        if (now_node->next[*word-'a'] == NULL) {          TrieNode* tmp = new TrieNode();          now_node->next[*word-'a'] = tmp;        }        now_node = now_node->next[*word-'a'];        word++;      }      now_node->is_word = true;      return 0;    }    int Search(const char* word) {      if (NULL == word) {        return -1;      }      TrieNode* node = root_;      if (node == NULL) {        return -2;      }      while (*word&&node != NULL) {        node = node->next[*word - 'a'];        word++;      }      if (node != NULL && node->is_word) {        return 1;      }      return 0;    }  private:    Trie(const Trie&);    Trie& operator= (const Trie&);  private:    TrieNode* root_;};#endif

有趣有爱有价值:

 

#include "trie.h"int main(int argc, char* argv[]) {  Trie t;  t.Insert("a");           t.Insert("ab");  char * c = "abc";  t.Insert(c);  t.Insert("cba");  if (t.Search("cba")) {    cout<< "hehe" << endl;   }  if (t.Search("cbad")) {    cout<< "haha" << endl;   }}

转载于:https://my.oschina.net/hejiula/blog/167771

你可能感兴趣的文章
Linux清除用户登录记录和命令历史方法
查看>>
第五章 shell学习之文件的排序、合并和分割
查看>>
翻译 Windows Server 2016和System Center 2016 技术预览版4 使创新更容易
查看>>
我的友情链接
查看>>
smokeping 安装与配置
查看>>
nginx访问控制allow、deny(ngx_http_access_module)
查看>>
EIGRP MD5认证实例
查看>>
提示,请选择有效的文件
查看>>
Android 使用Nginx rtmp 模块
查看>>
Postfix
查看>>
调查称谷歌占北美25%互联网流量
查看>>
Linux链接文件、管道、重定向讲解
查看>>
Ubuntu的一些常用快捷键
查看>>
svn 钩子开启
查看>>
关于 动态分流系统 ABTestingGateway 的想法
查看>>
Redis 网络编程
查看>>
解决Exchange用户邮箱别名为乱码的问题
查看>>
MyBatis配置详解
查看>>
SCCM2012系列之六,SCCM2012部署前的WDS准备
查看>>
linux上tomcat安装
查看>>