数据结构与算法
文章平均质量分 58
Mr. Wanderer
一只在通信和计算机圈子里游荡,还未踏入社会的小小白。
联系我:[email protected]
展开
-
Python实现Dijkstra最短路径算法
'''Author:Lihao Liu功能:实现最短路径算法参数: sNode:源节点 dNode:目标节点 adjacencyMatrix:网络的邻接矩阵(不连接的地方标0)'''def DijkstraRoad(sNode, dNode, adjacencyMatrix): path = [] # s-d的最短路径 n = len(adjacencyMatrix) # 邻接矩阵维度,即节点个数 fmax = 999 w = [[0 f原创 2021-06-23 21:54:14 · 1423 阅读 · 0 评论 -
Python实现冒泡排序、选择排序和插入排序
文章目录冒泡排序选择排序插入排序冒泡排序def bubSort(arr): length = len(arr) for i in range(length): for j in range(length-1-i): if arr[j] > arr[j+1]: temp = arr[j] arr[j] = arr[j+1] arr[j+1] = te原创 2021-06-10 20:06:07 · 234 阅读 · 2 评论 -
Java数据结构与算法笔记——带权图最短路径(Dijkstra算法)
文章目录算法思路算法实现算法思路指定一个节点,比如我们要计算A到其他节点的最短路径。引入两个集合(S、U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路径的点(以及A到该点的路径,如果没有直接相连,初始为∞)初始化两个集合,S初始化时只有A→A = 0,U集合初始化时为A→B = 50,A→C = ∞,A→D = 80,A→E = ∞。接下来要进行核心两个步骤了。从U集合中找出路径最短的点,加入到S集合,例如A→B = 50。更新U集合路径,原创 2021-02-28 22:26:20 · 891 阅读 · 0 评论 -
Java数据结构与算法笔记——带权图最小生成树
文章目录问题描述prin算法实现思路Java实现封装顶点的类封装边的类盛放边集合的优先级队列实现带权图最小生成树的类测试带权图最小生成树的类问题描述假设要在六个城市之间架设电视网线,5条边可以连接6个点,在这里我们应该选择哪5条边呢?不同的城市之间搭建线路的造价是有差异的。 所以,我们应该选择总造价成本最低的5条线路,符合这个要求的线路选择就是带权最小生成树。prin算法实现思路先随意选择一个顶点作为起始点,一般选择A作为起始点,现在我们设U集合为当前所找到最小生成树里面的顶点,TE集合为所找到原创 2021-02-28 17:42:43 · 591 阅读 · 0 评论 -
Java数据结构与算法笔记——有向图拓扑排序
文章目录有向图拓扑排序实现思路有向图有向图在计算机中有广泛的应用。有向图的顶点之间的联系是描述现实世界的有利工具,如 计算机的任务调度系统,根据多任务之间的先后关联需要给出任务的执行顺序,拓扑排序就是可以得到这一顺序的算法。拓扑排序给定一幅有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素(或者说明无法做到这一点)。注意项:还是以任务调度系统为例,假设一个任务x必须在任务y之前完成,任务y必须在任务z之前完成,任务z又必须在任务x之前完成,这样的问题肯定是无解的。也就原创 2021-02-27 23:44:27 · 323 阅读 · 0 评论 -
Java数据结构与算法笔记——图搜素和图的最小生成树
文章目录图的定义图的分类程序中表示图邻接矩阵邻接表图搜素深度优先搜索(DFS)广度优先搜索(BFS)Java实现图封装顶点的类实现深度搜索的栈实现广度搜索的队列封装图的类测试图的类图的定义在计算机程序设计中,图是最常用的结构之一。一般来说,数据存储是用不到图的。图一般用来辅助解决某些具体的问题用的。图没有固定的结构,但是图有固定的形状,这个形状是由物理或抽象的问题所决定的。比如下面的图,并不是要反映城市在地图上的地理位置,它重点放在图中的节点和边之间的关系,描述哪些节点连着哪些边,这些边又连着另外的哪原创 2021-02-23 10:43:18 · 185 阅读 · 0 评论 -
Java数据结构与算法笔记——堆排序
文章目录堆排序原理Java实现堆排序堆排序原理堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的平均时间复杂度均为O(nlogn)。堆排序的基本思路是:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将根节点与末尾元素进行交换,此时末尾就为最大值。然后将剩余N-1个元素重新构成一个堆,这样根节点就是这n个元素的次大值。将根节点与倒数第二个元素交换。如此反复执行,最后得到一个从小到大的序列。简化的思路:将无序数组构建成一个堆,根据升序原创 2021-02-22 22:52:46 · 113 阅读 · 0 评论 -
Java数据结构与算法笔记——堆(Heap)
文章目录堆结构堆中元素的关键字大小关系堆中的操作遍历和查找移除插入Java实现堆堆结构**堆是一种完全的二叉树:除了树的最后一层节点不需要是满的,其它的每一层从左到右都是 满的。**注意下面两种情况,第二种最后一层从左到右中间有断隔,那么也是不完全二叉树。堆通常用数组来实现:这种用数组实现的二叉树,假设节点的索引值为index,那么:节点的左子节点是 2*index+1;节点的右子节点是 2*index+2;节点的父节点是(index-1)/2。(整除)堆中元素的关键字大小关系堆中原创 2021-02-22 22:30:32 · 242 阅读 · 0 评论 -
Java数据结构与算法笔记——哈希表
文章目录哈希表简介冲突装填因子开放地址法线性探测二次探测再哈希法链地址法Java实现哈希表线性探测再哈希法链地址法哈希表简介哈希表通过把保存的数据项本身映射到数组的某个下标来加快查找速度。数组、链表等数据结构查找某个数据项,通常要遍历整个数据结构,也就是O(N)的时间级。但是对于哈希表来说,查找只是O(1)的时间级。我们使用哈希函数来实现数据项到数组下标的映射:arrayIndex = largeNumber % smallRange哈希函数可以把一个大范围的数字压缩成一个小范围的数字(hash化原创 2021-02-22 18:23:39 · 205 阅读 · 0 评论 -
Java数据结构与算法笔记——234树详解
文章目录2-3-4树简介2-3-4树的结构2-3-4树数据项之间的大小关系2-3-4树的操作搜索2-3-4树插入节点分裂根的分裂Java实现2-3-4树封装数据项的类封装节点的类封装2-3-4树的类测试2-3-4树的类2-3-4树简介2-3-4树的结构2-3-4树是一种多叉树,它的每个节点最多有三个数据项和四个子节点。非叶节点数据项和其子节点数量的关系:有一个数据项的节点总是有两个子节点有两个数据项的节点总是有三个子节点有三个数据项的节点总是有四个子节点简而言之,非叶节点的子节点数总是比原创 2021-02-21 11:15:52 · 809 阅读 · 0 评论 -
Java数据结构与算法笔记——红黑树详解
文章目录二叉搜索树缺点红黑树红黑树简介红黑树规则插入节点红黑树自我修正改变节点颜色右旋左旋红黑树纠正算法对于情况1对于情况2对于情况3红黑树性能分析二叉搜索树缺点二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值。二叉搜索树作为一种数据结构,其查找、插入和删除操作的时间复杂度都为O(logn),底数为2。但是我们说这个时间复杂度是在平衡的二叉搜索树上体现的,也就是如果插入的数据是随机的,则效率很高,但是如果插入的数据是有序的,比如从小到大的顺序原创 2021-02-20 22:52:49 · 202 阅读 · 0 评论 -
Java数据结构与算法笔记——树的基本概念和二叉树
文章目录树的基本概念树的组成树的常用术语二叉树和二叉搜索树二叉树二叉搜索树二叉搜索树的操作二叉搜索树代码实现二叉搜索树的效率树的基本概念树的组成树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。节点:上图的圆圈,都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。边:连接节点的线称为边,边表示节点的关联关系。一般从一个节点到另一个节点的唯一方法就是沿着一条顺着原创 2021-02-19 14:07:53 · 160 阅读 · 0 评论 -
Java数据结构与算法笔记——快速排序
文章目录算法原理实现分割数组的思路Java代码实现快速排序算法提升提升效率后的算法实现处理小划分算法原理先通过第一趟排序,将数组原地划分为两部分,其中一部分的所有数据都小于另一部分的所有数据。原数组被划分为2份。通过递归的处理,再对原数组分割的两部分分别划分为两部分,同样是使得其中一部分的所有数据都小于另一部分的所有数据。这个时候原数组被划分为了4份。步骤1,2被划分后的最小单元子数组来看,它们仍然是无序的,但是,它们所组成的原数组却逐渐向有序的方向前进。这样不断划分到最后,数组被划分为多个由一原创 2021-02-19 10:28:29 · 221 阅读 · 4 评论 -
Java数据结构与算法笔记——希尔排序
文章目录不同排序方式的优缺点希尔排序算法原理排序间隔选取希尔排序图解代码实现不同排序方式的优缺点三种简单的排序算法冒泡、选择、插入排序算法,它们的时间复杂度大,都是O(N^2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间有可能会是是我们所不能接受的。在学习解递归的时候,介绍了归并排序,归并排序需要O(NlogN),这比简单排序要快了很多,但是归并排序有个缺点,它需要的空间是原始数组空间的两倍,当我们需要排序的数据占据了整个内存的一半以上的空间,那么是不能使用归并排序的。原创 2021-02-18 22:44:24 · 143 阅读 · 0 评论 -
Java数据结构与算法笔记——递归解决背包问题
背包问题描述背包问题也是计算机中的经典问题。在最简单的形式中,需要将不同重量的数据项放到背包中,以使得背包最后达到指定的总重量。比如:假设想要让背包精确地承重20磅,并且有 5 个可以放入的数据项,它们的重量分别是 11 磅,8 磅,7 磅,6 磅,5 磅。这个问题可能对于人类来说很简单,我们大概就可以计算出 8 磅+ 7 磅 + 5 磅 = 20 磅。但是如果让计算机来解决这个问题,就需要给计算机设定详细的指令了。递归分析1、递归的边界:选择的数据项的总和符合目标重量——匹配试验了所有的组合没原创 2021-02-18 21:39:58 · 532 阅读 · 0 评论 -
Java数据结构与算法笔记——递归解决数学问题的两个其他案例
文章目录递归求数的乘方递归解决组合问题递归求数的乘方package recursion;public class RecursionTest8 { public static void main(String[] args) { System.out.println(pow(2,5)); } //用递归的算法实现求乘方,y不能是负数 public static int pow(int x, int y){ if(y == 0){//原创 2021-02-18 21:25:34 · 130 阅读 · 0 评论 -
Java数据结构与算法笔记——利用栈来消除递归
消除递归递归对于分析问题比较有优势,但是基于递归的实现效率就不高了,而且因为函数栈大小的限制,递归的层次也有限制。所以消除递归就显得很重要了,这样我们可以在分析阶段采用递归思想,而实现阶段把递归转变成非递归算法。比如:求1+2+…+n的值://利用递归,求1+2+3+....+n的值 public static int addn(int n){ if(n==1){ return n; }else { return原创 2021-02-18 20:59:35 · 742 阅读 · 0 评论 -
Java数据结构与算法笔记——递归实现归并排序
文章目录合并两个有序数组实现归并排序合并两个有序数组归并算法的中心是归并两个已经有序的数组。归并两个有序数组A和B,就生成了第三个有序数组C,数组C包含数组A和B的所有数据项。package recursion;import java.lang.reflect.Array;import java.util.Arrays;public class RecursionTest5 { public static void main(String[] args) { in原创 2021-02-12 17:50:14 · 104 阅读 · 0 评论 -
Java数据结构与算法笔记——递归解决汉诺塔问题
文章目录问题描述递归思路代码实现问题描述递归思路无论多少个盘子,我们都将其看做两个盘子。假设有N个盘子在塔座A上,我们将其看做两个盘子,其中第1 ~ N-1个盘子看做一个盘子,最下面的第N个盘子看成一个盘子。先将A塔座的第1 ~ N-1个盘子整体放到中介塔B上,然后将第N个盘子放到目标塔座C上。然后A塔座为空,看成是中介塔座,B塔座这时候有N-1个盘子。将B塔座上的第1 ~ N-2个盘子砍成一个盘子,放到中介塔座A上,然后将B塔座的第N-1号盘子放到目标塔座C上。这时候A塔座上有N-2个盘子原创 2021-02-12 17:06:47 · 140 阅读 · 0 评论 -
Java数据结构与算法笔记——递归实现二分查找
本文分别使用循环的方法和递归的方法实现了有序数组中的二分查找。package recursion;public class RecursionTest3 { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,8,9,11,52}; System.out.println(binarySearchfor(array,11)); System.out.println(原创 2021-02-12 16:41:38 · 119 阅读 · 1 评论 -
Java数据结构与算法笔记——递归简介
文章目录递归简介递归案例递归简介程序调用自身的编程技巧称为递归。递归的思路是把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略只需少量的程序就可以描述出解题过程所需的多次重复计算,极大地减少了程序的代码量。递归必须要有三个要素:边界条件:当边界条件不满足时,递归前进;边界条件满足时,递归返回。递归前进段:实现递归前进递归返回段:实现递归返回使用递归,主要是用它的思路来解决问题,而不是因为它的效率。For循环的效率其实优于递归。递归案例例如:求一个数的阶乘:n!原创 2021-02-12 16:12:35 · 130 阅读 · 1 评论 -
Java数据结构与算法笔记——实现带迭代器的链表
文章目录迭代器具有迭代器的单链表定义接口扩展接口实现接口测试接口迭代器Iterator:迭代器,它是Java集合的顶层接口(不包括map系列的集合)。主要方法:Object next(): 返回迭代器刚越过的元素的引用,返回值是Object,需要强制转化为自己需要的类型boolean hasNext(): 判断容器内是否还有可供访问的元素void remove(): 删除迭代器刚越过的元素所以除了map系列的集合,我们都能通过迭代器对集合中的元素进行遍历。具有迭代器的单链表让链表本身实原创 2021-02-06 23:00:39 · 200 阅读 · 0 评论 -
Java数据结构与算法笔记——抽象数据类型(ADT)
数据类型int、double等是java中的基本数据类型,一个数据类型会涉及到两件事:拥有特定特征的数据项在数据上有允许的操作比如java中的int数据类型表示整数,取值范围为-2^31 ~ 2^31-1,可以使用各种操作符+ - * /等对其操作。数据类型允许的操作是它本身不可分离的部分,也就是什么样的操作可以应用在该类型上。抽象数据类型抽象数据类型(ADT)是指一个数学模型及定义在该模型上的一组操作。它仅取决于其逻辑特征,与计算机内部如何表示和实现无关。整数类型其实就是一种抽象数据类型。更原创 2021-02-05 11:50:52 · 827 阅读 · 0 评论 -
Java数据结构与算法笔记——有序链表和双向链表
文章目录有序列表有序列表简介java实现有序链表实现无序数组排序双向链表双向链表简介java实现双向链表有序列表有序列表简介在有序链表中,数据是按照关键值有序排列的。一般在大多数需要使用有序数组的场合也可以使用有序链表。与有序数组相比,有序链表的优点:插入的速度快(因为元素不需要移动);链表可以有效的使用内存,而数组只能局限于一个固定的大小中。插入:先判断大小,然后在正确的位置插入删除:删除头结点查找:需要遍历java实现package link;public class OrderL原创 2021-02-05 11:16:34 · 457 阅读 · 0 评论 -
Java数据结构与算法笔记——单向链表和双端链表
文章目录链表单向链表单向链表简介java实现单向链表双端链表双端链表简介java实现双端链表基于双端链表实现队列链表链表是一种常见的基础数据结构,是一种线性表,但是链表不会按线性的顺序存储数据,而是在每个节点里存到下一个节点的指针。优点:使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分地利用计算机内存空间,实现灵活的内存动态管理。缺点:链表失去了数组随机读取的优点(没有下标),同时链表由于增加了节点的指针域,空间开销比较大。单向链表单向链表简介单向链表是链表中结构最简单原创 2021-02-04 21:38:59 · 132 阅读 · 1 评论 -
Java数据结构与算法笔记——解析表达式
文章目录三种解析表达式使用两个栈实现将中缀表达式转化为后缀表达式三种解析表达式前缀表达式:操作符在操作数前面,是一种没有括号的算术表达式。中缀表达式:操作符在操作数之间。后缀表达式:操作符在操作数后面,是一种没有括号的算术表达式。以3+4-5为例:前缀表达式:+ 3 4 - 5中缀表达式:3 + 4 - 5后缀表达式:3 4 + 5 -以(3+4)*5为例:前缀表达式:+ 3 4 * 5中缀表达式:(3 + 4) * 5后缀表达式:3 4 + 5 *以后缀表达式为例:后缀表达式,原创 2021-02-03 22:40:34 · 901 阅读 · 0 评论 -
Java数据结构与算法笔记——优先级队列
文章目录优先级队列介绍实现一个简单的优先级队列优先级队列介绍普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。在插入元素时,要按照优先级找到正确的位置并插入。实现一个简单的优先级队列数值的大小作为优先级,数值越大优先级越高。插入:根据元素的大小插入。取出:取出队头元素。在这里插入代码片package queue;public class QueueTest3 { public static void main(String[]原创 2021-02-01 22:54:08 · 153 阅读 · 1 评论 -
Java数据结构与算法笔记——双端队列
文章目录双端队列简介实现思路两个重要的算法取模运算扩容操作代码实现双端队列简介双端队列就是一个两端都是结尾或者开头的队列。队列的每一端都可以进行插入数据项和移除数据项,这些方法可以叫做:addFirst()、addLast()、removeFrist()、removeLast()如果只用addFirst()和removeFrist(),或者只使用addLast()和removeLast(),就是栈,先进后出如果交叉使用addFirst()插入数据,removeLast()取数据(反之亦然)就是前面讲原创 2021-01-10 22:47:48 · 335 阅读 · 3 评论 -
Java数据结构与算法笔记——单向队列
文章目录队列简介单向队列设计思路代码实现队列简介队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列中插入一个元素称为入队,从队列中删除一个元素称为出队。队列分为:【】单向队列:只能在一端插入数据,另一端删除数据。【】双向队列:每一端都可以进行插入数据和删除数据操作。【】优先级队列:数据项按关键字进行原创 2021-01-10 22:33:56 · 161 阅读 · 0 评论 -
Java数据结构与算法笔记——栈的应用举例
文章目录利用栈实现字符串的逆序利用栈判断分隔符是否匹配本文举了两个利可以用栈实现的小功能。利用栈实现字符串的逆序将字符串分割为单个字符,然后将字符一个一个push()进栈,再一个一个pop()出栈,就逆序了。package stack;import java.util.Stack;public class StackDemo1 { public static void main(String[] args) { String s = "how are you";原创 2021-01-10 22:13:49 · 137 阅读 · 0 评论 -
Java数据结构与算法笔记——栈
文章目录栈的特点实现一个简单的栈实现一个增强版的栈栈的特点栈和队列更多是用作程序员的工具,作为构思算法的辅助工具,而不是完全的数据存储工具,这类数据结构的生命周期比数据库类型的数据结构短的多,在程序执行期间才被创建,通常用它们去执行某项特殊的业务,执行完成之后,它们就被销毁。栈:只能在一段进行插入和删除操作的特殊线性表。实现一个简单的栈要实现的主要方法:push:入栈pop:出栈peek:读最上面的元素,但是不取出package stack;public class EasyStac原创 2021-01-10 22:05:04 · 114 阅读 · 0 评论 -
Java数据结构与算法笔记——ArrayList
文章目录数组与集合对比数组集合数组和集合的区别Arraylist初探手写一个简化的ArrayList数组与集合对比数组数组是java语言内置数据类型,是一个线性的序列。数组容量不变,生命周期也不变。数组会做边界检查,如果发现越界现象,会报错。集合java还提供其他集合list、map、set。他们处理对象的时候就好像这些对象没有自己的类型一样,而是直接归根于Object,这样只需要创建一个集合,把对象放进去,取出时转换成自己的类型就行。就是一个集合中可以放不同类型的对象。数组和集合的区别【原创 2021-01-10 21:48:49 · 95 阅读 · 0 评论 -
Java数据结构与算法笔记——稀疏数组压缩算法
文章目录稀疏数组算法效果举例代码实现稀疏数组稀疏数组就是数组中大部分的内容值都未被使用(或都为0),在数组中仅有少部分的空间使用。因此会造成内存空间的浪费。为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。算法效果举例假设有一个97的数组:在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组:第一行的三个元素表示原数组的行数、列数、使用个数第二行开始,每行的三个元素分别代表一个元素原创 2021-01-09 22:20:32 · 378 阅读 · 0 评论 -
Java数据结构与算法笔记——冒泡排序、选择排序、插入排序
文章目录冒泡排序乱七八糟的描述图解选择排序乱七八糟的描述图解插入排序乱七八糟的描述图解算法效率效率比较时间复杂度算法原理写的一窍不通,想了解原理的小伙伴们还是找几张动图吧。不过本文的代码可用!本文图片来自网络。冒泡排序乱七八糟的描述数组:arr两个指针:inner和outer。初始:inner指向第一位,outer指向最后一位。比较arr[inner]和arr[inner+1]的大小,如果arr[inner+1]>arr[inner],就交换两者的位置。inner后移,重复上述操作,原创 2021-01-09 22:08:57 · 162 阅读 · 0 评论 -
Java数据结构与算法笔记——无序数组和有序数组
文章目录无序数组和有序数组比较无序数组特点有序数组特点代码实现自己的数组无序数组有序数组无序数组和有序数组比较无序数组增:在数组最后插入删:找到元素;改为null;后面的元素逐一前移查:从第一项元素开始遍历,直至找到该元素或者遍历结束特点效率:插入数据快,查找数据慢,删除数据慢扩展性差:一旦创建后,大小就固定了,不能动态扩展数组元素的个数,有可能造成空间浪费或者空间不足。有序数组插入:找到插入元素应该插入的位置(根据元素值的大小);将该位置以及以后的全部数据项向后移动一位;在该位置插入元原创 2021-01-09 20:41:30 · 1251 阅读 · 1 评论