当前位置:   article > 正文

字典树及GO实现_实现中文文本搜索的最佳数据结构:trie字典树及其在go语言中的应用

实现中文文本搜索的最佳数据结构:trie字典树及其在go语言中的应用

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

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

前缀树的3个基本性质:

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

具体参考:字典树

  1. type TriNode struct {
  2. Path int//有多少单词公用该节点
  3. IsWord bool//有多少单词以这个节点结尾
  4. Next []*TriNode
  5. }
  6. func NewTriNode()*TriNode{
  7. return &TriNode{
  8. Next:make([]*TriNode,26),
  9. }
  10. }
  11. func (this *TriNode)Insert(word string){
  12. if len(word)==0{
  13. return
  14. }
  15. cur:=this
  16. for i:=range word{
  17. if cur.Next[int(word[i]-'a')]==nil{
  18. //new
  19. cur.Next[int(word[i]-'a')]=NewTriNode()
  20. }
  21. cur=cur.Next[int(word[i]-'a')]
  22. }
  23. if cur.IsWord==false{
  24. cur.IsWord=true
  25. cur.Path++
  26. }
  27. }
  28. //是否包含某单词
  29. func (this *TriNode)Find(word string)bool {
  30. if len(word)==0{
  31. return false
  32. }
  33. cur:=this
  34. for i:=range word{
  35. if cur.Next[int(word[i]-'a')]==nil{
  36. return false
  37. }
  38. }
  39. return cur.IsWord
  40. }
  41. //是否包含preWith前缀的单词
  42. func (this *TriNode)FindPre(preWith string)bool{
  43. if len(preWith)==0{
  44. return false
  45. }
  46. cur:=this
  47. for i:=range preWith{
  48. if cur.Next[int(preWith[i]-'a')]==nil{
  49. return false
  50. }
  51. }
  52. return true
  53. }

leetcode:删除子文件夹

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/994706
推荐阅读
相关标签
  

闽ICP备14008679号