关于Trie Tree简单实现
最近突然有兴致hiho一下了,实现了下trie tree,感觉而言,还是挺有意思的,个人觉得这货不光可以用来查单词吧,其实也可以用来替代Hash,反正查找,插入复杂度都挺低的,哈哈,啥都不懂,瞎扯....废话不多,正题开始!
题目截下:

Trie Tree用来干啥呢,套用Hiho上的解释,比如存在一个字典,里面存在10000个单词,需要查找以xxx为前缀的单词个数,按照常规思维,10000 个单词,挨个比对,哇,复杂度爆炸!所以此时呀,将这些单词以树的形式存储,每个节点存放一个字符,这样一来,添加一个词组,只需从根节点从上之下添加, 并将经过的节点计数加1,这样便可以统计拥有同一前缀的单词个数了,哎,不得不说,无论查找或者添加,这种用树结构来存储词组的方法还真是方便。说了这么多,开始上代码,对了,这个写代码这次采用的从上之下的方式,不得不说,也是有种不同的感受.....
按照题目要求,可有以下代码:
int main()
{
TrieTree tt;
int a = 0;
cin >> a;
string s = "";
char t[20];
for (int i = 0; i < a; i++)
{
cin >> t;
s = t;
tt.add(t);
}
cin >> a;
for (int i = 0; i < a; i++)
{
cin >> t;
s = t;
cout<<tt.search(t)<<endl;
}
return 0;
}
由题中要求,显然TrieTree需要实现add,search操作
class TrieTree
{
public:
TrieTree();
void add(string s);
int search(string s);
private:
TrieNode root;
}; TrieTree::TrieTree():root(0)
{ } void TrieTree::add(string s)
{
TrieNode *t = &root;
for (int i=0;i<s.length();i++)
{
t=t->add(s[i]);
}
} int TrieTree::search(string s)
{
TrieNode *t = &root;
int num = 0;
for (int i = 0; i < s.length(); i++)
{
t=t->search(s[i]);
if (t == NULL)
return 0;
}
return t->num;
}
继续实现TrieNode:
class TrieNode
{
public: char c;
int num;
list<TrieNode*> tnv;
TrieNode* add(char c);
TrieNode* search(char c);
TrieNode(char c);
};
TrieNode::TrieNode(char c)
{
this->c = c;
num = 0;
}
TrieNode *TrieNode::add(char c)
{
auto t = tnv.begin();
while (t!=tnv.end())
{
if ((*t)->c == c)
{
(*t)->num++;//对经过的节点计数加一
return *t;
}
t++;
}
TrieNode *m = new TrieNode(c);
m->num++;
tnv.push_back(m);
return m;
}
TrieNode *TrieNode::search(char c)
{
auto t = tnv.begin();
while (t != tnv.end())
{
if ((*t)->c == c)
{
return *t;
}
t++;
}
return NULL;
}
上面值得注意的是,根节点无实际意义,再添加词组时,应在增加经过的节点处计数,OK,大概就这样了~
关于Trie Tree简单实现的更多相关文章
- 字典树(Trie Tree)
终于要开始更新我的ACM学习之路了,不过没想到却是因为一次Java大作业,有趣,%yuan老师. 字典树是一种很简单的树形结构,主要用来进行词频统计,在算法竞赛中有时也会碰到. 字典树的基本思路是,通 ...
- 笔试算法题(39):Trie树(Trie Tree or Prefix Tree)
议题:TRIE树 (Trie Tree or Prefix Tree): 分析: 又称字典树或者前缀树,一种用于快速检索的多叉树结构:英文字母的Trie树为26叉树,数字的Trie树为10叉树:All ...
- Phone List POJ 3630 Trie Tree 字典树
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29416 Accepted: 8774 Descr ...
- 字典树(Trie Tree)
在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中. ...
- 可持久化 trie 的简单入门
可持久化 $trie$ ....又是一个表里不一的东西..... 可持久化 $trie$ 的介绍: 和主席树类似的,其实可持久化就是体现在前缀信息的维护上(搞不懂这怎么就叫做可持久化了...) $ ...
- BTree和B+Tree 简单区别
本篇作用于各种树之间的区别,非算法详细介绍,只是给我们这种非科班出身的一种大概的印象,现在网上更多是讲各种树的怎么实现的细节问题,本篇不涉及那么高深,如果详细了解可以查阅他人的资料,很多大神已经说的很 ...
- Trie tree实践
1.Trie树 Trie树即字典树或前缀树, 2.实践 代码实践如下: package cn.edu.buaa.trie; import java.util.HashSet; /** * @autho ...
- hdu3724Encoded Barcodes(Trie tree)
题目请戳这里 题目大意:给n个字符串,给m个询问,每个询问给k个条形码.每个条形码由8个小码组成,每个小码有相应的宽度,已知一个条形码的宽度只有2种,宽的表示1,窄的表示0.并且宽的宽度是窄的宽度的2 ...
- trie tree(字典树)
hihocoder题目(http://hihocoder.com/problemset):#1014 trie树 #include <iostream> using namespace s ...
随机推荐
- struts2讲义----建立一个struts2工程
建立一个Struts2 工程 Ø 1在MyEclipse中新建web工程 Ø 2在struts-2.2.1.1-all\struts-2.2.1.1解压struts2-blank.war( 最基础的示 ...
- Android 下载模块分析(DownloadManager和DownloadProvider)
Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvid ...
- css换行和超出隐藏
一.强制换行1 word-break: break-all; 只对英文起作用,以字母作为换行依据.2 word-wrap: break-word; 只对英文起作用,以单词作为换行依据.3 white- ...
- JForum2.1.9 安装过程
JForum2.1.9 安装过程 JForum2.1.9 安装过程 2013/08/10 0:48 1.第一次接触 2013/08/08 在开源中国看到一个国外开源的Java论坛,然后下载JForum ...
- OpenXml操作Word的一些操作总结.
OpenXml操作Word的一些操作总结. OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩 ...
- var, object, dynamic的区别以及dynamic的使用
var, object, dynamic的区别以及dynamic的使用 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 2013-06- ...
- win7 VS2008 ffmpeg release 版本崩溃 0x00905a4d 处未处理的异常
这个坑, 我始终不相信编码的问题,但还是花了一上午加各种调试代码.一般加个断点,调试几下就知道是什么问题.在最后找不到解决办法的情况下google了一下,短短几分钟解决了这个问题. 程序都是踩着各种坑 ...
- hdu2534-Score
http://acm.hdu.edu.cn/showproblem.php?pid=2534 由题知, 每一个数据都可以由ax +by组成: ax1 + by1 - c x2 a - d y2 == ...
- .net程序员求职简历
.net程序员求职简历 个人概况 姓名 齐志超 学历 专科 毕业学校 河北软件职业技术学院 专业 软件开发与设计 手机 18730269286 年龄 22 性别 男 现居住地 北京 电子邮件 qzc9 ...
- oc之里氏替换原则
1. 里氏替换原则. LSP 子类对象可以替换父类对象的位置,并且程序的功能不受影响. 为什么? 1). 指针是1个父类类型,但是我们确给了指针1个子类对象的地址. 这样做当然是可以的,因为你要1个父 ...