【经典数据结构】Trie

  在计算机科学中,trie,又称前缀树字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

以下几个博客的讲解很详细:

1. http://blog.csdn.net/hackbuteer1/article/details/7964147

2. http://blog.csdn.net/v_july_v/article/details/6897097

3. http://blog.csdn.net/luxiaoxun/article/details/7937589

4. 《王道程序员求职宝典》 P276

使用范围:

  1. 词频统计 2.前缀匹配 3.全词匹配

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4
 5 class Trie{
 6 public:
 7     Trie();
 8     ~Trie();
 9     void Insert(const string &s);
10     bool Search(const string &s) const;
11 private:
12     struct TrieNode{
13             int count; //单词出现的次数
14             TrieNode *next[26];
15             bool exist;
16
17             TrieNode(): count(0), exist(false) {
18                 memset(next, NULL, sizeof(next));
19             }
20     };
21
22     TrieNode *root_;
23
24     void MakeEmpty(TrieNode *root);
25 };
26
27 Trie::Trie() {
28     root_ = new TrieNode();
29 }
30
31 Trie::~Trie() {
32     MakeEmpty(root_);
33 }
34
35 void Trie::Insert(const string &s) {
36     int len = s.size();
37     TrieNode *position = root_;
38     for (int i =0; i < len; ++i) { //不存在建立一个节点
39         if (position->next[s[i] - ‘a‘] == NULL) {
40             position->next[s[i] -‘a‘] = new TrieNode();
41         }
42         position = position->next[s[i] - ‘a‘]; //没插入一步,相当于一个新串经过,指针要向下移动
43     }
44
45     position->count++;
46     position->exist = true;
47 }
48
49 bool Trie::Search(const string &s) const {
50     if (root_ == NULL) return false;
51
52     int len = s.size();
53     TrieNode *location = root_;
54     for (int i = 0; i < len; ++i) {
55         if (location->next[s[i] - ‘a‘] == NULL) {
56             return false;
57         }
58         location = location->next[s[i] - ‘a‘];
59     }
60
61     return location->exist;
62 }
63
64 void Trie::MakeEmpty(TrieNode *root) {
65     for (int i = 0; i < 26; ++i) {
66         if (root->next[i] != NULL)
67             MakeEmpty(root->next[i]);
68     }
69
70     delete root;
71     root = NULL;
72 }
时间: 2024-10-13 22:23:06

【经典数据结构】Trie的相关文章

大公司面试经典数据结构与算法题C#解答

几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素). 第二种是不需要开新的链表,而是逐步反转原链表中元素的指向,例如: 原链表是 1->2->3->4->null  被  逐步修改为 ①2->1->null.3->4->null ②3->2->

经典数据结构实现与分析:顺序表,单链表,

本博客在在这里重新总结了一下,当前常用的经典数据结构:这里只针对链表,顺序表,简单树和图进行总结:具体实现请参考:https://github.com/yaowenxu/codes/tree/master/数据结构; 本文章,主要讨论数据结构的性质:以及对这些数据结构的性质:主要是用来知识整理与复习: 顺序表:顺序表是指,将元素顺序地存放在一块连续的内存中:元素间的顺序关系由他们的存储顺序自然表示:c++声明一个数组:int a[10]; 即构建了10个int内存大小(40bytes)的顺序表:

经典数据结构:list

linux内核中有很多经典的数据结构, 比如list, hlist, rbtree等等,这些数据结构都是由c语言编写的,与平台无关,完全可以从内核中拿出来放到自己的代码中. list======= 移植自linux内核, windows平台可用 由于windows没有typeof, 故WIN32下: #define list_for_each_entry(pos, head, member, type) for (pos = list_entry((head)->next, type, memb

【学习总结】数据结构-Trie/前缀树/字典树-及其最常见的操作

Trie/前缀树/字典树 Trie (发音为 "try") 或前缀树是一种树数据结构,用于检索字符串数据集中的键. 一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 应用: 自动补全 END 原文地址:https://www.cnblogs.com/anliux/p/12590368.html

【经典数据结构】B树与B+树

本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据.对其进行排序并允许以O(log n)的时间复杂度运行进行查找.顺序读取.插入和删除的数据结构.B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树.与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作.B-tree算法减少定位记录时

【经典数据结构】并查集

等价关系与等价类 若对于每一对元素(a,b),a,b∈S,a R b或者为true或者为false,则称在集合S上定义关系R.如果a R b为true,那么我们说a与b有关系. 等价关系(equivalence relation)是满足下列三个性质的关系R: (1) 自反性:对于所有a∈S,a R a (2) 对称性:若a R b当且仅当b R a (3) 传递性:若a R b且b R c 则a R c 关系“≤”不是等价关系.虽然它是自反的(即a≤a).可传递的(即由a≤b和b≤c得出a≤c)

【经典数据结构】哈希表

哈希表的基本概念 哈希表,也叫散列表,它是基于快速存取的角度设计的,是一种典型的“空间换时间”的做法.哈希表是普通数组的一种推广,因为数组可以直接寻址,故可在O(1)时间内访问数组的任意元素. 哈希表是根据关键字(Key Value)而直接进行访问的数据结构.也就是说,它将关键字通过某种规则映射到数组中的某个位置,以加快查找的速度.这个映射规则称为哈希函数(散列函数),存放记录的数组称为哈希表.哈希表建立了关键字和存储地址之间的一种直接映射关系. 若多个不同的关键字通过哈希函数计算得到相同的数组

hdu5269 数据结构Trie

Memphis loves xor very musch.Now he gets an array A.The length of A is n.Now he wants to know the sum of all (lowbit(Ai xor Aj)) (i,j∈[1,n]) We define that lowbit(x)=2k,k is the smallest integer satisfied ((x and 2k)>0) Specially,lowbit(0)=0 Because

Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. We say a path the xor-l