数据结构与算法
Nobody A
这个作者很懒,什么都没留下…
展开
-
数据结构与算法-马踏棋盘
马踏棋盘马踏棋盘算法也被称为骑士周游问题将马随机放在过期象棋的8x8棋盘的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格骑士周游问题结局步骤和思路1.创建棋盘chessBoard,是一个二维数组 2.将当前位置设置为已个访问,然后根据当前位置,计算马儿还能走那些位置,并放到一个集合中(ArrayList),最多8个位置3.变量ArrayList存放的所有位置,看看哪个可以走通4.判断马儿是否完成了骑士周游问题注意:马儿不同的走法,会得到不同的结果,效率翻译 2020-09-22 09:28:00 · 375 阅读 · 0 评论 -
数据结构与算法-弗洛伊德算法(Floyd)
弗洛伊德算法和Dijkstra算法一样,弗洛伊德算法也是一种用于寻找给定加权图中顶点间最短路径的算法。该算法名称以创始人之一,1978年图灵奖获得者,斯坦福大学计算机科学家教授罗伯特-弗洛伊德命名弗洛伊德算法计算图中各个顶点之间的最短路径迪杰斯特拉算法计算图中某一个顶点到其他顶点间的最短路径佛洛依德算法VS迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问的顶点,求出从出发点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要每一个顶点看作被访问的顶点,求出每个顶点到其他顶点的最短路翻译 2020-09-21 09:39:29 · 1235 阅读 · 0 评论 -
数据结构与算法-迪杰斯特拉算法(Dijkstra)
迪杰斯特拉算法(Dijkstra)迪杰斯特拉算法是典型的最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层层扩展(广度优先搜索思想),直到扩展到终点为止应用场景战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G),现有6个邮差,从G点出发,需要分别把邮件送到各个村庄各村庄的距离用边线表示(权),比如A-B距离5公里如何计算出G村庄到其他各个村庄的最短距离?如果从其他点出发到各个点的最短距离又是多少?算法过程设置出发顶点为v,顶点翻译 2020-09-18 09:39:18 · 924 阅读 · 0 评论 -
数据结构与算法-克鲁斯卡尔算法(Kruskal)
克鲁斯卡尔算法克鲁斯卡尔算法,是用来求加权连通图的最小生成树的算法基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:首先构造一只含有n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林不构成回路,直到森林变成一棵树为止应用场景某城市新增7个站点(A, B, C, D, E, F, G),现在需要修路把7个站点连通各个站点的距离用边线表示(权),比如A-B距离为12公里问:如何修路保证各个站点都能连通,并且修建的总公里数最短?代码翻译 2020-09-17 09:55:50 · 853 阅读 · 0 评论 -
数据结构与算法-普里姆算法
普里姆算法应用场景假设A、B、C、 D、E、F、G 为 7 座城市,为了方便生产生活,要为这 7 座城市建立通信。对于7个城市来讲,本着节约经费的原则,只需要建立 6 个通信线路即可修路问题的本质就是最小生成树问题,简称MST给定一个带权的无向连通图,如何选取一颗生成树,使树上所有边上权的总和最小,这叫最小生成树n个顶点,一定有n-1条边包含全部顶点普里姆算法设G=(V, E)是连通网,T=(U, D)是最小生成树,V,U是顶点集合,E,D是边的集合若从顶点u开始生成最小生成树,翻译 2020-09-15 09:53:08 · 486 阅读 · 0 评论 -
数据结构与算法-贪心算法
贪心算法贪心算法是指在对问题求解时,在每一步选择中都采取最好或者最优的选择。从而希望能够导致结果是最好或最优的算法贪婪算法得到的结果不一定是最优的结果,有时候会是最优,但是相对接近最优的结果应用场景现有北京,上海,天津,广州,深圳,成都,杭州,大连几个城市需要覆盖广播电台,选取最少的广播电台组使其覆盖上述城市选取的组:K1 -> 北京,上海,天津 K2 -> 广州,北京,深圳 K3 -> 成都,上海,杭州 K4 -> 上海,天津 K5- > 杭州,大连代码翻译 2020-09-08 11:15:09 · 342 阅读 · 0 评论 -
数据结构与算法-KMP算法
KMP算法KMP算法是一个解决模式串在文本串中是否出现过,如果出现过,找出最早出现位置的经典算法Knuth-Morris-Pratt字符串查找法,简称“KMP”算法,这个算法由DonaldKunth, Vaughan Pratt, James H.Morris三人于1977年联合发表,故取这三人的姓氏命名此算法KMP方法算法就是利用之前判断的信息,通过一个next数组,保存模式串中前后最长公共序列的长度,每次回溯时,通过next数组找到前面匹配过得位置,省去了大量的计算时间代码实现public翻译 2020-09-08 11:08:18 · 161 阅读 · 0 评论 -
数据结构与算法-动态规划算法
动态规划算法应用场景-背包问题有一个背包,容量为4磅,现有如下物品1)要求达到的目标为装入背包的总价值最大并且重量不超出2)要求装入的物品不重复基本思想1)动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理方法2)动态规划算法与分治算法类似,其基本思想也是将带求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解3)与分治算法不同的是,适用于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。(即下一个子阶段的求解往往是建立在上一翻译 2020-09-08 11:04:54 · 250 阅读 · 0 评论 -
数据结构与算法-分治算法
分治算法基本思想分治法是一种很重要的算法,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的问题…直到最后子问题可以简单的直接求解,原问题的解即子问题解的合并。基本步骤分治算法在每一层递归上都有三个步骤1.分解:将原问题分解为若干个大小,相互独立,与原问题形式相同的子问题2.解决:若子问题规模较小而容易解决则直接解决,否则递归地解各个子问题3.合并:将各个子问题的解合并为原问题的解应用场景汉诺塔汉诺塔(又称河内塔)问题是源于印原创 2020-08-24 11:05:42 · 335 阅读 · 0 评论 -
数据结构与算法-图(深度优先/广度优先)
图图的常用概念1.顶点(vertex)2.边(edge)3.路径4.无向图(顶点之间没有方向)5.有向图6.带权图(带权值的图也叫网)图的表示方式二维数组(邻接矩阵)邻接矩阵是表示图形中顶点之家相邻关系的矩阵,对于n个顶点的图而言,矩阵的row和col表示的是1 … n个点。链表(邻接表)(1)邻接矩阵需要为每个顶点都分配n个空间,其实有很多边都是不存在的,会造成空间的一定损失(2)邻接表只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成图的深度优先(原创 2020-08-21 15:09:31 · 534 阅读 · 0 评论 -
数据结构与算法-赫夫曼树
赫夫曼树定义给定n个权值作为n个叶子结点,构造一颗二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也成为赫夫曼树赫夫曼树是带权路径长度最短的树,权值较大的节点离根较近概念路径和路径长度在一棵树中,从一个节点往下可以达到孩子或孙子节点之间的道路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到L层节点的路径长度为L-1...原创 2020-08-20 17:19:51 · 212 阅读 · 0 评论 -
数据结构与算法-平衡二叉树(AVL树)
平衡二叉树(AVL树)基本介绍平衡二叉树也叫平衡二叉搜索树,又被称为AVL树,可以保证查询效率较高具有以下特点(1)它是一颗空树或他的左右两个子树的高度差额绝对值不差过1(2)它的左右两颗子树都是一颗平衡二叉树平衡二叉树的旋转左旋转Node newNode = new Node(value);//把新的节点的左子树设置成当前的左子树newNode.left = left;//把新的节点的右子树设置成当前节点右子树的左子树newNode.right = right.left;原创 2020-08-20 13:21:45 · 148 阅读 · 0 评论 -
数据结构与算法-二叉排序树
二叉排序树定义二叉排序树(Binary Sort Tree)又称二叉查找树、二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;思路添加节点1) 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。2) 若二叉树为空。则首先单独生成根结点。删除节点1)先去找到target节点2)找到targ原创 2020-08-18 15:27:50 · 397 阅读 · 0 评论 -
数据结构与算法-排序(冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,基数排序,堆排序)
排序定义对一序列对象根据某个关键字进行排序。术语稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度: 一个算法执行所耗费的时间。空间复杂度:运行完一个程序所需内存的大小。时间复杂度总结n: 数据规模k: “桶”的个数In-place: 占用常数内存,不占用额外原创 2020-08-13 16:32:04 · 419 阅读 · 0 评论 -
数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)
查找算法以下三种算法的基本思想相同,都是利用递归来寻找二分查找思路分析1.首先确定该数组的中间下标,min = (left + right) / 22.然后让需要查找的的数findVal和arr[min]比较(1)findVal > arr[mid],说明n你要查找的数在mid的右边,递归向右查找(2)findVal < arr[mid],说明n你要查找的数在mid的左边,递归向左查找 找到数,直接返回(3)递归完整个数组,任然没找到finVal,结束递归,此时left原创 2020-07-28 18:29:53 · 199 阅读 · 0 评论 -
数据结构与算法-算法的时间复杂度
时间频度一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费的时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记T(n)。时间复杂度一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n) = O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。T(n)不同原创 2020-07-14 20:36:00 · 279 阅读 · 0 评论 -
数据结构与算法-递归
递归的概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题递归调用规则当程序执行到一个方法时,就会开辟一个独立的空间(栈)每个空间的数据(局部变量),是独立的如果方法中使用的是引用类型的变量,就会共享该引用类型的数据递归必须向退出的条件逼近,否则就是无限递归当一个方法执行完毕。或遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕递归实现迷宫找路使用递归回溯来给小球找路map表示地图翻译 2020-07-10 16:26:38 · 203 阅读 · 0 评论 -
数据结构与算法-逆波兰表达式(后缀表达式)
前缀、中缀、后缀表达式前缀表达式(波兰表达式)前缀表达式又称波兰表达式,前缀表达式的运算符位于操作数之前例如(3+4)*5-6对应的前缀表达式就是- * + 3 4 5 6中缀表达式中缀表达式就是常见的运算表达式,如(3+4)*5-6中缀表达式的求值是我们人最熟悉的,但是他对计算机来说却不好操作,因此,在计算结果时,往往会将中缀表达式转换成其他表达式来操作(一般转换成后缀表达式)后缀表达式(逆波兰表达式)后缀表达式又称为逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后(3+4)*翻译 2020-07-10 13:44:34 · 434 阅读 · 0 评论 -
数据结构与算法-栈
栈的介绍栈的英文为(stack)栈是一个先入后出的有序列表栈是限制线性表中元素的插入和删除只能在线性的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素先删除,最先放入的元素后删除图解说明出栈(pop)和入栈(push)栈的应用场景子程序的调用:在跳往子程序之前,会将下个指令的地址存储在堆栈中,直到子程序处理完成后翻译 2020-06-24 09:53:48 · 96 阅读 · 0 评论 -
数据结构与算法-环形队列
环形队列队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。应用场景餐厅的叫号系统整体思路设置一个固定长度为maxSize的数组,设置一个记录数组下次插入数据的 下标rear,一原创 2020-06-16 17:40:59 · 1043 阅读 · 1 评论 -
数据结构与算法-稀疏数组
稀疏数组的应用场景编写的五子棋程序,有存盘退出和续上盘的功能当一个数组大部分元素为同一个值时,可以使用稀疏数组来保存该数组因为该二维数组有很多值是默认为0,因此记录了很多没有意义的数据->稀疏数组整体思路记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行和列及值记录在一个小规模的数组中,从而缩小数据的规模图解创建一个原始的二维数组 11*110表示没有棋子,1表示黑子,2表示蓝子图1(棋盘)图2(棋盘演变的稀疏数组):图3(转换后的稀疏数组):翻译 2020-06-11 20:06:28 · 93 阅读 · 0 评论 -
数据结构与算法-单链表
单链表单链表是一种链式存取的数据结构,java里常用的LinkedList就是单链表1.链表是以节点的方式来存储的2.每个节点包括data域(数据元素的映象),next域:指向下一个节点(后继元素存储位置)3.链表的各个节点在内存中不一定是连续存放4.链表分带头节点的链表和没有头结点的链表使用带head头节点的单向链表单链表创建示意图第一个节点为头节点,不存放数据,作用是表示单链表的头后面我们每添加一个节点,就直接加到链表最后代码实现以下代码实现了单链表的增删改翻译 2020-06-22 16:45:51 · 171 阅读 · 0 评论 -
数据结构与算法-单向环形链表(约瑟夫问题)
单向环形链表链表中每个节点的指针域是单向的,指向下一个节点,并且最后一个节点的针指向第一个节点,这样就形成了一个闭环,这样的链表结构就是单向循环链表约瑟夫问题据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他原创 2020-06-23 18:48:43 · 248 阅读 · 0 评论