![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
魔舞清华-方
这个作者很懒,什么都没留下…
展开
-
马踏棋盘算法(使用贪心算法优化的前后对比)
马踏棋盘算法介绍马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格马踏棋盘游戏代码实现分析马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了53个点,如图:走到了第...原创 2020-03-13 11:50:36 · 1459 阅读 · 0 评论 -
弗洛伊德算法(Floyd)
弗洛伊德(Floyd)算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉...原创 2020-03-12 09:23:56 · 2140 阅读 · 0 评论 -
迪杰斯特拉(Dijkstra)算法 - 解决最短路径问题
迪杰斯特拉算法比较不好理解,我们来先看一个问题:看一个应用场景和问题:战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何计算出G村庄到 其它各个村庄的最短距离?如果从其它点出发到各个点的最短距离又...原创 2020-03-11 22:12:32 · 2432 阅读 · 0 评论 -
克鲁斯卡尔算法(Kruskal)
应用场景-公交站问题某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个站点连通各个站点的距离用边线表示(权) ,比如 A – B 距离 12公里问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短?如图:克鲁斯卡尔算法基本介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选...原创 2020-03-11 15:52:21 · 103 阅读 · 0 评论 -
普利姆算法和修路问题
修路问题看一个应用场景和问题:有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路: 将10条边,连接即可,但是总的里程数不是最小.正确的思路:就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少普利姆算...原创 2020-03-10 12:37:53 · 1103 阅读 · 0 评论 -
贪心算法-广播台覆盖问题
我们先看一个问题:假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果集...原创 2020-03-10 09:55:24 · 1269 阅读 · 2 评论 -
动态规划算法与背包问题
我们先看一个问题:背包问题:有一个背包,容量为4磅 , 现有如下物品要求达到的目标为装入的背包的总价值最大,并且重量不超出要求装入的物品不能重复动态规划算法基本介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子...原创 2020-03-09 12:09:56 · 132 阅读 · 0 评论 -
分治算法与汉诺塔问题
分治算法分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序...原创 2020-03-09 10:57:11 · 507 阅读 · 0 评论 -
数据结构 - 图 (图的深度优先和广度优先)
图的基本介绍为什么要有图这种数据结构数据结构有线性表和树线性表局限与一个直接前驱和一个直接后继的关系树也只能右一个直接前驱也就是父节点当我们需要表示多对多的关系时,这里我们就需要用到图这种数据结构图是一种数据结构,其中节点可以具有零个或者多个相邻的元素。2个节点之间的连接称为边。节点也可以称为顶点。 如图:图的常用概念1. 顶点(vertex)2. 边(edge)3....原创 2020-03-07 22:02:43 · 2913 阅读 · 0 评论 -
红黑树
红黑树也是一颗平衡二叉树,平衡二叉树参考文章平衡二叉树红黑树基本介绍红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(...原创 2020-03-06 18:41:16 · 105 阅读 · 0 评论 -
B树(B树 ,B+树 ,B*树)与多叉树
我们先来看看二叉树存在的问题二叉树的问题分析二叉树的操作 效率较高,但是也存在问题,请看下面的二叉树二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度....原创 2020-03-06 18:21:44 · 1416 阅读 · 0 评论 -
平衡二叉树(AVL树)
我们先看看二叉排序树可能的问题:一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在上面这颗二叉排序树(BST) 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)平衡二叉树基本...原创 2020-03-06 13:01:04 · 487 阅读 · 0 评论 -
二叉排序树(BST)
二叉排序树基本介绍二叉排序树:BST(Binary Sort(Search) Tree),对于 一个二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点小,右子节点的值比当前节点的值大。特别说明:如果右相同的值,可以将该节点放在左子节点或者右子节点比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:二叉排序树的创建和遍历一个数组创建成对应的二...原创 2020-03-05 21:57:34 · 145 阅读 · 0 评论 -
赫夫曼编码与解码
赫夫曼编码基本介绍赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码赫夫曼编码原理通信领域中信息的处...原创 2020-03-03 21:09:41 · 1291 阅读 · 4 评论 -
赫夫曼树
基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近重要概念说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结...原创 2020-03-02 21:03:33 · 103 阅读 · 0 评论 -
最难以理解的排序算法 - 堆排序(超详解)
堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。要理解堆排序,必须先要理解堆这种数据结构堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,...原创 2020-03-01 12:58:26 · 2838 阅读 · 2 评论 -
线索化二叉树
先看一个问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案-线索二叉树...原创 2020-02-29 12:13:59 · 162 阅读 · 0 评论 -
顺序存储二叉树
顺序存储二叉树的概念二叉树的顺序存储结构是把二叉树的所有节点按照一定的次序顺序存储到一组包含N个存储单元的空间中(一般是数组)。在二叉树的顺序存储结构中,只存储节点的值,不存储节点之间的逻辑,节点之间的逻辑关系由数组上下标的顺序来体现。二叉树的顺序存储原则是:不管给定的二叉树是不是完全二叉树,都看作完全二叉树,即按完全二叉树的层次次序(从上到下,从左到右)把各节点依次存入数组中。从数据存储...原创 2020-02-28 10:22:59 · 1451 阅读 · 0 评论 -
二叉树(前序,中序,后序遍历和查找,删除)详解
为什么需要树这种数据结构数组存储方式的分析:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索...原创 2020-02-27 19:11:45 · 3758 阅读 · 1 评论 -
数据结构 - 哈希表
哈希表基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表结构图:下面我们用代码实现一个谷歌上机题:看一个实际需求,google公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工...原创 2020-02-26 21:54:34 · 93 阅读 · 0 评论 -
斐波那契(黄金分割法)查找算法
斐波那契(黄金分割法)查找基本介绍黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近...原创 2020-02-26 20:44:47 · 3333 阅读 · 1 评论 -
二分查找算法(递归与非递归)与插值查找算法
二分查找算法二分查找算法不作过多的文字说明,请看代码和注释使用递归查找public class BinarySearch { public static void main(String[] args) { int[] array = {3,4,6,7,12,34,56,78}; int index = search(array, 0, array....原创 2020-02-26 09:21:19 · 269 阅读 · 0 评论 -
常用排序算法总结和对比
常用排序算法总结和对比术语解释:稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度: 一个算法执行所耗费的时间。空间复杂度:运行完一个程序所需内存的大小。n: 数据规...原创 2020-02-25 21:37:40 · 166 阅读 · 0 评论 -
基数排序
基数排序介绍基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是1887年...原创 2020-02-25 21:32:01 · 171 阅读 · 0 评论 -
归并排序详解(效率极高)
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序思想归并排序思想示意图:说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去...原创 2020-02-25 10:54:20 · 1473 阅读 · 0 评论 -
快速排序
快速排序快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后在按此方法对这两部分数据分别进行快速排序,整个排序过程可以进行递归,以此达到整个数据变成有序序列快速排序示意图...原创 2019-12-30 13:41:20 · 120 阅读 · 0 评论 -
希尔排序及其效率测试
希尔排序在说希尔排序之前我们来看看插入排序存在的效率问题:可以看出当插入排序要插入的数比较小的时候,我们需要对数组进行多次后移,这样就会对效率有很大影响。插入排序对于小规模的数据或者是基本有序时很高效,数据有序程度越高,插入排序的效率越高,希尔排序正是利用了这一点。希尔排序介绍希尔排序是希尔与1959年提出的一种排序算法,希尔排序也是一种插入排序,它的简单插入排序经过改进之后的一个...原创 2019-12-27 09:39:19 · 716 阅读 · 0 评论 -
插入排序
插入排序插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序思想:插入排序是把N个待排序的元素看成一个有序表和一个无序表,开始时有序表值包含一个元素,无序表中包含n-1个元素,排序的过程中每次从无序表中取出第一个元素,把它与有序表中的元素依次进行比较,将它插入到有序表中适当的位置,使之成为新的有序表插入排序的代码实现:publi...原创 2019-12-26 15:18:16 · 102 阅读 · 0 评论 -
选择排序
选择排序选择排序思想:选择排序也是一种简单的排序方法。它的基本思想是:第一次从arr[0] ~ arr[n-1] 中选取最小的值与arr[0]交换,第二次从arr[1] ~ arr[n-1] 中选取最小的值与arr[1]交换… 直到第n-1次次从arr[n-2] ~ arr[n-1]选取最小的值与arr[n-2] 交换。总共通过n-1次,得到一个按排序码从小到大的排序有序序列。如上图,...原创 2019-12-26 12:11:52 · 83 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序的基本思想是:通过对待排序序列从前向后(从较小下标开始),依次比较相邻元素的值,如发现逆序则交换2个元素的位置,使得较大的元素逐渐从前移向后面,就像水底的气泡一样逐渐向上冒。从图解中我们可以看出,第一趟通过比较相邻2个元素的大小,找出最大的元素,第二趟找出第二大的元素,依次类推,逐渐从小到大排序。代码演示:public class BubbleSort { ...原创 2019-12-26 10:59:07 · 306 阅读 · 0 评论 -
算法的时间复杂度
时间复杂度度量一个程序(算法)执行的时间的两种方法:事后统计方法这种方法需要实际运行该程序,所得时间的统计量依赖于计算机的硬件,软件等环境,这种方式需要在同一台计算机 相同的状态下运行,才能比较哪个算法速度更快。事前估算方法通过分析某个算法的时间复杂度来判断哪个算法更优通过对比,我们在分析一个算法哪个算法更快,一般采取的是事前估算法,即采用的是时间复杂度来判断哪...原创 2019-12-25 17:46:07 · 409 阅读 · 0 评论 -
递归-八皇后问题(回溯算法)
八皇后问题八皇后算法描述如下:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法!八皇后问题算法的思路分析第一个皇后先放在第一行第一列第二个皇后放在第二行的第一列,然后判断是否和别的皇后攻击,如果不OK,继续放在第二列,第三列,依次把所有的列放完,找到一个合适的位置继续放第三个皇后,还是第一列,第二列…直到第...原创 2019-12-25 14:59:51 · 300 阅读 · 0 评论 -
递归-迷宫问题(回溯)
递归在定义一个函数时,出现直接或间接调用自己的成分,称之为递归。递归算法解决问题的特点:1 .递归就是方法里调用自身。2. 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。3. 递归有助于编程者解决复杂的问题(如迷宫问题,汉诺塔等),同时可以让代码变得简洁递归需要遵守的重要规则执行一个方法时,就是创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,...原创 2019-12-24 15:49:17 · 3281 阅读 · 0 评论 -
前缀表达式与后缀表达式(逆波兰表达式)
前缀表达式前缀表达式又称波兰式,前缀表达式的运算符位于操作符之前。例:(3+4)*5-6对应的前缀表达式就是 - * + 3 4 5 6如何将中缀表达式(3+4)*5-6转换成前缀表达式 - * + 3 4 5 6。将中缀表达式转换为前缀表达式:遵循以下步骤:初始化两个栈:运算符栈S1和储存中间结果的栈S2;从右至左扫描中缀表达式;遇到操作数时,将其压入S2;遇到运算符时...原创 2019-12-23 09:49:06 · 2010 阅读 · 0 评论 -
数据结构-栈
栈栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫出栈,出数据在栈顶。栈的代码实现:public class Stack<E> { private Object[] data; pr...原创 2019-12-19 09:56:48 · 103 阅读 · 0 评论 -
数据结构-链表
链表链表基本介绍链表与数据结构有些不同。栈和队列都是申请一段连续的空间,然后按顺序存储数据;链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。链表由一系列节点组成,每个节点一般至少会包含两部分信息:一部分是元素数据本身,另一部分是指向下一个元素地址的指针。这样的存储结构让链表相比其他线性的数据结构来说,操作会复杂一些。与数组相比,链表具有其优势...原创 2019-12-17 10:57:47 · 161 阅读 · 0 评论 -
数据结构-队列
队列队列介绍:队列是一个有序的列表,可以用数组或者是链表来实现。队列遵循的原则是先入先出的原则。即:先存进去的数据,先取出,后存入的数据后取出。如我们把12345按照先后顺序存入队列,那么去取出的时候就会先按照12345顺序取出。下面我们来用数组模拟一个环形队列:分析:队列本身是一个有序表,如使用数组来表示队列的数据,那么队列数组的声明如上图,其中mazSize是队列的最...原创 2019-12-16 16:15:43 · 225 阅读 · 0 评论 -
数据结构-稀疏数组
稀疏数组定义稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组值无效数据远大于有效数组当一个数组中大部分的元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小数组的规模,节约空间我们来看这样一个数组: 0 0 0 ...原创 2019-12-16 11:42:45 · 140 阅读 · 0 评论 -
数据结构-线性结构和非线性结构
线性结构线性结构作为最常见的数据结构,其特点是数据之间存在一对一的线性关系线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构,存储存储的线性表称为顺序表,顺序表中的元素是连续的链式存储的线性表称为链表,链表中存储的元素不一定的连续的,元素节点中存放的数据元素以及相邻元素的地址信息常见的线性结构:数组,队列,链表,栈。非线性结构非线性结构包括:二维数组,多维数组,广义表,树结...原创 2019-12-16 09:21:49 · 619 阅读 · 0 评论 -
Java数据结构与算法之杨辉三角
杨辉三角规则:杨辉三角规则:1.每一行的第一例为12.每一行的最后一列为13.当前数 = 上一个数 + 上一个数的前一个数package com.java.array;/** * 杨辉三角规则: * 1.每一行的第一例为1 * 2.每一行的最后一列为1 * 3.当前数 = 上一个数 + 上一个数的前一个数 */public class YanghuiShanjiao...原创 2019-05-23 09:50:16 · 622 阅读 · 0 评论