数据结构与算法
文章平均质量分 90
杨得江-君临天下wyj
我不知道宇宙的目的是什么?但我知道人生的目的是到达彼岸 ,我是一个热爱编程的初中生会给大家发各种编程语言的基础知识和拓展知识
展开
-
活动安排问题--贪心算法
由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。但对于活动安排问题,贪心算法却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。原创 2023-10-21 07:49:26 · 894 阅读 · 12 评论 -
JavaScript排序算法详解
主流排序算法概览名词解释:n: 数据规模 k:“桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同排序算法实在是博大精深,还有hin多hin多我没有总结到或者我自己还没弄明白的算法,仅仅是总结这十种排序算法都把我写哭了。。。因此,以后如果我掌握了更多的排序姿势,我一定还会回来的!原创 2023-10-18 06:51:01 · 192 阅读 · 10 评论 -
快速排序原理JAVA和Scala实现-函数式编程的简洁演示
本文章向大家介绍快速排序原理JAVA和Scala实现-函数式编程的简洁演示,主要内容包括C语言快速排序实现、Java 快速排序实现、Scala 快速排序实现、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。原创 2023-10-20 06:41:17 · 496 阅读 · 8 评论 -
有趣的算法(七) ——快速排序改进算法
现有数组:[1, 2,3, 5, 8, 2, 6, 10],如果恰好取到第一个元素作为切分元素,则比较的结果,是所有后面的元素都要进入大的数组,而小数组没有内容。1)随机选其中一个元素,假设为a[i],将所有值比a[i]小的元素,移到a[i]的左边,假设为数组b;对于等于的情况,可以在设定一个数组,专门存放于切分元素值一样的元素,且放于数组的中间位置。首先,针对传过来的数组,需要打散数组,或者随机选取一个元素,作为基准切分元素,假设为i,则值是a[i],假设v=a[i]。当数组元素较少,不采用快速排序。原创 2023-10-27 06:45:22 · 418 阅读 · 21 评论 -
广度优先遍历与最短路径(Java 实例代码源码包下载)
广度优先遍历从某个顶点 v 出发,首先访问这个结点,并将其标记为已访问过,然后顺序访问结点v的所有未被访问的邻接点 {vi,..,vj} ,并将其标记为已访问过,然后将 {vi,...,vj} 中的每一个节点重复节点v的访问方法,直到所有结点都被访问完为止。// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径。// 从栈中依次取出元素, 获得顺序的从s到w的路径。// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径。// 查询从s点到w点的路径, 存放在vec中。原创 2023-08-19 07:52:00 · 663 阅读 · 38 评论 -
寻路算法(Java 实例代码源码包下载)
图的寻路算法也可以通过深度优先遍历 dfs 实现,寻找图 graph 从起始 s 点到其他点的路径,在上一小节的实现类中添加全局变量 from数组记录路径,from[i] 表示查找的路径上i的上一个节点。// 通过from数组逆向查找到从s到w的路径, 存放到栈中。// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径。// 通过from数组逆向查找到从s到w的路径, 存放到栈中。// 构造函数, 寻路算法, 寻找图graph从s点到其他点的路径。// 打印出从s点到w点的路径。原创 2023-08-19 07:52:06 · 483 阅读 · 19 评论 -
深度优先遍历与连通分量(Java 实例代码源码包下载)
下面代码片段中,visited 数组记录 dfs 的过程中节点是否被访问,ccount 记录联通分量个数,id 数组代表每个节点所对应的联通分量标记,两个节点拥有相同的 id 值代表属于同一联通分量。深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。// 构造函数, 求出无权图的联通分量。// 构造函数, 求出无权图的联通分量。// 求图的联通分量。// 返回图的联通分量个数。// 求图的联通分量。原创 2023-08-20 10:37:26 · 209 阅读 · 3 评论 -
相邻节点迭代器(Java 实例代码源码包下载)
/ g初始化为n*n的布尔矩阵, 每一个g[i][j]均为false, 表示没有任和边。// g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边。} // 返回边的个数。// 由于java使用引用机制,返回一个Vector不会带来额外开销,// 由于java使用引用机制,返回一个Vector不会带来额外开销,// 由于java使用引用机制,返回一个Vector不会带来额外开销,// 验证图中是否有从v到w的边。// 返回图中一个顶点的所有邻边。// 返回图中一个顶点的所有邻边。原创 2023-08-20 10:37:37 · 793 阅读 · 19 评论 -
图论基础和表示(Java 实例代码)
图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge)组成。值得注意的是,图的顶点集合不能为空,但边的集合可以为空。图可能是无向的,这意味着图中的边在连接顶点时无需区分方向。否则,称图是有向的。下面左图是一个典型的无向图结构,右图则属于有向图。本章节介绍的图都是无向图。原创 2023-08-21 07:41:29 · 1321 阅读 · 2 评论 -
并查集路径压缩(Java 实例代码)
对于一个集合树来说,它的根节点下面可以依附着许多的节点,因此,我们可以尝试在 find 的过程中,从底向上,如果此时访问的节点不是根节点的话,那么我们可以把这个节点尽量的往上挪一挪,减少数的层数,这个过程就叫做路径压缩。节点 2 向上寻找,也不是根节点,那么把元素 2 指向原来父节点的父节点,操后后树的层数相应减少了一层,同时返回根节点 0。// rank[i]表示以i为根的集合所表示的树的层数。// parent[i]表示第i个元素所指向的父节点。// 根节点的特点: parent[p] == p。原创 2023-08-21 07:41:40 · 333 阅读 · 22 评论 -
并查集 rank 的优化(Java 实例代码)
由此可知,依靠集合的 size 判断指向并不是完全正确的,更准确的是,根据两个集合层数,具体判断根节点的指向,层数少的集合根节点指向层数多的集合根节点,如下图所示,这就是基于 rank 的优化。// rank[i]表示以i为根的集合所表示的树的层数。我们在并查集的属性中,添加 rank 数组,rank[i] 表示以 i 为根的集合所表示的树的层数。// rank[i]表示以i为根的集合所表示的树的层数。// 初始化, 每一个parent[i]指向自己, 表示每一个元素自己自成一个集合。原创 2023-08-22 07:23:27 · 215 阅读 · 2 评论 -
并查集 size 的优化(并查集 size 的优化)
解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。// 初始化, 每一个parent[i]指向自己, 表示每一个元素自己自成一个集合。// 初始化, 每一个parent[i]指向自己, 表示每一个元素自己自成一个集合。// 根据两个元素所在树的元素个数不同判断合并方向。// 将元素个数少的集合合并到元素个数多的集合上。// sz[i]表示以i为根的集合中元素个数。// 合并元素p和元素q所属的集合。原创 2023-08-22 07:23:45 · 392 阅读 · 17 评论 -
并查集快速合并(Java 实例代码)
如下图所示,节点 3 指向节点 2,代表 3 和 2 是连接在一起的,节点2本身是根节点,所以指向自己。合并元素 p 和元素 q 所属的集合,分别查询两个元素的根节点,使其中一个根节点指向另外一个根节点,两个集合就合并了。查找过程, 查找元素 p 所对应的集合编号,不断去查询自己的父亲节点, 直到到达根节点,根节点的特点 parent[p] == p,O(h) 复杂度, h 为树的高度。构建这种指向父节点的树形结构, 使用一个数组构建一棵指向父节点的树,parent[i] 表示 i 元素所指向的父节点。原创 2023-09-15 06:39:44 · 208 阅读 · 8 评论 -
并查集快速查找(Java 实例代码)
所属的集合, 合并过程需要遍历一遍所有元素, 再将两个元素的所属集合编号合并,这个过程是。// 合并过程需要遍历一遍所有元素, 将两个元素的所属集合编号合并。// 初始化, 每一个id[i]指向自己, 没有合并的元素。// 我们的第一版Union-Find本质就是一个数组。// 查找过程, 查找元素p所对应的集合编号。// 查看元素p和元素q是否所属一个集合。// 合并元素p和元素q所属的集合。查询元素所在的集合编号,直接返回。* 第一版union-Find。// O(n) 复杂度。// O(1)复杂度。原创 2023-09-14 06:44:34 · 239 阅读 · 10 评论 -
并查集基础与二分搜索树的特性
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。原创 2023-09-13 06:07:05 · 209 阅读 · 9 评论 -
二分搜索树节点删除(Java 实例代码)
/ 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点。// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法。// 删除掉以node为根的二分搜索树中键值为key的节点, 递归算法。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 对以node为根的二叉搜索树进行前序遍历, 递归算法。// 返回以node为根的二分搜索树的最小键值所在的节点。原创 2023-09-12 06:42:21 · 404 阅读 · 12 评论 -
二分搜索树层序遍历(Java 实例代码)
二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(取出节点)和入队(存入下一层的节点)的操作,以此达到遍历的目的。// 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法。// 在以node为根的二分搜索树中查找key所对应的value, 递归算法。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 返回插入新节点后的二分搜索树的根。原创 2023-09-11 06:10:32 · 238 阅读 · 7 评论 -
二分搜索树深度优先遍历(Java 实例代码)
/ 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法。// 在以node为根的二分搜索树中查找key所对应的value, 递归算法。// 对以node为根的二叉搜索树进行前序遍历, 递归算法。// 对以node为根的二叉搜索树进行后序遍历, 递归算法。// 对以node为根的二叉搜索树进行前序遍历, 递归算法。// 对以node为根的二叉搜索树进行后序遍历, 递归算法。原创 2023-09-10 07:21:06 · 304 阅读 · 8 评论 -
二分搜索树节点的查找(Java 实例代码)
/ 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法。// 在以node为根的二分搜索树中查找key所对应的value, 递归算法。// 查看以node为根的二分搜索树中是否包含键值为key的节点, 使用递归算法。// 在以node为根的二分搜索树中查找key所对应的value, 递归算法。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。原创 2023-09-09 07:56:55 · 278 阅读 · 7 评论 -
二分搜索树节点的插入(Java 实例代码)
/ 向以node为根的二分搜索树中, 插入节点(key, value), 使用递归算法。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现。// 向二分搜索树中插入一个新的(key, value)数据对。// 树种的节点个数。// 返回插入新节点后的二分搜索树的根。// 返回二分搜索树的节点个数。// 返回二分搜索树的节点个数。// 返回二分搜索树是否为空。// 返回二分搜索树是否为空。//核心代码---开始。原创 2023-09-05 06:11:11 · 288 阅读 · 7 评论 -
二分搜索树(Java 实例代码)
二分搜索树(英语:Binary Search Tree),也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。若它的左子树不为空,左子树上所有节点的值都小于它的根节点。若它的右子树不为空,右子树上所有的节点的值都大于它的根节点。它的左、右子树也都是二分搜索树。原创 2023-08-31 07:56:38 · 234 阅读 · 1 评论 -
索引堆及其优化(Java 实例代码)
索引堆是对堆这个数据结构的优化。索引堆使用了一个新的 int 类型的数组,用于存放索引信息。优化了交换元素的消耗。加入的数据位置固定,方便寻找。原创 2023-08-13 07:02:36 · 416 阅读 · 23 评论 -
优化堆排序(Java 实例代码)
对于一个最大堆,首先将开始位置数据和数组末尾数值进行交换,那么数组末尾就是最大元素,然后再对W元素进行 shift down 操作,重新生成最大堆,然后将新生成的最大数和整个数组倒数第二位置进行交换,此时倒数第二位置就是倒数第二大数据,这个过程以此类推。// 取出来的顺序应该是按照从大到小的顺序取出来的。// 从(最后一个元素的索引-1)/2开始。// 注意,此时我们的堆是从0开始索引的。//右孩子节点比左孩子节点大。//交换原节点和孩子节点的值。// 交换堆中索引为i和j的两个元素。原创 2023-08-14 07:34:48 · 261 阅读 · 2 评论 -
基础堆排序(Java 实例代码)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似 完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。原创 2023-08-14 07:34:57 · 275 阅读 · 14 评论 -
堆的 shift down(Java 实例代码)
本小节将介绍如何从一个最大堆中取出一个元素,称为 shift down,只能取出最大优先级的元素,也就是根节点,把原来的 62 取出后,下面介绍如何填补这个最大堆。继续 16 和孩子节点 15 进行比较,16 大,所以现在不需要进行交换,最后我们的 shift down 操作完成,维持了一个最大堆的性质。// data[j] 是 data[2*k]和data[2*k+1]中的最大值。// 取出来的顺序应该是按照从大到小的顺序取出来的。// 从最大堆中取出堆顶元素, 即堆中所存储的最大数据。原创 2023-09-04 06:49:10 · 180 阅读 · 7 评论 -
堆的 shift up(Java 实例代码)
这时比较 52 和 62 的大小,52 已经比父节点小了,不需要再上升了,满足最大堆的定义。假设我们对下面的最大堆新加入一个元素52,放在数组的最后一位,52大于父节点16,此时不满足堆的定义,需要进行调整。首先交换索引为 5 和 11 数组中数值的位置,也就是 52 和 16 交换位置。// 堆中元素取值范围[0, M)// 像最大堆中插入一个新的元素 item。// 返回一个布尔值, 表示堆中是否为空。// 交换堆中索引为i和j的两个元素。//* 最大堆核心辅助函数。// 返回堆中的元素个数。原创 2023-09-01 17:12:34 · 275 阅读 · 8 评论 -
堆的基本存储(Java 实例代码)
堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。原创 2023-09-01 17:12:27 · 246 阅读 · 3 评论 -
三路排序算法(Java 实例代码)
三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中不再需要排序,小于 v 和大于 v 的数据也不会出现某一个特别多的情况),通过此方式三路快速排序算法的性能更优。原创 2023-08-31 07:56:55 · 1538 阅读 · 54 评论 -
双路快速排序(Java 实例代码)
双路快速排序算法是随机化快速排序的改进版本,partition 过程使用两个索引值(i、j)用来遍历数组,将的元素放在索引i所指向位置的左边,而将的元素放在索引j所指向位置的右边,代表标定值。原创 2023-08-30 07:58:43 · 287 阅读 · 21 评论 -
随机化快速排序(Java 实例代码)
快速排序由 C. A. R. Hoare 在 1960 年提出。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。原创 2023-08-29 06:24:16 · 2448 阅读 · 62 评论 -
归并排序(Java 实例代码)
归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2023-08-29 06:23:58 · 533 阅读 · 4 评论 -
希尔排序(JAVA实例代码)
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。原创 2023-08-30 07:58:36 · 229 阅读 · 2 评论 -
插入排序(Java实例代码)
插入排序(InsertionSort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。原创 2023-08-13 07:02:00 · 444 阅读 · 2 评论