![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算解析法
文章平均质量分 84
这里是一些简单的算法讲解。
牛蛙先生
这个作者很懒,什么都没留下…
展开
-
算法之递归回溯(六)
上一篇我们在描述迷宫问题时,提到了是否恢复状态的问题:[迷宫]这里需要提醒一下,并不是所有迷宫问题都是不需要恢复状态的。选择不恢复状态的原因是题解要求我们查看连通性即可——也就是两个点之间是否连通。。这一篇我们继续描述连通性的问题。由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6×6的方阵(n=6),涂色前和涂色后的方阵如下:0 0 0 0 0 00 0 1 1 1 10 1 1 0 0 11 1 0 0原创 2022-05-13 11:04:12 · 156 阅读 · 0 评论 -
算法之递归回溯(五)
上一篇讲解了:使用二维数组参与递归回溯的过程跳马问题总结来说还是在规定步数内进行移动,但对于迷宫问题来说,则是表明了起点和终点。我们查看关于这个问题的解析。一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能原创 2022-05-13 10:11:04 · 217 阅读 · 0 评论 -
算法之递归回溯(四)
上一篇我们讲解了八皇后的问题:八皇后这一篇我们将继续聊迷宫棋盘类问题。八皇后问题我们使用一维数组模拟二维数组,以获得较好的效率。接下来,我们将考虑使用二维数组求解迷宫棋盘类问题的解。其中比较典型的是跳马问题。马在中国象棋以日字形规则移动。请编写一段程序,给定5×5大小的棋盘,以及马的初始位置(0,0),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。八皇后问题好像我们讨巧了,我们使用一维数组换来了二维数组的功能。这种事情少之又少,我们不能总是遇到这样的情况。我说过,当二原创 2022-05-11 18:25:12 · 616 阅读 · 0 评论 -
算法之递归回溯(三)
前两篇的内容重点放在递、归的功能和作用上递归回溯的过程这一篇我们聊一聊回溯法在迷宫棋盘类问题中的应用吧。一般来说,这种迷宫棋盘类的问题都是使用二维数组来求解。但又是也有例外。这是一个典型的例外——八皇后问题。那么,关于这类问题,我们在什么情况下选择一维数组,什么情况下选择二维数组呢?这跟数组的功能有关系。一般来说,一维数组中的元素最多可以表示两层含义。第一层由数组中的元素提供,第二层由数组的下标提供。比如说,对于数组int arr[4] = {1,2,3,4}来说,arr[3]得到的4可以表示一层含义,其原创 2022-05-11 17:28:05 · 230 阅读 · 0 评论 -
算法之递归回溯(二)
上一篇,我们从递归的递和归中发现了尝试的功能:[利用递归求解小明跳楼梯的跳法](https://blog.csdn.net/weixin_43204180/article/details/124677625)这一篇,我们将继续探究尝试的功能。每一个小孩子长大都是尝试的结果。他们不断的用身体感知这个世界,尝试与世界接触,他们才得以了解这个世界。这就是尝试的力量。我们在程序中也需要保持这样的热情,尝试着不同的活法。从跳楼梯的例子中,我们可以了解到,楼梯的阶数被拆成了1+1+1,1+2等等形式,这就好像是对数原创 2022-05-10 12:52:00 · 112 阅读 · 0 评论 -
算法之递归回溯(一)
在介绍递归算法时,递归发挥了两个作用,一个是递,另一个是归。递的意思是不断向下延伸,归的意思是返回上一个步骤。这两个操作为我们提供了无限的可能。其中最重要的一个应用就是尝试。关于尝试的概念,使用迷宫是好理解的。当我们身处一个迷宫中,我们可以做的事只有一个,不断的尝试,并在尝试过的位置做好标记。走过的路,我们不会再重复进行,这让我们可以快速通过迷宫。递归回溯的功能正如身处迷宫中的我们——不断尝试,并对走过的路进行标记。我们以一个简单的实例来说明问题。小明跳楼梯,小明每次可以跳1格或2格。问小明跳n阶楼梯原创 2022-05-10 00:09:10 · 274 阅读 · 0 评论 -
算法之递归算法(五)
上一篇将讲解的内容是从整体流程思考递归函数的内容这一篇我们衔接上一篇继续讲解从整体流程思考递归函数的内容。我们同样使用一个实例来分析。【题目描述】任何一个正整数都可以用2的幂次方表示。例如:137=27+23+20同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:2(7)+2(3)+2(0)进一步:7=22+2+20(21用2表示)3=2+20所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)又如:1315=210+28+2原创 2022-05-07 12:37:13 · 614 阅读 · 0 评论 -
算法之递归算法(四)
上一篇我们讲解了通过减少参数规模的方式求解问题:通过减少参数规模的方式求解问题前几篇内容中,我们使用递归函数就可以直接得到答案,但对于有些情况来说,这有些不现实,我们不可能求解的内容刚好都是一个结果。有时候,我们需要输出一串内容。Hanoi塔就是这样的问题。有三根柱子,分别为a,b,c。现在a柱上从下到上放着n块从大到小的圆盘。如果每次只能移动一块圆盘,请问把n块圆盘从柱子a移到柱子c上,一共有多少种移法?每一次移动的过程是怎么样的?要求不允许大圆盘放在小圆盘上。在递归算法的例题中,Hanoi塔是原创 2022-05-07 11:10:28 · 134 阅读 · 0 评论 -
算法之递归算法(三)
前一篇我们使用小明跳楼梯的例子说明了递归函数求解的方法:递归函数求解的方法这一篇我们继续了解递归算法的内容。对于一个参数的递归函数,我们找到了一种通用的方法,那就是直接寻找f(n)与f(n-1)之间的关系即可。但对于有些问题,一个参数是不够的。这一篇,我们将查看一个使用两个参数的递归算法练习题来讲解相关内容。给定两个整数,计算其最大公约数和最小公倍数。这个题干很简单,就是求最大公约数。如果你的第一反应是从大到小进行循环,如果某一个数刚好能够被这两个数整除,这个数字就是最大公倍数的话,这一篇可能是比原创 2022-05-07 00:26:39 · 273 阅读 · 0 评论 -
算法之递归算法(二)
第一篇,我们详细讲解了递归算法实现归并排序的执行过程。递归算法,解析归并排序的过程递归算法的解题思路就是使用递归函数来求解。其实这只是一个表现形式,具体的解题方法还是需要找规律来获得。只不过,这个找规律与数学中的找规律不同。数学中的找规律往往是根据前几个数字来推演,也就是根据前几个数字来推算,比如说,给一个序列其中前几个数字为 1,3,5,7...根据规律,我们可以发现这个序列是奇数序列,并且第一个元素为1,因此可以概括为2*k-1,其中k表示第k项。递归函数的方法并不是如此。同样给出的1,3,5,7..原创 2022-05-06 18:40:37 · 187 阅读 · 0 评论 -
算法之递归算法(一)
所谓递归算法,其实就是使用递归函数求解问题。而什么是递归函数呢?递归函数就是函数内调用自己的函数。有一个小故事很好的诠释了递归的功能。“从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚给小和尚说故事,说,从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚和给小和尚说故事…”在这个故事里,故事套着故事,无穷无尽。这就是递归函数的特点。//函数f是一个递归函数int f(int n){ return f(n);}在这样的一个函数f中,调用了函数f。这就是递归函数了原创 2022-05-06 12:50:22 · 272 阅读 · 0 评论 -
算法之排序算法(六)
前几篇的内容已经详尽的介绍了各个算法。上一篇也主要讲解了归并排序的具体实现:归并排序这一篇的内容我们将聊聊关于stl的内容。stl指的是Standard Template Library(标准模板库)。这是C++的标准库。它包含很多已经实现的内容,比如我们今天将要接触到的sort——标准库排序函数。sort是标准库给我们提供的排序函数。一般来说,它的执行速度是有优势的。因此,在情况允许的情况下,选择sort是一个不错的选择。但sort函数并不是由某一种算法实现,而是由多个算法集合合成,当数据量比较小时(原创 2022-05-04 12:10:21 · 206 阅读 · 0 评论 -
算法之排序算法(五)
有了上篇的铺垫,这篇关于归并排序的内容就会简单许多。归并排序总的来说,归并排序的内容和合并两个有序序列是有关的。具体的关系是什么呢?如果我们能将数组一分为二,然后一直分下去,直到每个序列只有一个元素。此时,每一个序列都是有序的。接着,我们将这些需要按照要求合并起来。合并之后的序列就是有序的序列了。我们使用实例来说明问题吧,我们使用这些数字1, 6, 0, 5, 7, 4, 3尝试解答一下详细的内容。这张图是很明显的。从上到下,每一个长序列都被拆解成了单独元素的序列。这样就可以运用我们的上一篇讲解的合并原创 2022-05-04 11:06:23 · 100 阅读 · 0 评论 -
算法之排序算法(四)
上一篇内容是关于快速排序的:快速排序我们了解到快速排序有它的优点,执行速度快,消耗的时间和空间少。但他也有它的缺点——不稳定。这个缺点可大可小,我们需要在不同的环境中查看。对于稳定性要求高的环境中,它对于我们来说就不是那么适宜。而仅仅追求速度的环境中,它就可以放大异彩。就像我们每一个人,各有擅长的地方,也有不足的地方。我们总是想着补足不足,而忘了我们最擅长的内容。擅长的内容其实才是我们的乐趣呀。有时候看向我们擅长的内容会让我们更有信心。但今天我们并不是要了解快速排序的优势,或者说了解快速排序在什么环境中原创 2022-05-01 00:04:06 · 112 阅读 · 0 评论 -
算法之排序算法(三)
上一篇我们介绍的是:冒泡排序冒泡排序我们说是向鱼儿吐泡泡一样。最大的逐渐向最右侧移动。我们采用的方法是比较相邻的两个元素。这种方法并不快。它的时间复杂度为n^2。当数据量比较大时,时间将会非常长。因此我们希望改进一下这样的程序。当数据量比较大时,运行时间仍然是我们可接受的。我们可以了解一下快速排序。快速排序从名字就可以看的出来,它的速度是他的优势,特别当数据量非常大的时候。快速排序的核心是将数据分成两个部分,对于每一部分进行排序,最终再合起来。这句话是不好理解的。我们企图思考一下,如果让你对5,3,9进原创 2022-04-28 16:19:32 · 130 阅读 · 0 评论 -
算法之排序算法(二)
上一篇是关于算法的描述算法的描述,不同排序算法的区别不同的排序算法有着不同的特点,接下来我们将一步一步剖解排序算法的内容。我们将从这样的顺序进行。排序算法冒泡排序快速排序归并排序桶排序标准库排序函数标准库排序函数与结构体的结合我想经过这样的描述,对于排序算法的内容,我们将了解无比,而不再发愁。那么我们将开始第一篇关于算法的详细描述。冒泡排序,冒泡排序算法的原型是鱼儿吐泡泡。我想在很久以前,有一位老科学家,家里养了几条鱼。鱼儿每天都在鱼缸里活蹦乱跳。有一天早晨,他看到鱼儿在鱼缸中吐着泡原创 2022-04-28 14:44:24 · 234 阅读 · 0 评论 -
算法之排序算法(一)
排序在生活中使用率是很大的。在学校,老师会把同学们从矮到高排成几列,有序地放学。在排座位的时候,老师也要考虑每位同学的身高,以及他的视力情况,近视的同学排位置可能会更靠前。这就涉及到排序算法。排序算法的种类有很多。但并不是每一种算法我们都要掌握的。其中一些算法是比较关键的。例如,冒泡排序,快速排序,归并排序和桶排序。提到这些算法的区别,我们不得不补充一下关于算法的描述标准——时间复杂度和空间复杂度。时间复杂度指的是在执行算法过程中所消耗的时间。空间复杂度指的是在执行算法过程中所消耗的空间内存大小。在这里,原创 2022-04-28 12:10:21 · 94 阅读 · 0 评论 -
算法之高精度(八)
上一篇讲解的是两个高精度数字相除接下来这篇是高精度算法的最后一篇内容,它涉及高精度除法的第二种——高精度数字除以常规数字。我们知道,常规数字是可以直接进行除法的,因此,我们不一定都要转换为高精度的整数数组形式。从高精度数字乘以常规数字时,我们就提到过,常规数字转换为高精度的整数数组形式需要使用循环语句,这是非常浪费时间的。特别在复杂的计算中,多一次循环将花费大量的时间。因此我们企图寻找其他方案解决高精度数字与常规数字之间除法的问题。在前面几篇文章里,我们总是使用举例的方式描述所讲的算法。当然,这次也不例原创 2022-04-28 01:48:58 · 210 阅读 · 0 评论 -
算法之高精度(七)
前一篇内容简单描述了:高精度数字和常规数字相乘相对于乘法,高精度除法在高精度算法中比较难的部分。原因是不论加减乘的内容,我们始终只需要去计算,而除法就会涉及到判断。我们必须了解到被除数÷除数=商…余数。余数不能大于除数,也不能小于0。这是我们需要控制的。这篇我们将详细介绍两个高精度数字相除。首先,我想我还是需要提醒一下大家。除法的原理是什么?我常常称除法是减法的快速运算。如何理解这句话呢?我们设想,一个盘子里有10个苹果,需要分给3位小朋友,请问每位小朋友能分到几个?你会很快反应出来,3个。你的原创 2022-04-27 18:18:50 · 183 阅读 · 0 评论 -
算法之高精度(六)
前一章节我们了解了:高精度数字乘法的规则——两个高精度数字相乘这一篇我们将尝试描述一个高精度数字与一个常规数字相乘的解决方案。你可能也会产生好奇,毕竟使用整数数组表示数字的方式是不论高精度还是常规数字的。在这里还是举一个实例来表明我的含义。例如:数字1234使用int类型,甚至short类型完全能够表示的,但同样的,我们使用整数数组表示,也并不能认为是错误的。下标0123数字4321对于这样的形式,我想,把它当作高精度的一种也是可以理解的。这样的话,高精度数字乘上原创 2022-04-27 16:53:38 · 100 阅读 · 0 评论 -
算法之高精度(五)
高精度数字的减法运算法则也已经介绍清楚了:高精度减法接下来,按照顺序我们该介绍高精度乘法了。我们说高精度乘法其实是分为两个部分的,第一个部分是两个高精度数字相乘,另一种是高精度数字乘上一个常规数字。我们一个一个介绍吧。首先,两个高精度数字相乘。与高精度加减法类似,我们回顾一下小学五六年级的知识,两个整数相乘。我们假设计算45*12的积。在数学中,你会做什么?没错,你可能会列一个竖式,然后一个一个计算。我们使用表格尝试表述一下。下标01234乘数00045原创 2022-04-25 17:43:46 · 226 阅读 · 1 评论 -
算法之高精度(四)
这是高精度算法的第二篇,第一篇描述的是加法运算方式:高精度加法这一篇我们描述高精度减法。减法和加法有些类似。如果你理解了高精度数字加法完整的运算法则,我想理解减法也是非常容易的。我们仍然使用一个...原创 2022-04-25 12:13:53 · 168 阅读 · 0 评论 -
算法之高精度(三)
上篇我们讲完了输入和输出的内容:高精度输入输出从数学角度来说,不管是整数还是小数,不管表示的数字大还是数字小,都应该能够进行四则运算——加减乘除。这几乎是必须的。我们的高精度数字也应该能进行这样的处理。我们把涉及高精度四则运算的算法称之为高精度算法。不论如何,我们开始进行吧。不过,我想还是应该先介绍一下高精度算法包含哪些?1.高精度加法——两个高精度数字相加2.高精度减法——两个高精度数字相减(相减结果会大于0)3.高精度乘法——两个高精度数字相乘4.高精度乘法——一个高精度数字乘以常规数字5原创 2022-04-25 00:47:29 · 307 阅读 · 1 评论 -
算法之高精度(二)
上一篇我们描述了:高精度是什么?如何表示高精度?我们知道高精度是用来表示数字的。既然是数字,那么我们会想到使用数字来进行运算。比如说,加法,减法,乘法,除法等。我们依次来介绍吧。在具体介绍加减乘除之前,我想我们还是非常有必要了解一下高精度数字的输入输出方式。高精度数字是如何输入的?很显然,高精度的数字是超过long long的表示范围的。因此我们并不能使用任何现有类型的变量直接存储。我们上一篇提供的方式是使用整数一维数组来存放高精度数字。输入时,我们也采用输入数组一样的方式吗?...原创 2022-04-24 19:14:58 · 462 阅读 · 1 评论 -
算法之高精度(一)
这是关于高精度的介绍。什么是高精度?在现实生活中,我们也会见到很多比较大的数字。比如说3141592662623。我们在表示这些数字的时候常常会使用一些单位(万,亿,十亿等等),比如说,三万一千四百一十五亿九千二百六十六万二千六百二十三。但计算机中并不是这样表示的,计算机中使用的是二进制表示,而不是十进制。电脑中表示一个数字所使用的二进制数量是有限的,通常是32位或64位。32位所能表示的最大数是231,使用估算的话,大概是21亿左右。这是int类型的极限了。64位所能表示的最大数是263,估算得到的数原创 2022-04-23 00:26:42 · 1198 阅读 · 0 评论