Trie implementation
在学习 Aho - Corasick Automation Algorithm 之前,先学习一下,Trie 的实现过程:
The name trie comes from its use for retrieval (检索) , 通常读“/ tri /" ;
Trie is a special kind of tree ;
What is trie ?
给你七八百个单词,然后随意给你一个单词,问一下这个单词是不是在这七八百个单词之中,if we stroe these words in liner array , it will be very unefficient (需要很大的内存,同时查找也需要很长时间). The model of trie more efficient ;
reading more on Wikipedia page .
通过下面的图,直观的介绍一下,数据在 Trie 中的存储方式:
A trie for key "A", "to", "tea", "ted", "ten", "i", "in", and "inn".
这样很 easy 避免了几个单词中具有重复部分占用内存空间的情况;
we store only the individual characters of the string key in the nodes
each node can have multiple children , 从 a 到 z (特殊考虑一下,全部为小写,不包含数字字符)同样造成了空间大量的浪费;不过没关系,我们可以找到某种方法,把那些不存在字符的结点给 detele 掉 即可 ;
在 Trie 中可以实现插入、删除、查找等功能,实现的功能不同,结点中的数据成员有所不同;
HDU中有一道题是关于 Trie 的运用 ,大致描述一下题意:
输入N组电话号码,在输入的过程中,如果出现包含的情况,最后结果就输出NO,否则输出YES ;
第一次用 Hash table 做的,果然不出所料,以超时而放弃,然后换为Trie来解答,结果没有delete掉不用的内存空间,结果内存超了,最后用了个递归,把不用的内存全部给delete掉,OK了!
下面给出这道题的代码,其中也有许多细节需要注意的地方:
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std ; struct Node {
bool flag ;
Node *next[11] ;
} ; Node* new_Node() {
Node *root = new Node ;
root->flag = false ;
memset(root->next,NULL,sizeof(root->next));
return root ;
}
bool tag ; void deletee( Node *r ) {
for(int i = 0 ; i < 10 ; i++) {
if(r->next[i] != NULL)
deletee(r->next[i]) ;
delete(r->next[i]) ;
}
} void Construct_trie(Node *point , char *s) {
int len = strlen(s) ;
for(int i = 0 ; i < len ; i++) {
if(point->flag || (point ->next[s[i]-'0'] != NULL && i == len - 1))
tag = false ;
if(point->next[s[i]-'0'] == NULL)
point->next[s[i]-'0'] = new_Node() ;
point = point->next[s[i]-'0'] ;
}
point->flag = true ;
} int main() {
int m ;
scanf("%d", &m) ;
while(m--) {
int n ;
scanf("%d",&n) ;
Node *root = new_Node() ;
tag = true ;
while(n--) {
char s[10005] ;
scanf("%s",&s) ;
Construct_trie(root,s);
}
if(tag)
printf("YES\n") ;
else
printf("NO\n") ;
deletee(root) ;
}
return 0 ;
}
Trie implementation的更多相关文章
- An Implementation of Double-Array Trie
Contents What is Trie? What Does It Take to Implement a Trie? Tripple-Array Trie Double-Array Trie S ...
- 双数组Trie的一种实现
An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...
- Awesome Go
A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...
- Aho - Corasick string matching algorithm
Aho - Corasick string matching algorithm 俗称:多模式匹配算法,它是对 Knuth - Morris - pratt algorithm (单模式匹配算法) 形 ...
- Prefix tree
Prefix tree The trie, or prefix tree, is a data structure for storing strings or other sequences in ...
- Go 语言相关的优秀框架,库及软件列表
If you see a package or project here that is no longer maintained or is not a good fit, please submi ...
- go语言项目汇总
Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...
- Radix tree--reference
source address:http://en.wikipedia.org/wiki/Radix_tree In computer science, a radix tree (also patri ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
随机推荐
- 灵活运用Zend框架
$aAwardMem = $this->dao_raward->getAwardAndMem($where,'award_level asc',false,false,false,'awa ...
- 2014第16周三CSS布局再学习摘录
今天尝试写了下前端页面,费了不少时间,做出的结果仍然惨不忍睹,感觉很简单的几个页面,在现有框架多个样式混杂下就是感觉很不自在随意,晚上回来又看了些div+css方面的基础知识. 1.CSS的class ...
- Linux(ubuntu)使用dd从iso制作win7安装u盘(读卡器一样),以及备份分区
转自我的独立博客:alanslab.cn 先吐个槽,早知道windows越用越慢,没想到太久不用还会坏... 昨天就遇到了这样一件事,电脑的光驱早拆了换硬盘托架了,只好翻出来以前手机的sd卡开刀,网上 ...
- 【Android进阶学习】shape和selector的结合使用
shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...
- nodejs在服务器上运行
nodejs运行之后,关掉链接,网站运行就会断开,需要安装forever,后台执行. 安装方法如下(在windows和Linux下都能运行)://forever的安装: npm install fo ...
- 【Java并发编程】并发编程大合集-值得收藏
http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...
- Log4net 自定义字段到数据库(二)
这种方法比第一种方法麻烦些 Log4Net.config <?xml version="1.0" encoding="utf-8" ?> <c ...
- Eclipse+EGit的配置注意点, 以及解决Github多个本地仓库之间的冲突
问题描述 不同本地仓库(e.g. Repo1, Repo2)之间同时修改一个文件时, 出现文件无法merge的情况. 具体表现为, 冲突(红色双向实心箭头)一直存在, 点pull没反应, 点push报 ...
- hdu 3498 whosyourdaddy 重复覆盖
题目链接 重复覆盖的入门题, 和精确覆盖不一样, 删除的时候只删除一行多列. #include<bits/stdc++.h> using namespace std; #define pb ...
- 快排 quicksort 快速排序
首先看这个 http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html 看完后就没有什么不理解的了... PS 注意 凡是在一 ...