字典树
-
字典树,是一种空间换时间的数据结构,又称Trie树、前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计、排序、和保存大量字符串。
-
经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高
-
gin 框架 基于 httprouter 实现最重要的路由模块,采用类似字典树一样的数据结构来存储路由与handle方法的映射.也是框架高性能的原因
-
算法步骤
- 根节点/ 什么都不表示
- 做一个字典比如a-z 字母表
- 每一个节点包含这26个字母的字典表,每个位置保存下个节点的指针。
算法分析
缺点:
- trie树比较消耗内存:因为他每一层都保存一个字典表,就算这层的节点只有一个也要有一组表
- 使用的是指针类型,内存不连续对存储不友好,性能打折扣 优点:
- 查询效率比较高,对于一些范围较小的或者内存不敏感的应用可以使用
- 特别适用自动补全类应用
-
package main import "fmt" type TriNode struct { value int dictionary [26]*TriNode } type TriTree struct { root *TriNode } /** 初始化字典树 */ func NewTriTree() TriTree { t := TriTree{} t.root = &TriNode{ value: 0, dictionary: [26]*TriNode{}, } return t } /** 字典树添加 字符串 关键字 */ func (t *TriTree) Add(word string) { nowNode := t.root for _, v := range word { start := int('a') end := int(v) if nowNode.dictionary[end-start] != nil { nowNode = nowNode.dictionary[end-start] } else { newNode := &TriNode{} nowNode.dictionary[end-start] = newNode nowNode = newNode continue } } } func (t *TriTree) Search(word string) int { nowNode := t.root for _, v := range word { start := int('a') end := int(v) if nowNode.dictionary[end-start] == nil { return 0 } else { nowNode = nowNode.dictionary[end-start] continue } } return 1 } func main() { t := NewTriTree() t.Add("how") t.Add("are") t.Add("you") fmt.Println(t.Search("are")) fmt.Println(t.Search("your")) /** 1 0 */ }