算法与数据结构
文章平均质量分 87
RonzL
这个作者很懒,什么都没留下…
展开
-
马踏棋盘算法(骑士周游问题)
一、问题概述马踏棋盘算法也被称为骑士周游问题。问题内容是:将马随机放在国际象棋的 8× 8 棋盘的某个方格中, 马按走棋规则(马走日字)进行移动。要求每个方格只能走一次, 走遍棋盘上全部 64 个方格,求可行的路径。二、思路分析马踏棋盘问题实际上是图的深度优先搜索(DFS)的应用。该问题的解决思想为:假设以 V 为起点,首先找出在指定规则下 V 点下一步可能的落点。在下一步的可能的落点中选择一个点(假设是 U 点),然后走到 U 点。再以 U 点为起点,找出指定规则下 U 点下一步可能的原创 2021-02-08 09:12:41 · 5221 阅读 · 0 评论 -
图解弗洛伊德算法(每一对顶点之间的最短路径问题)
一、弗洛伊德算法概述在上一篇博客 图解迪杰斯特拉算法(最短路径问题) 中介绍了迪杰斯特拉算法,该算法用于求解单源最短路径问题。所谓单源最短路径路径就是从某一个顶点出发,求解其到各个顶点的最短路径。那么如果想要求解每一对顶点之间的最短路径,该怎么做呢?其实可以对迪杰斯特拉进行简单的改造,就可以实现上述目的。既然迪杰斯特拉是用于计算单个源点到各个顶点之间的最短路径,那么只需要对每个顶点都执行一次迪杰斯特拉算法,便可以得到每一对顶点之间的最短路径。迪杰斯特拉的时间复杂度是 O(n²),如果对每个顶点都执行一原创 2021-02-07 10:53:15 · 14751 阅读 · 7 评论 -
图解迪杰斯特拉算法(最短路径问题)
一、单源最短路径问题如上图给定一个带权图 G = <V,E>,其中每条边(vi,vj)上的权 W[vi,vj] 是一个非负实数。另外,给定 V 中的一个顶点 s 充当源点。现在要计算从源点 s 到所有其他各顶点的最短路径,这个问题通常称为单源最短路径(single-source shortest paths)问题。用一句话总结来说,单源最短路径就是:从图的某一点(源点)出发,到达其余各顶点(终点)的最短路径。解决单源最短路径问题的一个常用算法是迪杰斯特拉算法,它是由 E.W.Dijkst原创 2021-02-06 11:41:45 · 50300 阅读 · 7 评论 -
最小生成树(图解普里姆算法、图解克鲁斯卡尔算法)
文章目录一、最小生成树概述1.1 背景概述1.2 最小生成树的定义1.3 最小生成树构造算法二、普里姆算法2.1 普利姆算法介绍2.2 普利姆算法代码实现三、克鲁斯卡尔算法3.1 克鲁斯卡尔算法介绍3.2 克鲁斯卡尔算法代码实现一、最小生成树概述1.1 背景概述问题描述:假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1 条线路,每条城市之间的线路修建成本是不完全相同的,如何在最节省经费的前提下建立这个通讯网?问题分析:n 个城市间,最多可设置 n(n-1)/2 条线路原创 2021-02-04 21:00:41 · 7528 阅读 · 0 评论 -
贪心算法(集合覆盖问题)
一、贪心算法概述贪心算法的核心思想可以总结为:贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解,如单源最短路经问题,最小生成树问题等。虽然在一些情况下,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好近似。二、集合覆盖问题2.1 问题描述假设你办了个广播节目,要让国内的 8 个重要城市的听原创 2021-02-01 18:53:40 · 5270 阅读 · 0 评论 -
动态规划算法解决背包问题
一、动态规划算法概述动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从子问题解得到原问题解。但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解极值问题时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。动态规划 VS 分治法:相同点:基本思想均是将原问题分解成若干个子问题,先求子问题,然后从子问题的解得到原问题的解原创 2021-01-30 15:06:42 · 3392 阅读 · 0 评论 -
分治算法解决汉诺塔问题
一、汉诺塔问题概述汉诺塔问题是一个古老而又有趣的问题。这个问题的具体内容是:将所有盘子从最左边的塔 A 都移动到最右边的塔 C 上。每次只能移动一个盘子,大的盘子不能压在小的盘子上。二、思路分析我们先分别来看看只有一个、两个、三个盘子的情况下,移动过程是怎样的。一个盘子如上图所示,一个盘子的移动过程为:A→CA→CA→C两个盘子如上图所示,两个盘子的移动过程为: A→BA→CB→CA→B\\A→C\\B→CA→BA→CB→C三个盘子如上所示,三个原创 2021-01-29 09:28:03 · 345 阅读 · 0 评论 -
图(深度优先遍历、广度优先遍历)
文章目录一、图的概述1.1 什么是图1.2 图对比线性表和树1.3 图的常见概念二、图的存储方式2.1 邻接矩阵2.2 邻接表三、图的遍历3.1 图的深度优先遍历3.1.1 什么是深度优先遍历3.1.2 深度优先遍历的步骤3.1.3 深度优先遍历代码实现3.2 图的广度优先遍历3.2.1 什么是广度优先遍历3.2.2 广度优先遍历的步骤3.2.3 广度优先遍历代码实现一、图的概述1.1 什么是图图(graph)是一种数据结构,它是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)。原创 2021-01-27 13:16:00 · 6109 阅读 · 0 评论 -
平衡二叉树(AVL树)
一、平衡二叉树概述1.1 什么是平衡二叉树平衡二叉树也叫 AVL 树。平衡二叉树是具有以下特点的二叉查找树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1, 并且左右两个子树都是一棵平衡二叉树。 图一 平衡二叉树 图二 非平衡二叉树 1.2 为什么要有平衡二叉树在上一篇文章 二叉排序树 中对二叉排序树做了介原创 2021-01-24 22:19:15 · 7383 阅读 · 4 评论 -
二叉排序树(二叉搜索树)
一、二叉排序树概述二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大(如果有相同的值,则该节点放在左子节点或右子节点都可)。在一般情况下,二叉排序树的查询效率比链表结构要高。如下图所示就是一个二叉排序树:二、二叉排序树的基本操作2.1 创建和遍历二叉排序树【案例描述】给定如下数组:arr = {7, 3, 10, 12,原创 2021-01-23 14:43:29 · 1228 阅读 · 0 评论 -
哈夫曼树
一、哈夫曼树概述1.1 什么是哈夫曼树给定 n 个权值作为 n 个叶子节点,构造一棵二叉树,若该树的带权路径长度(Weighted Path Length of Tree)达到最小, 称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。1.2 哈夫曼树重要概念路径和路径长度:在一棵树中,从一个节点往下可以到达孩子或孙子节点的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为 1,则从根节点到第 L原创 2021-01-23 14:33:38 · 2973 阅读 · 0 评论 -
堆排序
文章目录一、堆排序概述1.1 什么是堆1.2 什么是堆排序1.3 堆排序的思想二、堆排序的步骤分析三、堆排序的代码实现一、堆排序概述1.1 什么是堆堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做为一棵树的数组对象。堆总是满足以下性质:堆中的父节点的值总是小于(或者大于)它的子节点的值;堆是一颗完全的二叉树。根据父节点与子节点的大小关系,堆又可以分为最大堆和最小堆。其中最大堆的父节点的值总是大于它的子节点的值;最小堆的父节点的值总是小于它的子节点的值。原创 2021-01-21 13:22:01 · 775 阅读 · 2 评论 -
线索化二叉树
一、线索二叉树概述在二叉树的节点上加上线索的二叉树称为线索二叉树。对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。通过考察各种二叉链表,不管二叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n 个节点的二叉链表共有 2n 个链域,其中非空链域为 n-1 个,但空链域却有 n+1 个。如下图所示,二叉树有 6 个节点,其中非空链域的个数为 7 个。利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针原创 2021-01-21 13:11:11 · 1563 阅读 · 0 评论 -
顺序存储二叉树
一、顺序存储二叉树概述从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序结构存储就是使用数组来储存,一般使用数组只适合表示完全二叉树,因为不完全二叉树会有空间的浪费。下图就是树和数组对应的关系图:顺序二叉树有下面几个显著的特征(n 表示二叉树中的第几个元素,从 0 开始):第 n 个元素的左子节点为第 2 * n + 1 个元素;第 n 个元素的右子节点为第 2 * n + 2 个元素;第 n 个元素的父节点为第 ( n - 1 ) /原创 2021-01-19 18:25:15 · 2187 阅读 · 0 评论 -
简单二叉树
文章目录一、二叉树概述1.1 为什么要有树这种数据结构1.2 树的常用术语1.3 什么是二叉树1.4 二叉树的遍历顺序二、二叉树的基本操作2.1 二叉树的节点遍历2.2 二叉树的节点查找2.3 二叉树的节点删除一、二叉树概述1.1 为什么要有树这种数据结构在前面已经学习了数组和链表这两种数据结构,这两种数据结构都有着鲜明的特点。数组存储方式的优缺点如下:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动原创 2021-01-19 18:18:28 · 314 阅读 · 0 评论 -
哈希表
一、哈希表概述散列表(Hash table, 也叫哈希表),是根据关键码 - 值(Key - value)而直接进行访问的数据结构。 也就是说, 它通过把关键码 - 值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射的函数叫做散列函数,存放记录的数组叫做散列表。其实把哈希表看做是字典来理解哈希表就很容易明白了,我们通过关键码即可快速定位关键值。显而易见哈希表有一个很大的优点就是查找数据的速度快。如下所示就是一个典型的哈希表:哈希表是数组和链表的结合体,上图的哈希表左边是一个数组,右边原创 2021-01-17 12:39:33 · 3342 阅读 · 1 评论 -
简单查找算法(线性、二分、插值)
文章目录一、查找算法介绍二、顺序查找2.1 什么是顺序查找2.2 顺序查找的代码实现三、二分查找3.1 什么是二分查找3.2 二分查找的基本步骤3.3 二分查找的代码实现四、插值查找4.1 什么是插值查找4.2 插值查找与二分查找的区别4.2 插值查找的基本步骤4.3 插值查找的代码实现一、查找算法介绍在 java 中,我们常用的查找算法有以下四种:顺序(线性)查找二分(折半)查找插值查找斐波那契查找本文将分别介绍顺序查找、二分查找、插值查找;如要访问斐波那契查找算法的文章请点击链接:斐波原创 2021-01-15 10:31:56 · 507 阅读 · 0 评论 -
斐波那契(黄金分割法)查找算法
文章目录一、斐波那契查找算法概述1.1 什么是斐波那契查找算法1.2 什么是斐波那契数列1.3 斐波那契查找算法的思想二、斐波那契查找的基本步骤三、斐波那契查找的代码实现一、斐波那契查找算法概述1.1 什么是斐波那契查找算法斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术。斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。斐波那契查找同样是查找算法家族中的一员,它要求数据是有序的(升序或降序)。斐波那契查找采用和二分查找/插值查找相似的原创 2021-01-15 10:28:48 · 9194 阅读 · 8 评论 -
基数排序算法
文章目录一、基数排序概述二、基数排序的步骤三、基数排序的代码实现一、基数排序概述基数排序(radix sort)属于 “分配式排序”(distribution sort),又称 “桶子法”(bucket sort)。基数排序的基本思想是:通过待排序元素的各个位的值,将待排序元素分配至某些 “桶” 中,达到排序的效果。基数排序是桶排序的扩展,基数排序法是效率高的稳定性排序法。二、基数排序的步骤基数排序过程一般遵循下面的基本步骤:首先确定待排序序列 arr 中最大的元素,得出元素的位数 N,位原创 2021-01-12 20:43:07 · 2458 阅读 · 1 评论 -
归并排序算法
文章目录一、归并排序介绍二、归并排序的思想2.1 归并排序的基本思想2.2 归并的基本步骤三、归并排序的代码实现一、归并排序介绍归并排序(merge sorting)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide and conquer)策略。分治策略将问题分解(divide)分解为一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案合并在一起,即分而治之。归并排序的时间复杂度为 O(nlogn)。二、归并排序的思想2.1 归并排序的基本思想归并原创 2021-01-12 10:17:42 · 3320 阅读 · 0 评论 -
快速排序算法
文章目录一、快速排序概述1.1 什么是快速排序1.2 快速排序过程解析二、快速排序的具体步骤三、快速排序的代码实现一、快速排序概述1.1 什么是快速排序快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。1.2 快速排序过程解析假设待排序的序列为 arr[0]~arr[n-1],首先任意选取一个元素(通常选取第一个)为基准元原创 2021-01-11 13:37:49 · 58502 阅读 · 6 评论 -
简单排序算法(冒泡排序、选择排序、插入排序、希尔排序)
java 排序算法 冒泡排序 选择排序 直接插入排序 希尔排序原创 2021-01-10 17:00:36 · 1000 阅读 · 3 评论 -
算法的时间复杂度和空间复杂度
算法 时间频度 时间复杂度 空间复杂度 算法的时间复杂度 算法的空间复杂度 计算时间复杂度 排序算法的时间复杂度原创 2021-01-06 16:27:13 · 1381 阅读 · 0 评论 -
递归之八皇后问题(回溯算法)
八皇后问题 递归 回溯算法 java实现八皇后问题 递归解决八皇后问题 java回溯算法原创 2021-01-05 19:47:28 · 570 阅读 · 1 评论 -
递归(包含迷宫问题)
递归 迷宫问题 递归打印 递归阶乘 阶乘 斐波那契数列 汉诺塔 递归的运行机制 递归的准则原创 2021-01-05 15:24:47 · 429 阅读 · 0 评论 -
栈实现逆波兰计算器(前缀、中缀、后缀表达式)
关键词:前缀表达式 中缀表达式 后缀表达式 波兰式 逆波兰式 栈 逆波兰计算器 前缀表达式到后缀表达式的转换 小数计算器 综合计算器原创 2021-01-02 11:26:30 · 697 阅读 · 3 评论 -
栈(数组模拟栈、实现简单计算器)
一、栈的概述1.1 什么是栈栈(stack)是一种基于先进后出(FILO-First In Last Out)策略的集合类型。栈是一种特殊的线性表,它限制元素的插入和删除只能在同一端进行。允许插入和删除元素的一端,为变化的一端,称为栈顶;另一端为固定的一端,称为栈底。根据栈的定义可以知道:最先放入的元素在栈底,最后放入的元素在栈顶;而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。下图形象地描述了元素出栈和入栈的过程: 图一:元素入栈过程原创 2020-12-31 18:13:00 · 526 阅读 · 5 评论 -
单链表之约瑟夫问题
一、问题描述约瑟夫( Josephu ) 问题是一个非常著名的有趣的题目。问题具体描述如下:设编号分别为1、2、3… n 的 n 个人围坐一圈,约定编号为 k(1≤k≤n)的人从 1 开始报数,数到 m 的那个人出列。出列的人的下一位又从 1 开始报数,数到 m 的那个人继续出列。以此类推,直到所有人都出列为止,由此产生一个出队编号的序列,这个序列也就是约瑟夫问题的解。下面将用一个动图来描述一下这个问题:假设有 4 个人围坐一圈,约定编号为 1 的人开始报数,数到 3 的那个出列。最后产生的出队编号原创 2020-12-27 10:44:56 · 1470 阅读 · 2 评论 -
单链表及常见算法题
一、链表概述1.1 链表介绍链表( Linked List ),别名链式存储结构或单链表,是一种常见的基础数据结构,用于存储逻辑关系为 “一对一” 的数据。链表是线性表的一种,但是它并不像顺序表一样是连续存储在内存中的。链表的各个结点散布在各个内存区域,在每一个结点中都存放下一个结点的地址。单链表在内存中是如下存储的:其中:data 域存放的是本结点的数据,next 域存放的是下一个结点的地址。通过上面的图,我们可以得到链表的几个特性:链表是以结点的方式来存储的,是链式存储;每一原创 2020-12-23 17:29:12 · 2055 阅读 · 0 评论