alg-in-go-1:动态连通性问题

news2024/9/9 1:39:05

前言:
有本算法书叫:Algorithms 4th Edition.pdf,它是用java实现的,但是算法的内核是一样,不在乎于语言,考虑到java当今的…, 咱们尝试用golang学习算法.

问题:
在这里插入图片描述
在这里插入图片描述

思考🤔:你会如何实现它?。。。。。下面看看the big bang theory男主leonard母校名校普林斯顿大学是如何解决的。

第一版:使用一个数组保存每个节点,如果两个节点的值一样,那么就是联通着的:
在这里插入图片描述
品3秒,再继续:
等会?看上图,如果 0 5 两个节点已经连通了,它们的值都是 5,那么当后续5 6 两个节点联通时,最好是把节点6的值修改成和节点5一样,这样只需要修改一次值,但是这种理想的情况又需要额外的判断处理。

但是如果把节点5的值修改成和节点6一样,那么节点0也得跟着和节点5一样做处理,如果出现特殊的情况,假设0-8 共九个节点都是联通着的,它们的值都是8, 当把节点8和节点9 再去联通时,需要遍历0-8这九个节点,然后把它们的值都修改成节点9的值:即9.

其实修改值操作还好,赋个值罢了,问题在于,需要遍历整个数组去判断已经联通着的那批节点,找出它们,再修改值。所以是线性N操作。。。性能问题突出,如果节点数量大,那。。。

我们先假设节点数量不多,看看代码如何实现:

package main

import "fmt"

var id []int

func main() {

	var n = 10

	quickFindUF(n)
}

/*
*
第一个版本
*/
func quickFindUF(n int) {

	id = make([]int, n)

	for i := 0; i < n; i++ {
		id[i] = i
	}

	union(0, 5)
	union(5, 6)

	union(1, 2)
	union(2, 7)

	union(3, 4)
	union(3, 8)
	union(4, 9)

	// true
	fmt.Println(connected(0, 6))
	// false
	fmt.Println(connected(5, 7))
	// true
	fmt.Println(connected(4, 9))
}

func connected(p, q int) bool {
	return id[p] == id[q]
}

// 合并操作遍历了整个数组,性能不行...
func union(p, q int) {

	pid := id[p]
	qid := id[q]

	for i := 0; i < len(id); i++ {
		if id[i] == pid {
			id[i] = qid
		}
	}
}

知道性能问题,我们往下升级优化:
版本2: 把联通性问题转变成🌲的结构问题:如果两个节点的根节点相同,那就是联通着的,妙,妙,妙不~
在这里插入图片描述
在这里插入图片描述
代码实现:

package main

import "fmt"

var id []int

func main() {

	quickUnionUF(10)
}

func quickUnionUF(n int) {

	id = make([]int, n)
	for i := 0; i < n; i++ {
		id[i] = i
	}

	union(0, 5)
	union(5, 6)

	union(1, 2)
	union(2, 7)

	union(3, 4)
	union(3, 8)
	union(4, 9)

	fmt.Println(connected(0, 6))
	fmt.Println(connected(5, 7))
	fmt.Println(connected(4, 9))
}

func root(i int) int {

	for i != id[i] {
		i = id[i]
	}
	return i
}

func connected(p, q int) bool {
	return root(p) == root(q)
}

func union(p, q int) {
	i := root(p)
	j := root(q)

	if i == j {
		return
	}
	id[i] = j
}

第一版和第二版的性能分析对比:
FYI: 树本来是当查询和新增达到性能的平衡,中庸之道,但是当形成的树变成了链表形式后,性能也成了O(N)了。。。
在这里插入图片描述
所以针对版本2要升级优化:
优化一:连通时,尽量让树扁平化:
通过用空间换时间,引入一个sz[]: 记录每个节点(作为根节点时)有多少个元素以便可判断🌲的大小:连通时让小树挂在大树下;
优化二:root()判断时,再次扁平化处理:把孙节点往上提一提:指向它的祖节点
完整代码如下:

package main

import "fmt"

var id []int
var sz []int

func main() {

	quickUnionUF(10)
}

func quickUnionUF(n int) {

	id = make([]int, n)
	sz = make([]int, n)
	
	for i := 0; i < n; i++ {
		id[i] = i
		sz[i] = 1
	}

	union(0, 5)
	union(5, 6)

	union(1, 2)
	union(2, 7)

	union(3, 4)
	union(3, 8)
	union(4, 9)

	fmt.Println(connected(0, 6))
	fmt.Println(connected(5, 7))
	fmt.Println(connected(4, 9))
}

func root(i int) int {

	for i != id[i] {
		// 让路径的长度减半
		id[i] = id[id[i]]

		i = id[i]
	}
	return i
}

func connected(p, q int) bool {
	return root(p) == root(q)
}

func union(p, q int) {
	i := root(p)
	j := root(q)

	if i == j {
		return
	}
	if sz[i] < sz[j] {
		id[i] = j
		sz[j] += sz[i]
	} else {
		id[j] = i
		sz[i] += sz[j]
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

弹幕背后:B站UP主创作服务解析

引言 在B站&#xff0c;每一条飘过的弹幕都是一个故事的碎片&#xff0c;它们汇聚成一幅幅生动的社交画卷。这里&#xff0c;不仅仅是一个视频分享平台&#xff0c;弹幕背后更是一个充满活力的创作者生态系统。B站以其独特的弹幕文化&#xff0c;为创作者和观众之间搭建起了一座…

【电控笔记-xuan】各种估测器扰动估计性能比较

各种扰动观测器观测结果 蓝色: 扰动值 隆博戈估测器扰动补偿 论文53disturb扰动补偿 2order eso 观测

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-01-层次式体系结构概述

文章目录 1. 常用层次是架构2. 层次式架构设计的注意点2.1 污水池反模式2.2 应用变得庞大 本章教材又赘述了一遍架构的定义和层次架构风格的概述&#xff0c;我之前的笔记都写了 架构的定义回看《第7章-系统架构设计基础知识-01-软件架构&#xff08;Software Architecture&…

AD的问题

连续放置同规则元件&#xff1a;先选择再按Tab编辑放置&#xff1b; 拖动元件&#xff1a;&#xff08;shift 空格 &#xff1a;旋转元件&#xff1b;原理图中按x水平&#xff0c;按y垂直翻转&#xff09;按ctrl键可以丝滑流畅放置 测试距离&#xff1a;RM 距离单位转…

初学Mybatis之动态 SQL

动态 SQL 是指根据不同的条件生成不同的 SQL 语句 动态 SQL 详情请看链接 搭建环境&#xff1a; mysql 建立博客表 CREATE TABLE blog(id VARCHAR(50) NOT NULL COMMENT 博客id,title VARCHAR(100) NOT NULL COMMENT 博客标题,author VARCHAR(30) NOT NULL COMMENT 博客作者…

华为od机试真题:悄悄话(Python)

2024华为OD机试&#xff08;C卷D卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给定一个二叉树&#xff0c;每个节点上站一个人&#xff0c;节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时&#xff0c;根节点所在位置的人有一个悄悄话想要传…

windows家庭版安装Hyper-V

uniapp开发鸿蒙需要开启Hyper-V&#xff0c;但家庭版默认没有&#xff0c;去网上搜索整理了一下。 1.检查是否安装过Hyper-V 直接搜索 Hyper-V&#xff0c;如果出现就代表有&#xff0c;如果没出现&#xff0c;就搜索 启用或关闭windows功能 。 如果有Hyper-V这一项&…

eclipse手动安装Ivy插件

1、下载四个文件 &#xff08;1&#xff09;从这个网址选择一个自己需要的版本的“ivy-”开头的文件夹进去&#xff08;是“ivy”开头&#xff0c;不是“ivyde”&#xff09; https://archive.apache.org/dist/ant/ivyde/updatesite/ 我这里选的是“ivy-2.5.0.final_201910201…

TortoiseSVN迁移到本地git

TortoiseSVN迁移到本地git 文章目录 TortoiseSVN迁移到本地git0 背景1 环境准备2 SVN库迁移到VisualSVN2.1 导出dump2.2 将dump文件灌入VisualSVN2.3 获取SVN仓最新URL 3 迁移到Git库中4 迁移分支到Git库 0 背景 之前在前东家工作都是采用git进行项目管理&#xff0c;高效便捷…

大模型应用中常听说的投毒实验是什么?

大模型应用中常听说的投毒实验是什么&#xff1f; 大模型投毒实验是指在训练或使用大规模人工智能模型&#xff08;如GPT-4等&#xff09;时&#xff0c;通过有意加入恶意数据或修改训练过程&#xff0c;使模型产生不正确或有害输出的行为。随着人工智能技术的快速发展&#x…

【深度学习】声码器(Vocoder),Vocos 论文

Vocos: Closing the gap between time-domain and Fourier-based neural vocoders for high-quality audio synthesis https://arxiv.org/abs/2306.00814 https://github.com/gemelo-ai/vocos?tabreadme-ov-file 文章目录 Vocos&#xff1a;弥合时域和基于傅里叶的神经声码器…

必看!50个ChatGPT顶尖学术论文指令,助你高效学术研究

随着人工智能技术的进步&#xff0c;AI已成为学术创作的重要工具。本文将为您展示如何利用AI来润色您的论文。我们精心整理了50个顶级ChatGPT学术论文指令&#xff0c;强烈建议您加以利用&#xff01; 这些指令不仅实用&#xff0c;还能大幅提升您的写作效率。无论是翻译难懂的…

高效的知识付费SaaS平台构建:探索Spring Cloud结合Spring Boot的最佳实践

知识付费平台&#xff1a;引领在线教育的未来 在数字化教育的浪潮中&#xff0c;知识付费平台以其便捷、高效的学习方式&#xff0c;迅速成为教育领域的新宠。该平台围绕用户需求构建&#xff0c;提供职业技能、生活兴趣、人文社科等多领域的专业知识&#xff0c;并通过视频播…

【时时三省】(C语言基础)for循环

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 语法 fou(表达式1&#xff1b;表达式2&#xff1b;表达式3) 循环语句 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判…

Vue 中使用 InMap 创建动态轨迹地图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 中使用 InMap 创建动态轨迹地图 应用场景介绍 动态轨迹地图广泛应用于物流追踪、车辆管理、人员定位等场景&#xff0c;可直观展示移动对象的历史轨迹和实时位置。本代码示例展示了如何使用 Vue 框架和 I…

vue3 antdv3 检测Modal的尺寸是否改变,全屏的时候获取Modal的width与height,然后我们就可以动态设置表格高度了。

1、先上个图&#xff0c;我们要实现如下的效果&#xff0c;中间的表格部分要自动随Modal的改变而改变。官方&#xff1a;Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、那我们一定要能够检测到Modal的宽高的改变才行&#xff0c;然后…

2024非常全的接口测试面试题及参考答案-软件测试工程师没有碰到算我输!

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#…

vue实现简易的全局加载动画效果

效果展示 思路 封装一个组件&#xff0c;放Img&#xff0c;伪类样式&#xff0c;固定在屏幕fixed 然后App应用这个组件&#xff0c;Z index拉最大&#xff0c;防止用户在加载动画时乱点&#xff0c; v-show绑定loading&#xff0c;该数据可以放vuex还是任一的公共状态管理变…

Vue中使用wangEditor富文本编辑器|图片上传(含后端代码)

一、效果 二、安装依赖 npm install wangeditor --save npm install wangeditor/editor-for-vuenext --save 三、使用 在src下common文件夹下创建wangEditor文件夹&#xff0c;并在其文件夹下创建index.vue文件 <template><div style"border: 1px solid #ccc…

2024杭电多校第四场

目录 1003-最优 K 子段 1005-多层血条 1007-序列更新 1009-昵称检索 1012-寻找宝藏 概率专场&#xff1f; 1003-最优 K 子段 二分答案&#xff0c;判断能否划分出 k 个不相交子段使得每段长度都是质数且权值和至少为 mid 从左往右贪心进行划分&#xff1a;维护一个集合 …