前缀树&字典树&插入&查询&gin框架路由底层结构字典树

字典树

  • 字典树,是一种空间换时间的数据结构,又称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
    	*/
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哥(xpc)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值