
数据结构与算法
文章平均质量分 79
智慧浩海
源码资源仅供个人研究参考学习,不得将内容资源用于商业或者非法用途,否则,一切后果请用户自负,暂不提供安装服务和技术支持。文档资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。
展开
-
二进制(二分查找)搜索
二进制搜索遵循分而治之的方法,其中,列表被分成两半,并且项目与列表的中间元素进行比较。如果找到匹配,则返回中间元素的位置,否则根据匹配产生的结果搜索到两半中的任何一个。因此,要使用二进制搜索技术来搜索某个列表中的元素,需要确保对列表是一个已排好顺序。//更多请阅读:https://www.yiibai.com/data_structure/binary-search.html。执行上面示例代码,得到以下结果 -执行上面示例代码,得到以下结果 -执行上面示例代码,得到以下结果 -C#语言实现示例代码 -原创 2023-12-23 08:43:03 · 1050 阅读 · 0 评论 -
深度优先搜索(DFS)算法
的初始节点开始,然后越来越深,直到找到目标节点或没有子节点的节点。在DFS中,通向未访问节点的边称为发现边,而通向已访问节点的边称为块边。,打印它并将F的所有邻居推入处于就绪状态的堆栈。因此,堆栈现在变为空,并且遍历了图的所有节点。在DFS中使用的数据结构是堆栈。的所有邻居推送到处于就绪状态的堆栈上。的所有邻居推入堆栈中处于就绪状态。的所有邻居推入处于就绪状态的堆栈。开始打印图的所有节点的顺序。弹出是堆栈的顶部元素,即。弹出堆栈的顶部元素,即。弹出堆栈的顶部元素,即。弹出堆栈的顶部元素,即。原创 2023-12-22 09:07:54 · 639 阅读 · 0 评论 -
广度优先遍历与最短路径
广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。下图所示,右边蓝色表示从 0 开始遍历节点的顺序,下面是记录距离 0 的距离,可知广度优先遍历能求出无权图的最短路径。下面用代码展示如何用广度优先遍历方式完成遍历,并且查询到最短路径。原创 2023-06-28 08:49:24 · 1661 阅读 · 0 评论 -
寻路算法.
图的寻路算法也可以通过深度优先遍历 dfs 实现,寻找图 graph 从起始 s 点到其他点的路径,在上一小节的实现类中添加全局变量 from数组记录路径,from[i] 表示查找的路径上i的上一个节点。首先构造函数初始化寻路算法的初始条件,from = new int[G.V()] 和 from = new int[G.V()],并在循环中设置默认值,visited 数组全部为false,from 数组全部为 -1 值,后面对起始节点进行 dfs 的递归处理。...原创 2023-06-28 08:46:30 · 125 阅读 · 0 评论 -
深度优先遍历与连通分量
深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。下图示例的图从 0 开始遍历顺序如右图所示:无向图 G 的一个极大连通子图称为 G 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。连通分量与连通分量之间没有任何边相连。深度优先遍历可以用来求连通分量。原创 2023-06-28 08:45:41 · 274 阅读 · 0 评论 -
嵌入式介绍与应用资料合集汇总39篇
相比于一般的计算机处理系统而言,嵌入式系统存在较大的差异性, 它不能实现大容量的存储功能,因为没有与之相匹配的大容量介质,大部分采用的存储介质有E-PROM、EEPROM 等, 软件部分以API编程接口作为开发平台的核心。嵌入式技术与应用开发-嵌入式智能车设计与实现。嵌入式系统嵌入式系统硬件平台演示文稿。嵌入式系统应用-CAN总线原理与配置。嵌入式系统应用-IIC总线原理与配置。嵌入式系统应用-SPI总线原理与配置。嵌入式系统应用-RS总线原理与配置。嵌入式系统应用-嵌入式系统概述。原创 2023-06-27 09:10:19 · 200 阅读 · 0 评论 -
相邻节点迭代器
图论中最常见的操作就是遍历邻边,通过一个顶点遍历相关的邻边。邻接矩阵的遍历邻边的时间复杂度为 O(V),邻接表可以直接找到,效率更高。...i < n;i ++ )......// 返回图中一个顶点的所有邻边// 由于java使用引用机制,返回一个Vector不会带来额外开销,...对于这两种图的表达方式我们可以抽象出一个接口,生成这一套算法的框架,而不用去考虑底层是邻接表还是邻接矩阵。原创 2023-06-27 08:54:44 · 118 阅读 · 0 评论 -
图论基础和表示
图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge)组成。值得注意的是,图的顶点集合不能为空,但边的集合可以为空。图可能是无向的,这意味着图中的边在连接顶点时无需区分方向。否则,称图是有向的。下面左图是一个典型的无向图结构,右图则属于有向图。本章节介绍的图都是无向图。原创 2023-06-27 08:51:32 · 212 阅读 · 0 评论 -
并查集路径压缩
并查集里的 find 函数里可以进行路径压缩,是为了更快速的查找一个点的根节点。对于一个集合树来说,它的根节点下面可以依附着许多的节点,因此,我们可以尝试在 find 的过程中,从底向上,如果此时访问的节点不是根节点的话,那么我们可以把这个节点尽量的往上挪一挪,减少数的层数,这个过程就叫做路径压缩。如下图中,find(4) 的过程就可以路径压缩,让数的层数更少。原创 2023-06-27 08:53:00 · 389 阅读 · 0 评论 -
并查集 rank 的优化
上一小节介绍了并查集基于 size 的优化,但是某些场景下,也会存在某些问题,如下图所示,操作 union(4,2)。根据上一小节,size 的优化,元素少的集合根节点指向元素多的根节点。操完后,层数变为4,比之前增多了一层,如下图所示:由此可知,依靠集合的 size 判断指向并不是完全正确的,更准确的是,根据两个集合层数,具体判断根节点的指向,层数少的集合根节点指向层数多的集合根节点,如下图所示,这就是基于 rank 的优化。原创 2023-06-27 08:52:14 · 229 阅读 · 0 评论 -
并查集 size 的优化
按照上一小节的思路,我们把如下图所示的并查集,进行 union(4,9) 操作。合并操作后的结构为:可以发现,这个结构的树的层相对较高,若此时元素数量增多,这样产生的消耗就会相对较大。解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。构造并查集的时候需要多一个参数,数组,表示以为根的集合中元素个数。// 构造函数// 初始化, 每一个parent[i]指向自己, 表示每一个元素自己自成一个集合。原创 2023-06-26 08:51:09 · 85 阅读 · 0 评论 -
并查集快速合并
对于一组数据,并查集主要支持两个动作:union(p,q) - 将 p 和 q 两个元素连接起来。find(p) - 查询 p 元素在哪个集合中。isConnected(p,q) - 查看 p 和 q 两个元素是否相连接在一起。在上一小节中,我们用数组的形式表示并查集,实际操作过程中查找的时间复杂度为,但连接效率并不高。本小节,我们将用另外一种方式实现并查集。把每一个元素,看做是一个节点并且指向自己的父节点,根节点指向自己。原创 2023-06-26 08:48:20 · 240 阅读 · 0 评论 -
并查集快速查找
本小节基于上一小节并查集的结构介绍基础操作,查询和合并和判断是否连接。查询元素所在的集合编号,直接返回数组值,的时间复杂度。......合并元素和元素所属的集合, 合并过程需要遍历一遍所有元素, 再将两个元素的所属集合编号合并,这个过程是复杂度。...return;i < count;i++)...原创 2023-06-26 08:49:40 · 83 阅读 · 0 评论 -
并查集基础
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。原创 2023-06-26 08:46:57 · 175 阅读 · 0 评论 -
并查集快速查找
本小节基于上一小节并查集的结构介绍基础操作,查询和合并和判断是否连接。查询元素所在的集合编号,直接返回数组值,的时间复杂度。......合并元素和元素所属的集合, 合并过程需要遍历一遍所有元素, 再将两个元素的所属集合编号合并,这个过程是复杂度。...return;i < count;i++)...原创 2023-06-25 08:40:35 · 105 阅读 · 0 评论 -
并查集基础
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。原创 2023-06-25 08:37:51 · 68 阅读 · 0 评论 -
二分搜索树的特性
我们使用二分搜索树的目的是通过查找 key 马上得到 value。minimum、maximum、successor(后继)、predecessor(前驱)、floor(地板)、ceil(天花板、rank(排名第几的元素)、select(排名第n的元素是谁)这些都是二分搜索树顺序性的表现。二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜索树相应的算法全部退化成 O(n) 级别。二分搜索树在时间性能上是具有局限性的。原创 2023-06-25 08:39:22 · 89 阅读 · 0 评论 -
二分搜索树节点删除
本小节介绍二分搜索树节点的删除之前,先介绍如何查找最小值和最大值,以及删除最小值和最大值。以最小值为例(最大值同理):查找最小 key 值代码逻辑,往左子节点递归查找下去:...// 返回以node为根的二分搜索树的最小键值所在的节点...删除二分搜索树的最小 key 值,如果该节点没有右子树,那么直接删除,如果存在右子树,如图所示:删除节点 22,存在右孩子,只需要将右子树 33 节点代替节点 22。这个删除最小值用代码表示:...原创 2023-06-25 08:38:43 · 118 阅读 · 0 评论 -
二分搜索树层序遍历
二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(取出节点)和入队(存入下一层的节点)的操作,以此达到遍历的目的。如果根节点为空,无可遍历;如果根节点不为空:先将根节点入队;先取出根节点放入队列取出 29,左右孩子节点入队队首 17 出队,孩子节点 14、23 入队。31 出队,孩子节点 30 和 43 入队最后全部出队核心代码示例:...// 二分搜索树的层序遍历// 我们使用LinkedList来作为我们的队列while(!原创 2023-06-21 08:53:05 · 92 阅读 · 0 评论 -
二分搜索树深度优先遍历
二分搜索树遍历分为两大类,深度优先遍历和层序遍历。前序遍历结果图示:对应代码示例:...// 对以node为根的二叉搜索树进行前序遍历, 递归算法if( node!= null ){...中序遍历结果图示:对应代码示例:...// 对以node为根的二叉搜索树进行中序遍历, 递归算法if( node!= null ){...后序遍历结果图示:对应代码示例:...原创 2023-06-21 08:50:23 · 141 阅读 · 0 评论 -
二分搜索树节点的查找
二分搜索树没有下标, 所以针对二分搜索树的查找操作, 这里定义一个 contain 方法, 判断二分搜索树是否包含某个元素, 返回一个布尔型变量, 这个查找的操作一样是一个递归的过程, 具体代码实现如下:...// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法...以下实例在二分搜索树中寻找 43 元素元素 43 比根节点 42 大,需要在右子节点继续比较。元素 43 比 59 小,需要在左子节点继续比较。原创 2023-06-21 08:51:29 · 234 阅读 · 0 评论 -
二分搜索树节点的插入
首先定义一个二分搜索树,Java 代码表示如下:// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现// 根节点// 树种的节点个数// 构造函数, 默认构造一棵空二分搜索树count = 0;// 返回二分搜索树的节点个数// 返回二分搜索树是否为空Node 表示节点,count 代表节点的数量。原创 2023-06-21 08:50:26 · 91 阅读 · 0 评论 -
二分搜索树节点的插入
首先定义一个二分搜索树,Java 代码表示如下:// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现// 根节点// 树种的节点个数// 构造函数, 默认构造一棵空二分搜索树count = 0;// 返回二分搜索树的节点个数// 返回二分搜索树是否为空Node 表示节点,count 代表节点的数量。原创 2023-06-20 08:57:23 · 81 阅读 · 0 评论 -
二分搜索树
二分搜索树(英语:Binary Search Tree),也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。若它的左子树不为空,左子树上所有节点的值都小于它的根节点。若它的右子树不为空,右子树上所有的节点的值都大于它的根节点。它的左、右子树也都是二分搜索树。原创 2023-06-20 08:58:39 · 110 阅读 · 0 评论 -
索引堆及其优化
索引堆是对堆这个数据结构的优化。索引堆使用了一个新的 int 类型的数组,用于存放索引信息。优化了交换元素的消耗。加入的数据位置固定,方便寻找。原创 2023-06-20 08:57:52 · 82 阅读 · 0 评论 -
优化堆排序
上一节的堆排序,我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节,我们进行优化,使用原地堆排序。对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾就是最大元素,然后再对W元素进行 shift down 操作,重新生成最大堆,然后将新生成的最大数和整个数组倒数第二位置进行交换,此时到处第二位置就是倒数第二大数据,这个过程以此类推。原创 2023-06-20 08:56:21 · 78 阅读 · 0 评论 -
优化堆排序
上一节的堆排序,我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节,我们进行优化,使用原地堆排序。对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾就是最大元素,然后再对W元素进行 shift down 操作,重新生成最大堆,然后将新生成的最大数和整个数组倒数第二位置进行交换,此时到处第二位置就是倒数第二大数据,这个过程以此类推。原创 2023-06-19 10:56:52 · 100 阅读 · 0 评论 -
基础堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似 完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。原创 2023-06-19 10:58:12 · 88 阅读 · 0 评论 -
堆的 shift down
本小节将介绍如何从一个最大堆中取出一个元素,称为 shift down,只能取出最大优先级的元素,也就是根节点,把原来的 62 取出后,下面介绍如何填补这个最大堆。第一步,我们将数组最后一位数组放到根节点,此时不满足最大堆的定义。调整的过程是将这个根节点 16 一步一步向下挪,16 比子节点都小,先比较子节点 52 和 30 哪个大,和大的交换位置。继续比较 16 的子节点 28 和 41,41 大,所以 16 和 41 交换位置。原创 2023-06-19 10:57:29 · 102 阅读 · 0 评论 -
堆的 shift up
本小节介绍如何向一个最大堆中添加元素,称为。假设我们对下面的最大堆新加入一个元素52,放在数组的最后一位,52大于父节点16,此时不满足堆的定义,需要进行调整。首先交换索引为 5 和 11 数组中数值的位置,也就是 52 和 16 交换位置。此时 52 依然比父节点索引为 2 的数值 41 大,我们还需要进一步挪位置。这时比较 52 和 62 的大小,52 已经比父节点小了,不需要再上升了,满足最大堆的定义。我们称这个过程为最大堆的 shift up。原创 2023-06-19 10:54:57 · 147 阅读 · 0 评论 -
堆的基本存储
堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。原创 2023-06-17 08:30:33 · 98 阅读 · 0 评论 -
排序算法衍生问题
如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 这个有序对称为 A 的一个逆序对。我们可以使用本教程的归并思想求逆序对的数量。原创 2023-06-17 08:30:00 · 90 阅读 · 0 评论 -
三路排序算法
三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中不再需要排序,小于 v 和大于 v 的数据也不会出现某一个特别多的情况),通过此方式三路快速排序算法的性能更优。原创 2023-06-17 08:28:32 · 323 阅读 · 0 评论 -
双路快速排序
双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将v的元素放在索引j所指向位置的右边,v代表标定值。原创 2023-06-17 08:29:46 · 443 阅读 · 0 评论 -
随机化快速排序
快速排序由 C. A. R. Hoare 在 1960 年提出。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。原创 2023-06-16 09:09:00 · 251 阅读 · 0 评论 -
归并排序介绍
归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2023-06-16 09:06:28 · 176 阅读 · 0 评论 -
希尔排序介绍
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。原创 2023-06-16 09:07:47 · 129 阅读 · 0 评论 -
插入排序介绍
插入排序(InsertionSort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。原创 2023-06-16 09:07:15 · 329 阅读 · 0 评论 -
数据结构与算法
数据结构(英语:data structure)是计算机中存储、组织数据的方式。数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。原创 2023-06-10 08:55:00 · 203 阅读 · 1 评论