![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 65
走马走马
摆烂王,擅长水上项目,摸鱼与划水尤为突出。博客仅为个人学习。
展开
-
图的遍历--深度优先搜索
深度优先搜索和广度优先搜索,其实都是针对图的变量而言的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHl9b53M-1649174978055)(…/…/…/AppData/Roaming/Typora/typora-user-images/image-20220405230039027.png)]简单来说,图就是一些圆点和连接这些圆点的直线组成。例如上图的这五个定点和四条边。我们现在从1号顶点开始遍历整个图,遍历指的就是把图的每一个顶点都访问一次。使用深度优先搜这原创 2022-04-06 00:10:15 · 2426 阅读 · 0 评论 -
广度优先搜索
在前面的迷宫中,我们使用了深度优先搜索的方法,这里介绍一个新的方法来解决这个问题——广度优先搜索,也称为宽度优先搜索。这里还是用一个二维数组来存储迷宫,最开始的时候A也是在迷宫(0, 0)处,他可以往下走或往右走。还是采用和深度优先搜索一样的方法,我们先让他往右走,然后一直尝试下去,直到走不通了再返回这里。这样就是深度优先,可以通过函数的递归方式来实现。现在介绍的方法是:通过一层一层的拓展的方法来实现找打B。拓展时发现一个点就将正点加入列表中,直至发现B的位置。最开始A的位置是在入口(0, 0),一步.原创 2022-04-03 12:39:43 · 571 阅读 · 0 评论 -
DFS应用
有一天,A一个人去玩迷宫。但是方向感不好的它迷路了。B得知后便要去解救A,B显然是有备而来,已经是知道了迷宫的地图,但是B现在要以最快的速度去解决A。那么问题就从现在开始了。 迷宫由n行m列的单元格组成,每个单元格要么是空地,要么就是障碍物。你的任务是帮助B选择一个从迷宫起点到A所在位置的最短路径。注意:障碍物是不能走的,当然B也不能走到迷宫之外。 首先,我们当然需要一个二维数组来存储这个迷宫,刚开始的时候,B处于迷宫的入口处(0, 0)。A处于(p,q)。其实,就是从(1,1)到(p,q)的最原创 2022-04-02 23:16:19 · 464 阅读 · 0 评论 -
二叉树与二叉树遍历
树的介绍 你可能回文树和图有什么区别?这个称之为树的东西和无向图差不多嘛。树其实就是不包含回路的连通无向图。 图画的不好啊,把箭头忽略一下将就看一下,上面这个图左边就是一棵树,而右边就是一个图。因为左边没有类似右边存在的1->2->5->3->1这样的回路。 正式因为树有不包含回路这个特点,所以被赋予了很多的特性:一棵树的任一两个结点有且只有唯一一条路径连通一棵树有n个结点,那么它一定恰好有n-1条边在一棵树中加一条边将会构成一个回路树这个特殊的数据结构会在原创 2022-03-28 23:27:20 · 848 阅读 · 1 评论 -
深度优先搜索
有一个问题,输入一个数n,输出1~n的全排列。这里先将这个问题形象化,举个例子。假如有编号为1、2、3的3张扑克牌和编号为1、2、3的3个盒子,现在需要将这3张扑克牌分别放到3个盒子中,并且每个盒子只能放一张扑克牌。那么一共有多少种方法呢? 现在让A先来,A手里有3张扑克牌,首先走到1号盒子面前,此时A心里想:他是要先放1号扑克牌,还是2号扑克牌,还是3号扑克牌呢?现在要生产的全排列,很显然3种方式都要去尝试。那么现在就先约定好一个顺序先:每次走到一个盒子面前都先放1号,再放2号,最后才来放3号。原创 2022-03-27 17:35:04 · 417 阅读 · 0 评论 -
数组模拟链表
如果你很难理解指针这些,没关系,还有一种使用数组来实现链表的方式,叫做模拟链表。 链表中每一个节点只有两个部分。我们可以用一个数组data来存储序列中的每一个数。那么每一个数的右边的数是谁呢?这样要怎么解决呢?我们还需要一个数组right来存放序列中每一个数右边的数是谁就行了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCZmfDrl-1648352864399)(…/…/AppData/Roaming/Typora/typora-user-images/ima原创 2022-03-27 11:48:11 · 1672 阅读 · 0 评论 -
数据结构 - 链表
在存储和一大波数的时候,我们通常使用的是数组,但有时候数组显得不够灵活,比如以下示例: 有一串已经从小到大排好序的数2 3 5 8 9 10 18 26 32。现在需要往这串数字中插入一个6,使得新的序列仍然符号从小到大的排列。我们如果使用数组来时间这一操作就需要将8和8后面的数全部依次往后挪一维。这样操作显然很耽误时间,如果使用链表就会快很多。 如何实现链表呢?在C语言中可以使用动态指针和动态分配内存函数malloc来实现。指针?天啊!如果你在学习C语言的时候没有搞懂指针,或者还不知道指针是啥,原创 2022-03-27 10:30:33 · 1197 阅读 · 0 评论 -
栈和队列——小猫钓鱼
星期天A和B在一起玩扑克牌,他们在玩一个古怪的扑克牌游戏——小猫钓鱼。游戏的规则是这样的,将一副扑克牌平均分成两份,每人拿一份。A先拿出手中的第一章牌放在桌上,然后B也从手里拿出一张牌放在桌上,就放在A刚刚出牌的上面,就像这样两个人交替出牌。出牌时,如果某人打出的牌与桌面上某张牌的牌面相同,即可将两张相同的牌和其中夹的牌全部取走,并依次放到自己的牌的末尾。当一个人的牌耗尽时,游戏结束,对手获胜。 假如游戏开始时,A手中有6张牌,顺序为2 4 1 2 5 6,B手中也有6张牌,顺序为3 1 3 5 6原创 2022-03-24 00:23:23 · 3890 阅读 · 0 评论 -
后进先出 - 栈
前面了解了队列,它是一种先进先出的数据结构,还有一种后进先出的数据结构,它叫做栈。栈限定为只能在一端进行插入和删除操作。比如说有一个小桶,小桶的直径只能放一个球,我们现在在桶内依次放入2,1,3号小球。假如你现在需要拿出2号小球,那就必须先把3号小球拿出,然后再拿出1号小球,最后拿出2号小球。在刚才取小球的过程中,我们最先放进去的小球最后才能拿出来,最后放进去的小球却可以最先拿出来。 栈究竟有哪些作用?先看一个例子。xyzyx是一个回文字符串,所谓回文字符串就是指正反读均为相同的字符序列。通过栈这个原创 2022-03-23 00:00:44 · 1497 阅读 · 0 评论 -
数据结构 队列
队列 解密QQ号,A向B询问QQ号,A并没有直接给B,A给了B一串加密过的数字,同时告诉了B解密规则。规则是:先将第1个元素删除,然后将第2个元素放到最后,再将第3个元素删除,然后将第4个元素放到最后…,直到剩下最后一个数,将最后一个数也删除。 OK,现在开始模拟一下规则,给出数字6 3 1 7 5 8 9 2 4这样9个数字,解密后应该是6 1 5 9 4 7 2 8 3。 开始模拟过程,刚开始是6 3 1 7 5 8 9 2 4,然后删除6,把3放到最后,1 7 5 8 9 2 4 3,然后原创 2022-03-21 23:54:03 · 845 阅读 · 0 评论 -
常用的快速排序
快速排序 之前的冒泡排序,解决了之前简化的桶排序的浪费空间的问题,但是在执行效率上牺牲了不少。假如我们的计算机每秒钟可以运行十亿次那么对一亿个数进行排序,桶排序就只需要0.1秒,而冒泡排序需要一千万秒,达到115天之久,这时间就有点吓人。那么有没有既不浪费内存空间又可以快速排序的算法呢?那就是快速排序了,光听名字就知道很快了。 假设我们现在要对 6 1 2 7 9 3 4 5 10 8这10个数进行排序。首先要在这个序列中找出一个基准数。为了方便就让第一个数6来做基准数,接下来就是将序列数中比基准数原创 2022-03-20 16:58:49 · 547 阅读 · 0 评论 -
冒泡排序法
冒泡排序 简化版的桶排序不仅仅有之前说过的遗留问题,更要命的是:它非常浪费空间,例如需要排序的范围是0~2100000000,那么你就必须要申请2100000001个变量,也就是说你要申请一个这样的数组 int a[2100000001]。因为我们需要使用2100000001个桶来存储这个范围里每一个数的出现的次数,即便我只给你5个数字或者1个数字,你还是需要申请一个这么大的数组来存储。这样就太浪费空间了。还有,如果现在需要排序的不再是一些整数,而是一些小数呢?如果要将这些小数进行排序那么要怎么办呢?下原创 2022-03-16 00:12:24 · 254 阅读 · 0 评论 -
最简单最快速的排序——桶排序
最简单最快速的排序 —— 桶排序 期末考试完了老师需要将同学们的分数按照高低进行从高到低的排序。班上只有5个同学,这个五个同学分别考了5分、3分、5分、2分和8分(满分10分),接下来就要对分数进行排序,排序后的顺序是8 5 5 3 2。有没有一种办法可以让随机读取5个数,然后按照5个数从大到小进行排序输出? 首先借助一个一维数组解决这个问题。 首先我们申请一个大小为11的数组int a[11]。然后现在已经就有了11个变量,编号为a[0] ~ a[10]。刚开始的时候,我们将a[0] ~ a[原创 2022-03-14 00:20:05 · 1441 阅读 · 1 评论