一个通用的Trie树,标准C++实现

Posted kaluotee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个通用的Trie树,标准C++实现相关的知识,希望对你有一定的参考价值。

原帖http://blog.csdn.net/harry_lyc/article/details/7423326

1 Trie简介

       Trie树,又称单词查找树键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

        在本文中,对于输入的进行序列化,比如输入“单词查找树”,序列化为“单/词/查/找/树”,这样可以进行任何一种自定义的数据插入和查询。序列化输入可以根据自己的需要进行相应的改动,这样可以把Trie树结构应用到很多其他的语言和领域。

        本Trie树结构的优点在于

       1 不限制子节点的数量; 

       2 自定义的输入序列化,突破了具体语言、应用的限制,成为一个通用的框架;

       3 可以进行最大Tokens序列长度的限制;

       4 根据已定阈值输出重复的字符串;

       5 提供单个字符串频度查找功能;

       6 速度快,在两分钟内完成1998年1月份人民日报(19056行)的重复字符串抽取工作。

2 结构示意图

3  实现代码

Trie.h

[cpp]  view plain copy
  1. /******************************************************************** 
  2. * Copyright (C) 2012 Li Yachao 
  3. * Contact: liyc7711@gmail.com or harry_lyc@foxmail.com 
  4. * 
  5. * Permission to use, copy, modify, and distribute this software for 
  6. * any non-commercial purpose is hereby granted without fee, provided 
  7. * that the above copyright notice appear in all copies and that both 
  8. * that copyright notice.  
  9. * It is provided "as is" without express or implied warranty. 
  10. * 
  11. * Version: 0.1 
  12. * Last update: 2012-4-2 
  13. *********************************************************************/  
  14. /********************************************************************* 
  15.  
  16. *********************************************************************/  
  17. #ifndef TRIE_H  
  18. #define TRIE_H  
  19. #include <iostream>  
  20. #include <fstream>  
  21. #include <string>  
  22. #include <vector>  
  23. #include <stdio.h>  
  24. namespace MyUtility  
  25.   
  26.     /*用于存储原子数据的数据结构*/  
  27.     typedef struct TrieNode  
  28.       
  29.         char* token;/*Trie节点的token值*/  
  30.         bool terminal;/*当前节点是否是终结点*/  
  31.         struct TrieNode* sons;/*子节点*/  
  32.         struct TrieNode* next;/*兄弟节点*/  
  33.     TrieNode;  
  34.     /*输出结果的数据结构*/  
  35.     typedef struct StrFreq  
  36.       
  37.         std::string Str;/*字符串*/  
  38.         int Freq;/*频率*/  
  39.     StrFreq;  
  40.     class Trie  
  41.       
  42.     public:  
  43.         Trie()  
  44.           
  45.             CreateRoot();  
  46.             travel_path.clear();  
  47.             result.clear();  
  48.             threshhold = 3;  
  49.             maxLength = 9 ;  
  50.             fout.open("result.txt");  
  51.           
  52.         ~Trie()  
  53.           
  54.             Destroy();  
  55.           
  56.         /*设置输出重复字符串频率的阈值*/  
  57.         void SetThreshhold(int ts)  
  58.           
  59.             if(ts<=1)  
  60.               
  61.                 return ;  
  62.               
  63.             threshhold = ts;  
  64.           
  65.         /*设置最长的字符串匹配长度的阈值*/  
  66.         void SetMaxLength(int max_leng)  
  67.           
  68.             if(max_leng <= 1)  
  69.               
  70.                 return ;  
  71.               
  72.             maxLength = max_leng;  
  73.           
  74.         /*输出结果*/  
  75.         void Print(std::vector<StrFreq>& result);  
  76.         void Print();  
  77.         bool AddString(const std::string& str);  
  78.         /*取得一个字符串的重复频率*/  
  79.         int StrFrequency(const char* str);  
  80.         /*清空Trie树*/  
  81.         bool Clear();  
  82.     private:  
  83.         std::ofstream fout;  
  84.         TrieNode * Root;/*Trie树根节点*/  
  85.         std::vector<std::string>travel_path;/*遍历是的访问路径*/  
  86.         std::vector<StrFreq>result;/*重复字符串的输出结果*/  
  87.         int sub_sons;/*一个节点的子节点数量*/  
  88.         int threshhold;/*重复字符串输出阈值,默认为2*/  
  89.         int maxLength;/*最长的Tokens序列长度,默认为9*/  
  90.         void Tokenize(const std::string& str,std::vector<std::string>&vec_tokens);  
  91.         TrieNode * InsertNode(TrieNode* node,const char *token,bool end = false);  
  92.         /*查找一个节点是否有子节点值为token的节点,返回子节点的指针*/  
  93.         TrieNode * FindNode(TrieNode* p_node,const char *token);  
  94.         /*初始化一个新的Trie节点*/  
  95.         inline TrieNode* NewNode()  
  96.           
  97.             TrieNode * newNode  = new TrieNode();  
  98.             newNode->sons = NULL;  
  99.             newNode->next = NULL;  
  100.             newNode->token = NULL;  
  101.             newNode->terminal = false;  
  102. 问题 H: Trie树

    二叉搜索树的删除和联结

    二叉搜索树的删除和联结

    二叉树区分左右

    SPOJ11414 COT3 博弈论 + Trie树合并

    字典树Trie学习二:Java实现方式之一