
数据结构与算法
文章平均质量分 88
无证的攻城狮
从事系统集成、运维相关工作十多年,是一个纯纯的技术宅。
展开
-
C++算法:多源最短路径(Floyd)
前文单源最短路径Dijkstra中我们讨论了如何解决有向无环图的最短路径问题,Dijkstra只能解决一个起始点的问题,如果要解决每个顶点到任一顶点的最短路径呢?一个方法就是再循环一次,以每个顶点作为起点就可以了嘛,虽然不可避免的会有部分重复工作,但确实能解决,就是代码更复杂了。有没有一个优雅点的办法呢?今天要介绍的算法Floyd(弗洛伊德,好熟悉的名字~)就是一个优雅的解决办法。它与用Dijkstra循环每个顶点的时间复杂度差不多O(n3),但是代码极简。原创 2023-06-20 19:03:21 · 3328 阅读 · 1 评论 -
C++算法:单源最短路径Dijkstra
如果你有一份北京地图,想从中关村走到三元桥,那么怎样能找出实现这一目的的最短路径呢?一种可能的方法就是将这两点之间所有的路线都找出来,然后求出每条路线的距离,找出最短的路线。但是仔细想想我们就会发现这种办法几乎是不可行的,因为这样的路线太多了,而且有些路线是完全不值得考虑的,比如你从中关村到昌平再到三元桥。那这样的问题有没有更科学的解决办法呢?答案是肯定的。原创 2023-06-17 23:55:03 · 4069 阅读 · 0 评论 -
C++算法:加权连通图的最小生成树(Prim)
在前文加权连通图的最小生成树(Kruskal)中已经用以边找点的方式实现最小生成树的生成。Prim算法也是一种常用的最小生成树算法,和Kruskal不同,Prim算法是以顶点找边实现的。原创 2023-06-16 23:37:32 · 2079 阅读 · 0 评论 -
C++算法:加权连通图的最小生成树(Kruskal)
最小生成树算法就是在众多可行的方案中选择代价最小的方法。生活中我们经常会遇到类似可以抽象成最小生成树的例子:比如你要给家中布电线,我们将每个用电器看作是顶点,那你可以从总闸布设到每一电器的电线,也可以从就近点接线。假设我们用从就近点接线,那就存在如何布线更节约的问题。这就是最小生成树可以解决的问题。用数学话来说,存在一个有n个顶点的带权连通图G。如果存在一个包含了G中所有顶点以及部分边的子图G,且子图G的各边权值和最小,并且还不形成回路。那么我们就可以称子图G是图G的最小生成树。原创 2023-06-14 18:34:11 · 1447 阅读 · 0 评论 -
C++算法:有向无环图拓扑排序(领接链表)
前文有向无环图实现游戏技能树中我们使用了矩阵存储图的关系,可以称之为邻接矩阵。显然,链表也是可以实现的。在图结构入门一文中,我们也提到了链表存储的原理。本文我们就以链表形式来完成这一结构,并进行拓扑排序。原创 2023-06-09 13:37:24 · 1344 阅读 · 0 评论 -
C++算法:有向无环图实现游戏技能树
前面文章图结构入门提到了图结构的两种存储方式,但没有代码演示。这篇就用一个简单示例来学习一下有向无环图的具体应用,图的应用比较广泛,本文就简单实现一个游戏的技能树。别看游戏技能树叫树,实际上它多半是用有向图实现,类似科技树也一样。说明白了它也很简单,就是一个拓扑排序问题。原创 2023-06-08 16:41:07 · 1268 阅读 · 0 评论 -
C++算法:排序之二(归并、希尔、选择排序)
此外,归并排序多用于需要外部排序的场景,比如磁盘文件的情况下比快排好,因为快排很依赖数据的随机存取,而归并是顺序存取,对磁盘这种外存比较友好。希尔排序是一种基于插入排序的算法,它比插入排序和选择排序要快得多,并且数组越大,优势越大。排序的时间复杂度会比O(n^2)好,但没有快速排序算法快O(n(logn)),在中等大小规模数组表现良好,总之不怎么常用。归并排序也是一种遵循分治算法思想的排序方法,它将一个大数组分成两个小数组,对每个小数组进行排序,然后将两个已排序的小数组合并成一个有序的大数组。原创 2023-06-05 15:54:55 · 663 阅读 · 0 评论 -
C++算法:排序之一(插入、冒泡、快速排序)
排序算法很多,一直有十大经典的说法。实际工作中除了个别有争议的排序算法,各有各擅长的领域,不能因为选择排序又慢又简单就小看它,有时候还真是非它不可。也不能因为桶排序、计数排序是理论上时间复杂度最小的就觉得能包圆所有排序工作。原创 2023-06-04 23:56:15 · 593 阅读 · 0 评论 -
C++算法:了解算法的复杂度
有计算机科学家说过“程序=数据结构+算法”,前面学习了基本的数据结构和树形、图结构,那么就可以开始算法学习了。算法是一个程序员必须掌握的指导工具,算法可以认为是解决问题的具体方法步骤。那么怎么描述一个算法的优劣就成了最先要了解的事了。原创 2023-06-03 20:35:17 · 1157 阅读 · 0 评论 -
C++数据结构:图结构入门
前面系列文章介绍了线性结构和树形结构,线性结构的前驱与后续非常清晰,很明确的一对一的关系。树形结构是层次分明的结构,同时树形结构的父节点可以有一个或多个(二叉树为两个)子节点,叶子节点没有子节点,这是一种一对多的关系。而图结构更加复杂,是多对多的关系,这种结构在现实生活中应用很广泛,比如公交线路图,计算机的网络结构等等。原创 2023-06-02 19:48:05 · 640 阅读 · 0 评论 -
C++数据结构:二叉树之三(二叉搜索树扩展)
我们接着写二叉树,在前文链接:《二叉树之二》中,我们生成了如下的有序二叉树,并且实现了插入、删除和四种遍历方法。今天我们继续实现一些二叉树的常用操作。如上图所示本文介绍了关于有序二叉树的一些有用的扩展方法,比如搜索前驱后续节点可以用于查找树中小于且最接近某个值的节点,或大于且最接近的。熟练掌握这些方法,有助于后面更复杂的二叉树的学习。当然还有一些诸如将一棵二叉树插入为另一棵树的子树、求左子树或右子树的高度等文中未写的方法也值得掌握。原创 2023-06-01 13:33:12 · 786 阅读 · 0 评论 -
C++数据结构:二叉树之二(二叉搜索树)
前文已经讲了二叉树概念,并搞出一个数组存储的没写具体实用意义的二叉树,这篇文章将讲解二叉树的另一种存储方式:链式存储,它和链表的存储方式有点像,这也是前面用了很多篇幅写链表的原因,实现了链表再来看本文会容易很多。因为光写链式存储水一篇文章也太没意义了,所以本文将实现一个链式存储基本有序的二叉搜索树,并实现四种遍历方式,它在排序搜索方面有一定的实用意义。原创 2023-05-31 16:47:33 · 758 阅读 · 0 评论 -
C++数据结构:栈和队列的应用
C++ 是一种面向对象的编程语言,它提供了多种数据结构,前面文章已介绍过数组、链表、hash表,并用自己的方法实现。用于存储和操作数据的结构在STL中还有很多,其中两种常用的数据结构是栈和队列。本文将介绍栈和队列的概念,特点,实现方式和应用场景。原创 2023-05-29 10:39:31 · 2274 阅读 · 0 评论 -
C++数据结构:散列表简单实现(hash表)
散列表是一种常用的数据结构,它可以快速地存储和查找数据。散列表的基本思想是,将数据的关键字映射到一个有限的地址空间中,然后在该地址空间中存储数据。这样,当需要查找某个数据时,只需要计算其关键字的映射地址,然后在该地址处访问数据,从而实现高效的查找操作。原创 2023-05-28 17:30:50 · 2032 阅读 · 0 评论 -
C++数据结构:Python风格双向链表Pylist的实现
线性顺序表(链表)已经完成了单向链表基本的插入、取值、删除等操作,本文将在前文的基础上更进一步完善其功能。参照Python的 List 列表的函数常用功能来实现。如+运算直接将两个列表合并,[] 运算赋值、取值。笔者是很喜欢python中列表这种骚操作的,本文就在C++中实现它。当然基本的C++语法规则笔者是没法改变的。赋值得用{},类型还是要声明的,泛型自然是可以的,但你也别想着在一个列表中同时塞入 string 和 int。原创 2023-05-27 17:37:57 · 1428 阅读 · 0 评论 -
C++数据结构:线性顺序表(数组)
将一个线性表存储到计算机中,把线性表的结点按逻辑顺序依次存放到一组地址连续的存储单元里,用这种方法存储的线性表称为顺序表。C++中数组、vector、list就是典型的顺序表,其中list是以链表实现的,本文主要以仿写一个数组实现的顺序表,进而更深入了解顺序表。原创 2023-05-25 01:43:08 · 1496 阅读 · 0 评论 -
C++详解NOI题:[NOIP2021] 报数
受不了优快云每日一练的在线竞赛系统了,bug多就算了,勉强能用,可那些题目的神描述,到处是错。所以找点别的题来玩,看到一道NOI的题挺有意思,就试着解解。原创 2023-05-23 01:03:01 · 1056 阅读 · 0 评论 -
C++每日一练:饿龙咆哮-逃离城堡(避坑指南)&非负整数求和
饿龙这一题要说难度嘛,还真是挺简单的,但要满分也是有坑的!本文就记录了笔者解题过程,希望能对读者使用C++编程有所启发。至于非负整数求和代码是挺长的,难度也不算高吧。原创 2023-05-20 14:53:34 · 791 阅读 · 0 评论 -
C++每日一练:贝博士的机械零件(补全题目)&奇偶排序(巧妙快排)&寻因找祖
今天的题目中寻因找祖最难了,明显的数学题,笔者这数学文盲水平肯定不会,用暴力搞了一波,只有50%。就去考察学习了一下,记录学习过程以备复习。贝博士的机械零件在笔者这里题目都不显示,费了点劲把题目补全了。给有需要的童鞋参考一下。奇偶排序遇到很多次了,这回突发奇想,用了快排思想优雅地解了一把,总算可以稍稍找回点不会数学的自信。原创 2023-05-19 19:50:16 · 599 阅读 · 0 评论 -
C++每日一练:难题-大数加法
这题好像是指定了C++,那就用C++来做嘛,确实在C/C++中一不小心就超出范围了,说实在的,C++这个语言有时候真的很让人无语。很显然这是要用字符串来计算了。这题坑比较多,笔者这也是折腾了好一会儿才搞定。原创 2023-05-15 22:28:49 · 462 阅读 · 0 评论 -
Python每日一练:蚂蚁家族(详解集合法)
这题挺有意思,感觉评简单难度有点低了,如果正经用无向图来做,代码还是有点长的。首先得建立节点,估计除第一个和最后一个每个节点都是一条线连进,一条线连出的。就可以这样设计节点,然后生成树,最后深度搜索。原创 2023-05-11 11:22:02 · 918 阅读 · 0 评论 -
Python每日一练:小艺读书&醉酒的狱卒&非降序数组(详解快排)
今天这个非降序数组,阅读解理小学水平,说起来都是泪啊。我折腾了一天都没搞定,从冒泡写到快速排序。换了几种都还不行,我又给快排加上插入排序。结果还是不能全过!我以为题目有问题,我就用了sort测试,还真能过的!原创 2023-05-09 21:16:46 · 632 阅读 · 0 评论 -
Python每日一练:小艺的口红(暴力、二分、图论三种方法)&代写匿名信
很明显小艺的口红问题是考的是查找算法,对于这种一次性查找,直接暴力就行了,当然咱是为了学习,所以用来练练各种查找,基础是二分查找法!其它方法大多基于二分查找改进的。更高级的二叉排序树查找,B树、B+树啥的,也统统都得排序。这里用暴力法、二分法、二叉排序树这三种有代表性的方法来解。原创 2023-05-08 16:56:12 · 710 阅读 · 0 评论 -
C++每日一练:买苹果(两种解法)
这种解法肯定不是作者出题的原意,从题目来看:这肯定是为了练习动态规划用的!我这直接上了数学家的方法哈~ 最后也给出个打表方案。这里要把6循环放后面,因为放后面的先循环,后面8的循环自然会覆盖同index值的项,显然8的方案比6用的袋少。原创 2023-04-18 16:40:05 · 1000 阅读 · 0 评论 -
python每日一练:硬币划分(多方法详解)
这题挺有意思的,典型的背包组合问题,虽然没有要求各种组合方式,不过我们可以试试给出组合方式。当然这题不太可能用一行代码解决了…来看一行超人的可别失望了~ 本文满满的干货!写了两天呢!希望本博文能对各位看官理解递归和动态规划有点帮助。原创 2023-05-06 22:34:49 · 1536 阅读 · 0 评论 -
Python每日一练:最长递增区间&狄杰斯特拉(80分)&K树(0分)
很显然,Python的受众远远大于C++,其实笔者本人对Python的理解也是远强于C++的,C++纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行假装的。因职业原因,Python更适用于运维、网络、AI方向,所以用得很多。最近假装职业码农装过头了,写点Python代码都习惯性加;了,更离谱的是优快云对笔者的能力判断中,C++一个劲地涨,Python都连能力都没了…所以以后也要用Python来解解题,经常锻炼一下。原创 2023-05-03 18:07:01 · 757 阅读 · 0 评论 -
C++每日一练:打家劫室(详解动态规划法)
这题目出得很有意思哈,打劫也是很有技术含量滴!不会点算法打劫这么粗暴的工作都干不好。原创 2023-05-01 00:48:59 · 964 阅读 · 0 评论 -
C++每日一练:小艺照镜子(详解分治法)
大过节的,不想去看人后脑勺,就做点题来玩。挑了小艺照镜子,百分通过~ 把一个较复杂的问题,分解成若干个较简单的问题,这应该也算是分治法了吧~ 分而治之嘛!原创 2023-04-30 22:01:54 · 1392 阅读 · 0 评论 -
数据结构与算法(小议递归二)
前面说到了递归在裴波那契数列计算中并不怎么适用,那么它适合什么样的场景呢?我们继续举例和python3对比测试来说明。原创 2023-04-29 14:46:38 · 780 阅读 · 0 评论 -
数据结构与算法(小议递归)
递归是一种常用的算法设计,递归就是一种循环推理。简单来说就是调用原算法本身的算法。这里主要探讨递归的使用原创 2023-04-28 23:58:54 · 721 阅读 · 0 评论