字典树及GO实现

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

前缀树的3个基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

具体参考:字典树

type TriNode struct {
    Path int//有多少单词公用该节点
    IsWord bool//有多少单词以这个节点结尾
    Next []*TriNode
}

func NewTriNode()*TriNode{
    return &TriNode{
        Next:make([]*TriNode,26),
    }
}

func (this *TriNode)Insert(word string){
    if len(word)==0{
        return
    }
    cur:=this
    for i:=range word{
        if cur.Next[int(word[i]-'a')]==nil{
            //new
            cur.Next[int(word[i]-'a')]=NewTriNode()
        }
        cur=cur.Next[int(word[i]-'a')]
    }
    if cur.IsWord==false{
       cur.IsWord=true
       cur.Path++ 
    }
}
//是否包含某单词
func (this *TriNode)Find(word string)bool {
    if len(word)==0{
        return false
    }
    cur:=this
    for i:=range word{
        if cur.Next[int(word[i]-'a')]==nil{
            return false
        }
    }
    return cur.IsWord
}

//是否包含preWith前缀的单词
func (this *TriNode)FindPre(preWith string)bool{
    if len(preWith)==0{
        return false
    }
    cur:=this
    for i:=range preWith{
        if cur.Next[int(preWith[i]-'a')]==nil{
            return false
        }
    }
    return true
}

leetcode:删除子文件夹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值