【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:动态连通性
      • 2:UF 实现 1:快速查找 quick-find
      • 2.1:demo 演示 1
      • 2.2:demo 演示 2
      • 2.3:quick-find 代码实现
      • 3:UF 实现 2:快速合并 quick-union
      • 3.1:demo 演示 1
      • 3.2:demo 演示 2
      • 3.3:demo 演示 3
      • 3.4:quick-union 代码实现
      • 4:UF 实现 3:加权 quick-union 算法
      • 4.1:demo 演示
      • 4.2:加权 quick-union 算法代码实现
      • 5:带路经压缩的加权 quick-union 算法
      • 6:所有 UF 实现算法的对比

前言

开始之前先简单扯几句,算法一直是我觉得很难也不太愿意主动去接触的,《算法(第四版)》这本书我大概几年前就知道了,一翻开就跟天书一样(当然现在也没好到哪里去),不过就是得要逼着自己不断学习嘛。

想要强调的是,学习笔记是比较个人以及主观的学习总结,没有任何的盈利目的,只是为了自我学习的提高,所以在文章里面我都会贴出来我所找到以及用到的资料,没有的或者是拓展性的内容请自行搜索。
(我非常需要在这里吐槽一下:偶尔有评论问我要源码……开源项目就不能动动手搜索一下???)

再次声明,学习笔记的受众首先是我本人,并不是为了教会各位成为大神,所以建议各位自己去看相关资料,自行总结,代码多敲多 debug 几遍,资料多看几遍,也许您的收获会比我多得多。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《1.5 案例研究:union-find算法》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

(截图自视频 PPT)在这里插入图片描述

开发一个有用算法的步骤:

  • 建立问题模型。
  • 找到一个解决算法。
  • 这个算法是否够快?存储空间是否足够?
  • 如果上面的问题是否,搞清楚原因。
  • 找到这些问题的根源。
  • 提出新的算法,循环直到满意为止。

本章节主要是对 union-find 算法的实现以及分析。

1:动态连通性

动态连通性的特性说明:

我们假设“相连”是一种等价关系,这也就意味着它具有:

  • 自反性:p和p是相连的;
  • 对称性:如果p和q是相连的,那么q和p也是相连的;
  • 传递性:如果p和q是相连的且q和r是相连的,那么p和r也是相连的。

方法 API:

在这里插入图片描述

edu.princeton.cs.algs4.UF

在这里插入图片描述

edu.princeton.cs.algs4.UF#find

在这里插入图片描述

edu.princeton.cs.algs4.UF#union

在这里插入图片描述

2:UF 实现 1:快速查找 quick-find

基于数组的实现。

连通性检查:两个下标元素的值是否相同。

2.1:demo 演示 1

在这里插入图片描述

2.2:demo 演示 2

在这里插入图片描述

2.3:quick-find 代码实现

edu.princeton.cs.algs4.QuickFindUF#union

在这里插入图片描述

union(p,q):
将下标为p的元素的值(pID)替换为下标为q的元素的值(qID),且集合中与pID相同的值都需要替换为qID。

3:UF 实现 2:快速合并 quick-union

基于树的实现。

连通性检查:两个下标元素的值的 根节点 是否相同。

3.1:demo 演示 1

在这里插入图片描述

3.2:demo 演示 2

在这里插入图片描述

3.3:demo 演示 3

在这里插入图片描述

3.4:quick-union 代码实现

edu.princeton.cs.algs4.QuickUnionUF#union

在这里插入图片描述

union(p,q):
将p的根节点改为q的根节点。

edu.princeton.cs.algs4.QuickUnionUF#find

在这里插入图片描述

4:UF 实现 3:加权 quick-union 算法

基于树的实现,对快速合并的优化。

4.1:demo 演示

在这里插入图片描述

4.2:加权 quick-union 算法代码实现

edu.princeton.cs.algs4.WeightedQuickUnionUF#union

在这里插入图片描述

5:带路经压缩的加权 quick-union 算法

这个压缩路径的作用实际上是把树展平,因而在加权 quick-union 算法的基础上只是增加了一行代码即可实现。

在这里插入图片描述

配套源码中没有这个算法的源码,教授说这个算法的分析超出了这门课的范围……

6:所有 UF 实现算法的对比

在这里插入图片描述

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年全球软件开发大会(QCon广州站2023):核心内容与学习收获(附大会核心PPT下载)

在全球化的科技浪潮中,软件开发行业日新月异,持续推动着社会经济的飞速发展。本次峰会以“引领未来,探索无限可能”为主题,聚焦软件开发领域的最新技术、最佳实践和创新思想。来自世界各地的顶级专家、企业领袖和开发者齐聚一堂&a…

权威认可 | 全息网御多领域入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日, FreeBuf咨询正式发布《CCSIP(China Cyber Security Industry Panorama)2023中国网络安全行业全景册(第六版)》。FreeBuf咨询全景图/全景册系列,以PDR网络安全模型为基础,并参考I…

算法39:统计全 1 子矩形(力扣1504)----单调栈

题目: 给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat [[1,0,1],[1,1,0],[1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩…

ChatGPT初体验——让他写代码,走起

⭐️ 前言 今天注册了Google账户,并通过Gmail体验了一下ChatGPT3.5,让他帮小编写了几个python程序,而且不用任何改动便可以运行,666,感觉很爽。 体验ChatGPT3.5很简单,只要能科学上网和Google账户就行&am…

【Linux C | 进程】Linux 进程间通信的10种方式(1)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【STM32】快速搭建工程

1. 快速生成工程 2.下载DFP包或者根据已有DFP包安装 3.拷贝现有工程的操作系统,应用层代码 debug 就完成最新工程的快速搭建 4.编译发现如下图 5.修改完这个报错,新工程建立基本完成,如果有其他错误,缝缝补补就可 比如 Main.c文…

Linux中并发程序设计(进程的创建和回收、exec函数使用、守护进程创建和使用、GDB的父、子进程代码的调试、线程的创建和参数传递)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注:进程是存在RAM中,程序是存放在ROM(flash)中的进程内容 BSS段&#xff…

使用QT实现播放gstreamer的命令(二)

一、前言 上一篇文章写到了,如何快速使用C来执行gstreamer的命令,如何在QT中显示gstreamer的画面,原文如下: https://blog.csdn.net/Alon1787/article/details/135107958 二、近期的其他发现: 1.gstreamer的画面显示在…

树--二叉树(C语言纯手凹)

目录 1.什么是树?(不深入,仅做了解) 2.树的表示方式 2.1孩子兄弟表示法(左孩子右兄弟) 2.2孩子表示法 2.3双亲表示法 3.什么是二叉树 4.二叉树分类 4.1满二叉树 4.2完全二叉树 4.3二叉搜索树&#x…

优质硬盘检测工具SMART Utility,保障您的Mac数据安全

在日常使用Mac电脑的过程中,我们经常会存储大量的重要数据,如照片、文档、视频等。然而,硬盘故障却是一件令人头疼的事情,可能会导致数据丢失、系统崩溃等严重后果。为了保障您的数据安全,我们推荐一款专业的硬盘检测工…

Springboot自定义线程池实现多线程任务

1. 在启动类添加EnableAsync注解 2.自定义线程池 package com.bt.springboot.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTask…

案例分析技巧-软件工程

一、考试情况 需求分析(※※※※)面向对象设计(※※) 二、结构化需求分析 数据流图 数据流图的平衡原则 数据流图的答题技巧 利用数据平衡原则,比如顶层图的输入输出应与0层图一致补充实体 人物角色:客户、…