随笔分类 -  【算法】基于《啊哈!算法》的算法笔记

摘要:并查集算法 并查集算法是一个利用结点关系,进行分类合组的算法 简介 并查集可以通过一个一维数组来实现 我们把每一个点视作一个"独立的,只有一个结点"的树 之后我们可以通过一些条件,逐渐将这些树合并成一棵大树 合并的过程,其实就是找统一的父节点的过程,我们可以自定两条原则: 1.相异的情况下,把右边的 阅读全文
posted @ 2021-11-19 11:28 RetenQ 阅读(59) 评论(0) 推荐(0)
摘要:二叉树与堆 二叉树是一种特殊的、常见的树 简介 二叉树的特点在于每个结点最多只有两个儿子 如果要使用更严格的递归定义,则是: 二叉树要么为空,要么由根结点、左子树、右子树组成 而左子树、右子树分别是一棵二叉树 二叉树是使用范围极广的树,一棵多叉树也可以转换为二叉树 二叉树类型 满二叉树:如果二叉树中 阅读全文
posted @ 2021-11-19 11:24 RetenQ 阅读(89) 评论(0) 推荐(0)
摘要:树的基本介绍 介绍 树其实就是不包含回路的连通无向图 因为这个特点,我们为树赋予了这些特性: 1.一棵树中的任意两个结点,有且仅有唯一的一条路径连通 2.一棵树如果有n个结点,那么它一定恰好有n-1条边 3.在一棵树中,加上一条边,那么就会得到一个回路 树是指任意两个结点间有且仅有一条路径的无向图 阅读全文
posted @ 2021-11-19 11:17 RetenQ 阅读(313) 评论(0) 推荐(0)
摘要:Bellman-Ford优化 我们知道,在最开始的算法中,我们每一次操作后就会进行一次松弛的判断 实际上,这浪费了我们的时间:每次操作后有些顶点的最短路就不会变化了 实际上我们可以这样做:每次仅仅对最短路的估计值发生了变化的顶点的所有出边执行松弛操作 实操 我们可以利用队列来维护这些点 我们每次都选 阅读全文
posted @ 2021-11-19 11:15 RetenQ 阅读(55) 评论(0) 推荐(0)
摘要:Bellman-Ford算法 很强的一个算法,无论是思路、思想、代码实现都很优秀 而且,它可以解决负权边的问题 简介 一句话概括这个算法就是:“对所有的边进行n-1次松弛操作” 一样的,我们用uvw三者表示“从顶点u[i]到顶点v[i]的这条边,权值为w[i]” 随后检查,新的距离会不会比原本的距离 阅读全文
posted @ 2021-11-19 11:06 RetenQ 阅读(66) 评论(0) 推荐(0)
摘要:Dijkstra算法——单源最短路径 Dijkstra算法是用来处理"指定一个点,计算该点到其余各个顶点的最短路径"这件事 简介 和上文有点像,因为当我们讨论一点到各个点的距离的时候,我们就不得不计算各种中转站 我们这里得到了一个新定义,松弛,我们认为它是: 如果两点距离通过中转点缩短了距离,我们就 阅读全文
posted @ 2021-11-19 11:01 RetenQ 阅读(62) 评论(0) 推荐(0)
摘要:Floyd-Warshall算法 只有五行核心的算法 简介 假设我们有四个点。每个点之间都有一定的距离,或者甚至没有路 现在我们想要知道如何获得两点之间的最短路径 使用之前说的深度优先或者宽度优先当然是可以的,不过有没有更好的办法? 于是我们使用了Floyd-Warshall,先进了一些的算法 算法 阅读全文
posted @ 2021-11-19 10:52 RetenQ 阅读(173) 评论(0) 推荐(0)
摘要:图的简介与二维数组 图就是由顶点和连接顶点的边组成的 表示图 我们利用二维数组表示图 二维数组的两个参数行列,均表示顶点,二者相交得到的即是距离 我们用正无穷(一般可以用999999代替)表示二者之间没有边,0是某点到自身的距离 比如e[a][b] = 3 ;就代表a到b的距离是3 图还分为有向图和 阅读全文
posted @ 2021-11-19 10:47 RetenQ 阅读(39) 评论(0) 推荐(0)
摘要:水管连接 题干 我们有一张N*M大小的地图 我们想要把水管从 (1,1)的铺设起点 铺到 (N,M)的铺设终点 其中我们有两种水管,弯管和直管,他们都可以自由地90°旋转 其中弯管可以连接上下左右任意两个相邻位置,直管则连接相对位置 计算连接方式,如果可以连接则输出路径,否则输出impossible 阅读全文
posted @ 2021-11-19 10:32 RetenQ 阅读(70) 评论(0) 推荐(0)
摘要:广度优先算法 Breadth First Search BFS 深度优先算法的兄弟,包含另外一种搜索思维 也叫宽度优先算法 概述 与深度优先算法不同,广度优先算法注重于"对所有情况的分析搜索" 如果是深度优先算法是刨根问底地分析每种情况, 广度优先就是在在层层扩展中找到题解 例 还是之前的问题,我们 阅读全文
posted @ 2021-11-18 20:40 RetenQ 阅读(43) 评论(0) 推荐(0)
摘要:深度优先搜索 Depth First Search DFS 深度优先是比较基础的一种方法,还有一种是它的兄弟广度优先 深度优先顾名思义:先深入搜索到一种情况的"底部"(原谅我用了这么抽象的词),然后再返回搜索其它情况 例题 我们依旧举例说明,比如我们现在想要在A,B,C三个箱子中放入1,2,3三张牌 阅读全文
posted @ 2021-11-18 20:39 RetenQ 阅读(47) 评论(0) 推荐(0)
摘要:枚举 枚举,暴力的一种算法,典型利用"计算机算力大大高于人力"这件事的做法 枚举,顾名思义:有序的尝试每一种可能 在书里,枚举被单独列为一章,不过每一节都是各种花式实战 因此只用了一个MD笔记来记录它 鬼畜奥数题 我们现在有一道奥数题,要求使用1-9九个数字填入下方的等式: [][][]+[][][ 阅读全文
posted @ 2021-11-18 20:37 RetenQ 阅读(65) 评论(0) 推荐(0)
摘要:链表(数组模拟) 链表也可以使用数组来实现,操作和基础知识比指针简单 但是个人觉得就思路和操作的清晰,以及对链表的理解而言,还是用指针好 模拟链表介绍 我们可以利用两个数组,分别记录链表要的两个东西:数据和地址 我们使用一个数组data,来存储每个结点的数据 使用另外一个数组right,来存储序列中 阅读全文
posted @ 2021-11-18 20:33 RetenQ 阅读(129) 评论(0) 推荐(0)
摘要:链表(指针) 在存储一大波数的时候,如果使用数组,有时会感到数组显得不太灵活 我们可以在C语言中使用指针和动态分配函数malloc来实现链表 关于指针,这里就不赘述了,默认已经了解相关知识 指针实现 malloc malloc 函数的作用就是从内存中申请分配指定字节大小的内存空间 malloc(4) 阅读全文
posted @ 2021-11-18 20:31 RetenQ 阅读(231) 评论(0) 推荐(0)
摘要:栈 栈是一种后进先出的数据结构,它就是栈 栈限定了它只能在一端进行插入和删除的操作,这决定了它“后进先出”的性质 栈的实现也比较简单:利用一个一维数组和一个指向栈顶部的变量(称它为top)即可,我们前面所讲的“插入”和“删除”的操作,就是通过这个"top"来实现的 入栈 入栈的操作很简易 top++ 阅读全文
posted @ 2021-11-18 20:24 RetenQ 阅读(42) 评论(0) 推荐(0)
摘要:队列 队列是一种特殊的线性结构,它只允许在队列的首部head进行删除,以及在尾部tail进行插入 这两种操作分别被称为“出队”和“入队”。而当队列中没有元素即head=tail时,称其为“空队列” 我们现在可以将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型 struct queue{ 阅读全文
posted @ 2021-11-18 09:52 RetenQ 阅读(57) 评论(0) 推荐(0)
摘要:#快速排序 快速排序的核心是基准数,基准数理论上是可以随机的一个数,这里我们每次都选择第一个/最左边的数作为基准数 我们可以认为,快速排序的过程,就是不断选择基准数排序的过程。我们大致可以这么描述它的步骤: 【比如我们排序 6 1 2 7 9 3 4 5 10 8 】 1.选择一个数作为基准数,我们 阅读全文
posted @ 2021-11-18 09:46 RetenQ 阅读(105) 评论(0) 推荐(0)
摘要:冒泡排序 核心思想在于“每次比较两个相邻的元素,如果它们顺序错误就把它们交换过来”,那什么是所谓顺序错误呢? 比如,我们想要进行从大到小的排序,则把小的数字往后靠 比如有五个数字12 35 99 18 76 ,我们试图将它们从大到小排序 1.我们首先比较第一12和第二35,显然35大。依据核心思想, 阅读全文
posted @ 2021-11-18 09:45 RetenQ 阅读(54) 评论(0) 推荐(0)
摘要:#桶排序(简版) 这是一种对于n个数据排序的方式 这个算法是假设了有n个桶,编号便是0-*(n-1),共n个桶来装数据 每当出现了一个数,我们就在对应编号的桶中放置一个标志 查看数据时只要看每个桶中有多少数据即可 //比如我们对0-10的数进行排序 int a[11] ; int i,j,t ; f 阅读全文
posted @ 2021-11-18 09:00 RetenQ 阅读(34) 评论(0) 推荐(0)