iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go语言数据结构之前缀树Trie
  • 513
分享到

go语言数据结构之前缀树Trie

2024-04-02 19:04:59 513人浏览 薄情痞子
摘要

目录介绍流程代码初始化插入查找统计以XXX开头的单词个数删除数据介绍 Trie树:又称为单词查找树,是一种树形结构,可以应用于统计字符串,会在搜索引擎系统中用于对文本的词频统计,下图

介绍

Trie树:又称为单词查找树,是一种树形结构,可以应用于统计字符串,会在搜索引擎系统中用于对文本的词频统计,下图是一个Trie树的结构,同时它也是在插入数时的一个顺序图.

流程

  • 首先应该先创建一个结构体,里面保存的是每一个节点的信息
  • 初始化根节点,根节点应该初始化啥?啥也不用初始化,给个空就好看上图
  • 插入:串转字符数组;遍历数组,如果下一个节点为空,创建,则继续遍历
  • 查找:串转字符数组,遍历如何所有字符都在树里面存在,并则最后一个字符node中的end不为零,就视为存在
  • 删除: 字符串转数组,遍历数组,在树上找到对应的字符,path-1

代码

type Node struct {
	path     int
	end      int
	children [26]*Node
}

在这个结构体里面有一个path,它的作用是啥呢?当有经过此字符的时候这个path就加一

end又是干啥的呢?当一个单词的词尾是这个字符的时候end这个值就加一,就代表着这个字符做为一个单词的结尾

children是保存的啥呢?这个里面当然是保存的子节点啦,不用多说了叭~~~

初始化

func main() {
	list := &Node{path: 0, end: 0}
}

初始化根节点,上面说过根节点里面是不用保存数据的,这个我就把里面的参数初始化成0,当然也可以不用初始化里面的参数,children这里就没有创建出来,因为下面我就要开始插入的操作了

插入


func insertTrie(str string, root *Node) {
	if len(str) == 0 {
		return
	}
	tempNode := root
	for _, value := range str {
		if tempNode.children[value-'a'] == nil {
			tempNode.children[value-'a'] = &Node{path: 0, end: 0}
		}
		tempNode = tempNode.children[value-'a']
		tempNode.path++
	}
	tempNode.end++
}

在插入之前先说一点:在传入的参数中,str我传入前我将其转换成了小写的,当然也可以转换成大写或者是大小写都有的

插入之前先对字符串进行了一个判空的处理,如果为空就return了,在整个过程中,对字符串进行了遍历,像我在流程中那样说的将字符串转成字符数组,是应该这样操作,但是我发现在golang中可以直接对一个字符串进行了遍历,或许将语言换成了Java就需要将其转成字符数组了

for循环里面if判断时为什么数组的下标要用value-'a'这个东西来表示?可以想像一下,一个节点的children里面有26个子元素,比如这里的vlaue是b,那么就相当于是b-a,就是b的ASCII码减去a的ASCII码,这个就得到的是1

索引字符
0a
1b
2c

当当前的字符在数组里面没有对应的数据的时候创建一个就好,如果有的时候只要将当前数组的下标交给临时变量tempNode就好,所经过字符的path加1,将最后一个字符所对应的end加1,将其标记为一个此字符是一个单词的结尾即可.

查找


func searchStr(str string,root *Node) bool {
	if len(str) == 0{
		return false
	}
	tempNode := root
	for _,value := range str{

		if tempNode.children[value - 'a'] == nil{
			return false
		}
		tempNode = tempNode.children[value - 'a']
	}
	if tempNode.end != 0{
		return true
	}
	return false
}

同样,在查找数据的时候也是将需要查找的字符串和前缀树的ROOT传入,字符串的判空处理也是必做的,这个里面的tempNode可以有也可以没有,我写tempNode可以是说是我的一个编码的习惯,同样,在查找单词的时候也是要遍历这个字符串(在插入的时候我就已经解释过了我这里为啥和流程中写的不一样,没有把字符串转成字符数组),在for循环里面第一个if如果第一个字符没有在前缀树中找到,那么就视为所要查找的字符串没有出现在这个前缀树里面,则将当前的字符节点交给临时变量tempNode,当整个循环遍历完成之后,也就说明我要查找的字符串中的每一个字符都在这颗前缀树里面并连续着.这个时候如果最后一个单词的end属性为大于0的一个数,那么这个要查找的字符串就一定在这颗前缀树里面,返回true

findstr

统计以XXX开头的单词个数

这个前缀树很强大,上面的解释也说到过,可以对文本的统计

strArgs:=[]string{"qQYgMU","FFpdCl","nyyJmh","XJCebb","OrCiHb","xvDdzZ","nyCebF","hi","hello","nyyJmn"}

在前缀树里面插入了这个数组里面的字符串,我现在要统计以n开头的单词有几个?如何处理呢?

这里就用到了在结构体中定义的Path属性了,在插入的时候说过当有一个字符经过这个path就会加1,所以我只需要找到所要查找前缀的最后一个单词拿到了它的path属性就可以知道以这个字符串开头的单词有几个


func searchPrefixCount(str string,root *Node) int{
	if len(str) == 0{
		return -1
	}
	tempNode := root
	for _,value := range str{
		if tempNode.children[value - 'a'] == nil {
			return 0
		}
		tempNode = tempNode.children[value - 'a']
		return tempNode.path
	}
	return -1
}

删除数据

删除数据的时候同样也是要遍历字符串,不过在此之前应该先查找一次这颗树里面有没有要删除的字符串,如果没有就直接return就好


func delStr(str string,root *Node) bool {
	if len(str) == 0{
		return false
	}
	if !searchStr(strings.ToLower(str),root) {
		return false
	}
	tempNode := root
	for _,value := range str{
		if tempNode.children[value - 'a'].path > 1 {
			tempNode.children[value - 'a'].path--
			tempNode = tempNode.children[value - 'a']
		}else{
			tempNode.children[value - 'a'] = nil
			return true
		}
	}
	return false
}

path是当有字符经过的时候加一,那么在删除数据的时候只要查找到字符将这个字符串所经过的字符的path减1, 我这里还加了一个else,当path等于1的时候也就是说明当前所要删除的字符串是最后一个经过此字符的字符串,这里直接将其置空,等系统回收就好了

到此这篇关于Go语言数据结构之前缀树Trie的文章就介绍到这了,更多相关go 前缀树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go语言数据结构之前缀树Trie

本文链接: https://www.lsjlt.com/news/148976.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言数据结构之前缀树Trie
    目录介绍流程代码初始化插入查找统计以XXX开头的单词个数删除数据介绍 Trie树:又称为单词查找树,是一种树形结构,可以应用于统计字符串,会在搜索引擎系统中用于对文本的词频统计,下图...
    99+
    2024-04-02
  • PHP数据结构:Trie树的运用,高效查找前缀匹配字符
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Go语言数据结构之二叉树可视化详解
    目录题目源代码做题思路扩展左右并列展示上下并列展示总结回顾题目 以图形展示任意二叉树,如下图,一个中缀表达式表示的二叉树:3.14*r²*h/3 源代码 package ...
    99+
    2024-04-02
  • Go语言数据结构之二叉树必会知识点总结
    目录前言二叉树概念二叉树的性质创建二叉树树的遍历前序遍历(V-L-R)中序遍历(L-V-R)后序遍历(L-R-V)前言 如果你是一个开发人员,或多或少对树型结构都有一定的认识,我个人...
    99+
    2024-04-02
  • C语言数据结构之二叉树详解
    目录1. 树概念及结构1.1树概念1.2树的表示2. 二叉树概念及结构2.1概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.5二叉树的性质3. 二叉树顺序结构...
    99+
    2024-04-02
  • Go 语言前缀树实现敏感词检测
    目录一、前言二、敏感词检测暴力匹配正则匹配三、Go 语言实现敏感词前缀树前缀树结构添加敏感词匹配敏感词过滤特殊字符添加拼音检测四、源代码一、前言 大家都知道游戏文字、文章等一些风控场...
    99+
    2024-04-02
  • Go 数据结构之二叉树详情
    目录Go 语言实现二叉树定义二叉树的结构二叉树遍历创建二叉树插入值测试前言: 树可以有许多不同的形状,并且它们可以在每个节点允许的子节点数量或它们在节点内组织数据值的方式上有所不同。...
    99+
    2024-04-02
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式
    目录1、人如何解析算术表达式①、求值 3+4-5②、求值 3+4*52、计算机如何解析算术表达式3、后缀表达式①、如何将中缀表达式转换为后缀表达式?一、先自定义一个栈二、前缀表达式转...
    99+
    2024-04-02
  • Go语言的数据结构转JSON
    目录结构体转为 JSON 格式接口转为 JSON 格式Marshal() 函数的原型总结在日常工作中,除了需要从 JSON 转化为 Go 的数据结构。但往往相反的情况是:我们需要将数...
    99+
    2024-04-02
  • go语言数据结构有哪些
    go语言有数组、切片、映射、链表、栈、队列、树、堆和图这些数据结构。1、数组,可以存储相同类型的元素;2、切片,可以根据需要自动扩展或缩小;3、映射,可以使用映射来实现字典、哈希表等数据结构;4、链表,每个节点包含数据和指向下一个节点的指针...
    99+
    2023-07-31
  • C语言数据结构之二叉链表创建二叉树
    目录一、思想(先序思想创建)二、创建二叉树(1)传一级参数方法(2)传二级参数方法一、思想(先序思想创建) 第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建...
    99+
    2024-04-02
  • Java数据结构学习之树
    目录一、树1.1 概念1.2 术语1.3 树的实现1.3.1 用数组来实现一棵树?1.3.2 用链表实现一棵树?1.3.3 树的转化1.4 二叉树1.4.1 二叉树的性质1.4.2 ...
    99+
    2024-04-02
  • Go语言数据结构之双链表学习教程
    目录双链表创建节点双链表遍历扩展功能链表长度插入删除反转双链表总结双链表 双链表 (Doubly Linked List),每个节点持有一个指向列表前一个元素的指针,以及指向下一个元...
    99+
    2024-04-02
  • Java数据结构和算法之前缀、中缀和后缀表达式的示例分析
    小编给大家分享一下Java数据结构和算法之前缀、中缀和后缀表达式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、人如何解析算术表达式如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:①、求...
    99+
    2023-06-28
  • C语言数据结构系列之树的概念结构和常见表示方法
    0x00 树的概念 树是一种非线性的数据结构,它是由 n(n >= 0)个有限节点组成的一个具有层次关系的集合。 ❓ 那么为什么叫 "树" 呢...
    99+
    2024-04-02
  • go语言的数据结构是什么
    常见的数据结构有基本数据类型、复合数据类型、其他数据结构。详细介绍:1、基本数据类型包括整数类型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64;浮点数...
    99+
    2023-12-21
    go语言 数据结构
  • go语言的数据结构有哪些
    go语言数据结构有数组、切片、映射、结构体、通道、接口、函数等等。详细介绍:1、数组(Array):一组固定长度的相同类型元素的集合;2、切片(Slice):基于数组的动态长度序列,可以根据需要动态增长或缩减;3、映射(Map):一种键值对...
    99+
    2023-12-14
    go语言 数据结构
  • Go语言支持哪些数据结构?
    Go语言作为一种现代化的编程语言,提供了丰富的数据结构来帮助开发者更有效地管理数据。本文将介绍Go语言支持的一些常用数据结构,包括数组、切片、映射、结构体和指针,并提供具体的代码示例。...
    99+
    2024-03-02
    映射 数组 切片 go语言 键值对
  • Go语言中的红黑树、B Tree、B+Tree等基本数据结构
    Go语言中的红黑树、B树和B+树是基本的数据结构,可用于实现高效的查找、插入和删除操作。1. 红黑树(Red-Black Tree)...
    99+
    2023-10-12
    Go语言
  • Go语言数据结构之选择排序示例详解
    目录选择排序动画演示Go 代码实现总结选择排序 选择排序(selection sort)是一种原地(in-place)排序算法,适用于数据量较少的情况。由于选择操作是基于键...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作