在学习 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的更多相关文章

  1. 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 ...

  2. 双数组Trie的一种实现

    An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...

  3. Awesome Go

    A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...

  4. Aho - Corasick string matching algorithm

    Aho - Corasick string matching algorithm 俗称:多模式匹配算法,它是对 Knuth - Morris - pratt algorithm (单模式匹配算法) 形 ...

  5. Prefix tree

    Prefix tree The trie, or prefix tree, is a data structure for storing strings or other sequences in ...

  6. Go 语言相关的优秀框架,库及软件列表

    If you see a package or project here that is no longer maintained or is not a good fit, please submi ...

  7. go语言项目汇总

    Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...

  8. Radix tree--reference

    source address:http://en.wikipedia.org/wiki/Radix_tree In computer science, a radix tree (also patri ...

  9. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目

    Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...

随机推荐

  1. ulimit 说明

    ulimit官方描述 Provides control over the resources available to the shell and to processes started by it ...

  2. ubuntu13.04安装SenchaArchitect-2.2无法启动的问题

    系统是ubuntukylin-13.04-desktop版本,不知道别的版本有没有这个问题,未测试.SenchaArchitect采用最新版本2.2.2,我安装的是32位的. 具体无法启动的问题如下: ...

  3. 算法精解(C语言描述) 第5章 读书笔记

    第5章 5.1 单链表 /* -------------------------------- list.h -------------------------------- */ #ifndef L ...

  4. SQL 2008升级SQL 2008 R2完全教程或者10.00.4000升级10.50.1600

    今天将由于需要就将我的SQL 2008升级到SQL 2008 R2. 说到为什么要升级是因为,从另一台机器上备份了一个数据库,到我的机器上还原的时候提示“System.Data.SqlClient.S ...

  5. 转 SSH框架搭建详细图文教程

    原址:http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html 什么是SSH? SSH对应 struts spring hibernatestruts ...

  6. K-means算法[聚类算法]

    聚类算法k-Means的实现 <?php /* *Kmeans法(聚类算法的实现) */ /* *求误差平方和J */ //----------------------------------- ...

  7. 星际SC 地图 Big Game Fort 要塞之战 修正了 BIG GAME 地图的平衡性

    星际SC 地图 Big Game Fort 要塞之战 修正了 BIG GAME 地图的平衡性 也适合BIG 1V1 对战 此版本目前不开放1打1造功能

  8. USB創意讀卡機設計特別獎

  9. QML开源游戏

    http://google.github.io/VoltAir/doc/main/html/index.htmlhttp://blog.qt.io/blog/2010/02/26/qt-box2d-i ...

  10. mysql 批量删除分区

    alter table titles drop partition p01; use zabbix; mysql> source drop_par.sql [oracle@oadb mysql] ...