当前位置: 首页 > news >正文

用go语言实现树和哈希表算法

算法复杂度

判断一个算法的效率通常基于其计算复杂度,这主要与算法访问输入数据的次数有关。计算机科学中常用大O表示法来描述算法的复杂度。例如,O(n)的算法只需访问一次输入数据,因此优于O(n²)的算法,后者则优于O(n³)的算法,依此类推。最差的算法是O(n!)的复杂度,当输入数据超过300个元素时,这样的算法几乎无法使用。

在Go语言中,大多数内建类型的查找操作(如通过键值查找map中的元素或访问数组元素)都具有常数时间复杂度,表示为O(1)。这意味着内建类型通常比自定义类型更快,除非你希望对底层行为进行完全控制,否则应优先选择使用内建类型。

不仅如此,不同的数据结构效率各不相同。通常,数组操作比map操作要快,但map的多功能性使它具有独特的优势。因此,开发者在选择数据结构时需权衡这些特性。

Go中的二叉树

二叉树简介

二叉树是一种数据结构,每个节点最多有两个子节点,即一个节点可以与最多两个其他节点相连。二叉树的根节点是树的第一个节点。树的深度(也称为高度)是从根节点到某个节点的最长路径,而某个节点的深度是该节点到根节点的边数。没有子节点的节点称为叶子节点。

当一棵树的最长路径与最短路径之间的差值不超过1时,称其为平衡树。如果不满足这一条件,则为不平衡树。树的平衡操作通常较为复杂且耗时,因此最好在树创建时保持其平衡,特别是在节点数量较多的情况下。

二叉树的实现

在Go中,二叉树的实现可以通过结构体定义节点。下面是实现一个简单二叉树的代码,并带有中文注释。

package mainimport ("fmt""math/rand""time"
)// 定义二叉树节点结构
type Tree struct {Left  *Tree // 左子节点Value int   // 节点的值Right *Tree // 右子节点
}// 遍历二叉树
func traverse(t *Tree) {if t == nil {return}traverse(t.Left) // 递归遍历左子树fmt.Print(t.Value, " ") // 打印当前节点的值traverse(t.Right) // 递归遍历右子树
}// 创建二叉树并填充随机值
func create(n int) *Tree {var t *Treerand.Seed(time.Now().Unix()) // 初始化随机数种子for i := 0; i < 2*n; i++ {temp := rand.Intn(n * 2)t = insert(t, temp) // 插入随机值}return t
}// 插入节点到二叉树中
func insert(t *Tree, v int) *Tree {if t == nil {return &Tree{nil, v, nil} // 创建根节点}if v == t.Value {return t // 如果值已存在,不做操作}if v < t.Value {t.Left = insert(t.Left, v) // 递归插入到左子树return t}t.Right = insert(t.Right, v) // 递归插入到右子树return t
}func main() {tree := create(10)fmt.Println("树的根节点值为:", tree.Value)traverse(tree)fmt.Println()// 插入新值并再次遍历tree = insert(tree, -10)tree = insert(tree, -2)traverse(tree)fmt.Println()fmt.Println("树的根节点值为:", tree.Value)
}

运行结果:

树的根节点值为: 18
0 3 4 5 7 8 9 10 11 14 16 17 18 19
-10 -2 0 3 4 5 7 8 9 10 11 14 16 17 18 19
树的根节点值为: 18

二叉树的优势

二叉树特别适合用于表示层次结构的数据,因此在编译器解析程序代码时,广泛采用二叉树。此外,二叉树是天然有序的,只需插入元素到正确位置,树结构就会保持有序。然而,删除树中的元素相对复杂,因为需要维护树的结构。

当二叉树是平衡的,其查找、插入和删除操作的时间复杂度大约为O(log n),其中n是树中元素的数量。例如,一个包含100万个元素的平衡树,其高度大约为20,这意味着可以在不到20步内访问到树中的任意节点。

二叉树的主要缺点在于其结构取决于插入元素的顺序。如果树的键值较长且复杂,插入和查找操作可能会变慢。此外,如果树不平衡,树的性能将变得不可预测。

哈希表在Go中的应用

哈希表的概念

哈希表是一种存储键值对的数据结构,它通过哈希函数计算出一个索引,从而定位数据。一个好的哈希函数需要能够产生均匀分布的哈希值,以避免哈希冲突。

Go中的哈希表实现

下面展示了如何在Go中实现一个简单的哈希表:

package mainimport ("fmt"
)// 定义哈希表的大小
const SIZE = 15// 定义哈希表的节点结构
type Node struct {Value intNext  *Node
}// 定义哈希表结构
type HashTable struct {Table map[int]*NodeSize  int
}// 哈希函数
func hashFunction(i, size int) int {return i % size
}// 插入数据到哈希表
func insert(hash *HashTable, value int) int {index := hashFunction(value, hash.Size)element := Node{Value: value, Next: hash.Table[index]}hash.Table[index] = &elementreturn index
}// 遍历哈希表
func traverse(hash *HashTable) {for k := range hash.Table {if hash.Table[k] != nil {t := hash.Table[k]for t != nil {fmt.Printf("%d -> ", t.Value)t = t.Next}fmt.Println()}}
}func main() {// 创建哈希表table := make(map[int]*Node, SIZE)hash := &HashTable{Table: table, Size: SIZE}fmt.Println("哈希表的大小为:", hash.Size)// 向哈希表插入数据for i := 0; i < 120; i++ {insert(hash, i)}// 遍历并打印哈希表traverse(hash)
}

运行结果:

哈希表的大小为: 15
105 -> 90 -> 75 -> 60 -> 45 -> 30 -> 15 -> 0 ->
110 -> 95 -> 80 -> 65 -> 50 -> 35 -> 20 -> 5 ->
...

哈希表的优势

哈希表的最大优势在于查找速度快。当哈希表有n个键和k个桶时,查找时间复杂度从O(n)降低到O(n/k),即使哈希表中有大量元素,查找效率也能保持在较低的时间复杂度内。

补充知识点

  1. 二叉树的平衡与自平衡树:虽然普通二叉树的性能取决于插入顺序,但一些自平衡树(如AVL树和红黑树)通过自动调整树的结构,确保即使在最差情况下也能维持较优的性能。

  2. 哈希碰撞处理:在哈希表中,多个键可能会映射到同一个索引,这被称为哈希碰撞。常用的碰撞处理方法有链地址法和开放地址法。在链地址法中,每个桶包含一个链表,用于存储冲突的键值对。

通过本文的讲解,相信大家对数据结构如二叉树和哈希表在Go中的应用有了更深入的理解。掌握这些基础结构,不仅能提升代码效率,还能为复杂项目的实现打下坚实的基础。

相关文章:

用go语言实现树和哈希表算法

算法复杂度 判断一个算法的效率通常基于其计算复杂度&#xff0c;这主要与算法访问输入数据的次数有关。计算机科学中常用大O表示法来描述算法的复杂度。例如&#xff0c;O(n)的算法只需访问一次输入数据&#xff0c;因此优于O(n)的算法&#xff0c;后者则优于O(n)的算法&…...

基于SpringBoot+Vue+MySQL的校园健康驿站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot后端、Vue前端与MySQL数据库的校园健康驿站管理系统。该系统旨在通过数字化手段&#xff0c;全面管理学生的健康信息&#xff0c;包括体温监测、疫苗接种记录、健康状况申报等&#xff0c;为…...

深入理解MATLAB中的事件处理机制

在MATLAB中&#xff0c;事件处理机制是一种强大的工具&#xff0c;它允许对象之间的交互和通信。这种机制基于观察者设计模式&#xff0c;其中一个对象&#xff08;观察者&#xff09;监听另一个对象&#xff08;发布者&#xff09;的状态变化。当发布者的状态发生变化时&#…...

线程--线程同步

这里写目录标题 同步概念线程同步概念数据混乱原因 互斥量原理锁的注意事项1、cpu时间轮片2、建议锁总结 使用锁来管理线程同步问题产生主要函数init、destorylock、unlock代码注意事项&#xff08;锁的粒度&#xff09; try锁死锁出现原因图解 读写锁特性图解函数总览init、de…...

【QT】Qt窗口

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;菜单栏设置&#x1f449;&#x1f3fb;QToolBar练习 &#x1f449;&#x1f3fb;QStausBar&#x1f449;&#x1f3fb;Q…...

场外个股期权怎么给股票加杠杆?

今天期权懂带你了解场外个股期权怎么给股票加杠杆&#xff1f;场外期权交易通过向证券公司支付一定额度的股票期权费&#xff0c;然后买入大额的股票持仓&#xff0c;从而实现的杠杆交易。 买入看涨期权 操作&#xff1a;支付权利金购买看涨期权。 杠杆作用&#xff1a; 期…...

【Docker部署ELK】(7.15)

1、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0 docker pull docker.elastic.co/kibana/kibana:7.15.0 docker pull docker.elastic.co/logstash/logstash:7.15.02、配置文件&#xff08;解压资源到D盘DOCKER目录下&#xff09; 2.1 配置文件…...

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…...

【PyQt6 应用程序】基于QtDesigner做一个用户登录页面

在当今的软件开发领域,用户界面(UI)设计和后端编程是创建现代、互动应用程序的两大重要组成部分。尤其是在开发具有用户登录功能的应用程序时,不仅要注重外观和用户体验的设计,还要确保后端逻辑的安全性和可靠性。 本文将介绍如何使用PyQt6框架结合UI设计,实现一个简单而…...

Ollama—87.4k star 的开源大模型服务框架!!

这一年来&#xff0c;AI 发展的越来越快&#xff0c;大模型使用的门槛也越来越低&#xff0c;每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型&#xff08;LLM&#xff09;服务工具…...

MySQL表的操作与数据类型

目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览&#xff1a; 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作&#xff0c;本节要讲解的是由库管理的结构——…...

mysql把某一个字段的值中的aa,替换成bb

UPDATE my_table SET my_column REPLACE(my_column, aa, bb); 例 假设my_table表在替换前的数据如下&#xff1a; idmy_column1hello aa2world aa aa3no aa here 执行上述UPDATE语句后&#xff0c;my_table表的数据将变为&#xff1a; idmy_column1hello bb2world bb b…...

【系统架构设计师】原型模式详解

原型模式详解 1. 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有的对象来创建新的对象,而不是通过类实例化来创建新对象。通过这种方式,原型模式能够减少创建对象的开销,尤其是当对象的创建过程非常复杂或者耗费资源时。原型模…...

Spring @Async 深度解读:默认线程池执行器的配置与优化

在Spring中&#xff0c;Async注解用于异步执行方法。默认情况下&#xff0c;Async注解的任务是由一个线程池执行的。然而&#xff0c;这个默认的线程池是如何初始化的呢&#xff1f;本文将深入探讨这一过程&#xff0c;帮助你理解Spring异步任务背后的线程池执行器的初始化原理…...

手把手教你用护核纪元地心护核者用服务器开服联机

1、购买后登录服务器面板&#xff08;百度莱卡云面板&#xff09; 登录面板的信息在绿色的登陆面板按键下方&#xff0c;不是你的莱卡云账号 进入控制面板后会出现正在安装的界面&#xff0c;安装大约3分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、…...

Log4j 1.x如何升级到Log4j 2.x

Log4j 1.x升级到Log4j 2.x是一个涉及多个步骤的过程&#xff0c;主要包括删除旧版本、添加新版本依赖、配置新版本的配置文件等。以下是一个详细的升级步骤指南&#xff1a; 一、准备阶段 了解当前项目依赖&#xff1a; 检查项目中所有使用Log4j 1.x的地方&#xff0c;包括ja…...

CloudFlare问题与CDN问题

昨天将腾讯云的解析转移到Cloudflare中了&#xff0c;结果今天发现网站崩了&#xff0c;显示重定向次数过多&#xff0c;昨天估计是因为浏览器缓存&#xff0c;所以没有发现问题 问题一&#xff1a;强制HTTPS 当时看到CloudFlare的强制https时就想到了我的宝塔面板也开着强制h…...

[Linux]:文件(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. C语言文件操作 C语言文件操作接口如下&#xff0c;详情可参照——C语言文…...

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文 Flutter 是一个跨平台的开发框架&#xff0c;它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上&#xff08;基本操作&#xff09;-CSDN博客列举了一些特定平台的case&#xff08;桌面端菜单&#xff0c;鼠…...

第15-02章:理解Class类并获取Class实例

我的后端学习大纲 我的Java学习大纲 1、Java反射机制原理图&#xff1a; 源代码通过Javac编译得到字节码文件&#xff0c;当我执行到new一个对象的时候&#xff0c;字节码文件会通过ClassLoader被加载&#xff0c;然后得到一个Class类对象&#xff0c;存放在堆中&#xff0c;加…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...