字典树C语言实现
2016-01-30 11:41
363 查看
字典树
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。#include <stdio.h> #include <stdlib.h>
#define MAX 26 typedef struct TrieNode { int nCount; // 该节点前缀 出现的次数 struct TrieNode *next[MAX]; //该节点的后续节点 } TrieNode; TrieNode Memory[1000000]; int allocp = 0; //初始化一个节点。 TrieNode * createTrieNode() { TrieNode * tmp = &Memory[allocp++]; tmp->nCount = 1; for (int i = 0; i < MAX; i++) tmp->next[i] = NULL; return tmp; } void insertTrie(TrieNode * * pRoot, char * str) { TrieNode * tmp = *pRoot; int i = 0, k; while (str[i]) { k = str[i] - 'a'; if (tmp->next[k]) { tmp->next[k]->nCount++; } else { tmp->next[k] = createTrieNode(); } tmp = tmp->next[k]; i++; } } int searchTrie(TrieNode * root, char * str) { if (root == NULL) return 0; TrieNode * tmp = root; int i = 0, k; while (str[i]) { k = str[i] - 'a'; if (tmp->next[k]) { tmp = tmp->next[k]; } else return 0; i++; } return tmp->nCount; } int main(void) { char s[11]; TrieNode *Root = createTrieNode(); while (gets(s) && s[0] != '0') //读入0 结束 { insertTrie(&Root, s); } while (gets(s)) //查询输入的字符串 { printf("%d\n", searchTrie(Root, s)); } return 0; }
相关文章推荐
- 计时函数
- VC++的内联汇编
- C++ inline内联函数使用注意事项
- 详解C/C++中预处理器
- C++容器中勿使用memset,memcpy等
- 2012年第三届蓝桥杯(C/C++)预赛题目及个人答案(欢迎指正)
- C语言中无符号数和有符号数相加问题
- C++视频教学
- C语言链表实例
- C语言共用体存储分析
- 56565656
- C++复习(七)
- C语言基础知识总结
- C语言学习笔记 位运算
- 《c++primer笔记》复合类型--引用
- 8. Checker
- 用C++11的std::async代替线程的创建
- C语言基础(转载自大海笔记)
- VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例
- 编写类String 的构造函数、析构函数和赋值函数