![](https://img-blog.csdnimg.cn/6c6cc98aed95425dac0f0e0732afb26d.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 92
记录线性表、二叉树、图、高阶搜索树等数据结构和查找与排序相关算法笔记
小白还在写代码
阿巴阿巴阿巴
展开
-
初探动态规划
最近备战蓝桥杯,刚好刷到了动态规划的专题。和之前的大部分算法不同,动态规划是一种极其巧妙的算法思想,没有固定的模板,十分多变,需要我们做到具体问题具体分析。然而网上大部分文章一上来就直接讨论动态规划的思想,并没有写出推导的过程。于是本文主要介绍及总结一些简单的动态规划的方法和模型、方便初次接触动态规划的小伙伴有所理解。动态规划(Dynamic Programming,以下简称DP)是一种用来解决最优值问题的一套方法论。与我们之前所接触到大多数算法不同,DP没有一套固定的模板,需要我们具体问题具体分析。原创 2022-11-10 17:12:07 · 540 阅读 · 1 评论 -
C/C++高精度运算(大整数运算)
众所周知,最大的整型long long的范围是【-9223372036854775808~9223372036854775807】,即使是无符号位的unsigned long long最大值也只是扩大一倍,那当题目需要用到或需要输出比long long类型的范围还要大的数字时,我们是不是就不能用常规办法去接收这些数字了。这个时候使用大整数就可以解决上述问题——也就是解决接收超出整型范围数字的问题。原创 2022-11-07 00:08:25 · 2576 阅读 · 1 评论 -
详细图解高阶搜索树B树及C语言实现
前言对于大量的数据而言,链表的线性访问时间太慢,不宜使用。本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行时间平均为O(logN)。在数据结构中树是非常有用的抽象概念,在本篇中我们将讨论一棵高阶搜索树——b树。前排提示:高阶搜索树的代码难度高出一个量级,建议先把逻辑理顺后再去看代码哦。...原创 2022-07-26 10:20:22 · 2028 阅读 · 4 评论 -
C语言实现二叉平衡树
前言对于大量的数据而言,链表的线性访问时间太慢,不宜使用。本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行时间平均为O(logN)。在数据结构中树是非常有用的抽象概念,在本篇中我们将讨论二叉平衡树,为后续高阶搜索树打下基础。如果代码有疑问的同学可以私信问我,一定要先把逻辑理顺!一定要先把逻辑理顺!一定要先把逻辑理顺!重要的话说三遍(;д;),不然后面的高阶搜索树会很吃亏的!...原创 2022-07-24 13:28:39 · 935 阅读 · 0 评论 -
二叉树、二叉树排序树的实现及遍历
对于大量的数据而言,链表的线性访问时间太慢,不宜使用。本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行时间平均为O(logN)。在数据结构中树是非常有用的抽象概念,在本篇中我们将讨论二叉树的存储结构、二叉树的遍历和二叉排序树的实现,为后续平衡树以及高阶搜索树打下基础。我们下次将详细讲解二叉平衡树的增删查改。...原创 2022-07-23 22:59:12 · 972 阅读 · 0 评论 -
【二叉树先导】树的概念和表示方法
对于大量的数据而言,链表的线性访问时间太慢,不宜使用。本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行时间平均为O(logN)。在数据结构中树是非常有用的抽象概念,在本篇中我们将讨论树的基本概念和表示方法,为后续二叉树及高阶搜索树打下基础。...原创 2022-07-23 12:32:56 · 537 阅读 · 0 评论 -
C语言实现优先队列、二叉堆和堆排序
查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题。在这个专栏中我们会学习六大查找和十大排序的算法与思想,而本篇将详细讲解其中的堆排序;...原创 2022-07-07 18:28:15 · 1168 阅读 · 0 评论 -
C语言实现归并排序、计数排序、桶排序、基数排序
查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题。在这个专栏中我们会学习六大查找和十大排序的算法与思想,而本篇将详细讲解其中的归并排序、计数排序、桶排序、基数排序;注意:本文中所有排序按照升序排序,降序只需要把逻辑反过来即可!...原创 2022-07-07 08:30:00 · 692 阅读 · 0 评论 -
C语言实现交换排序算法(冒泡排序、快速排序)
查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题。在这个专栏中我们会学习六大查找和十大排序的算法与思想,而本篇将详细讲解其中的交换排序——冒泡排序和快速排序;.........原创 2022-07-06 16:23:15 · 2494 阅读 · 0 评论 -
插入排序(直接、折半、二路、希尔)
查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题。在这个专栏中我们会学习六大查找和十大排序,而本篇将详细讲解其中的插入排序——直接插入排序、折半(二分)插入排序、2-路插入排序;注意:本文中所有排序按照升序排序,降序只需要把逻辑反过来即可!............原创 2022-07-06 11:40:13 · 639 阅读 · 1 评论 -
面试题旋转矩阵(两种方法分析及扩展)
面试题旋转矩阵的两种方法优劣分析及公式推广原创 2022-06-08 01:40:00 · 444 阅读 · 0 评论 -
三大经典查找(跳跃、插值、斐波那契)
查找和排序是数据结构与算法中不可或缺的一环,在这个专栏中我们会学习六大查找和十大排序,而本篇将详细讲解其中的三大经典查找——跳跃查找、斐波那契查找、插值查找原创 2022-07-05 11:43:23 · 641 阅读 · 0 评论 -
三大基础查找(顺序、二分、分块)
查找和排序是数据结构与算法中不可或缺的一环,是前辈们在算法道路上留下的重要且方便的一些技巧,学习这些经典的查找和排序也能让我们更好和更快的解决问题。在这个专栏中我们会学习六大查找和十大排序,而本篇将详细讲解其中的三大基础查找——顺序查找、折半(二分)查找、分块(索引)查找这些概念非常的简单,我们只需要快速的过一遍即可;顺序查找那是非常的简单,就是用 for循环遍历数据去判断就行了; 虽然顺序查找简单,但它是唯一 一 个可以针对于无序的数据进行查找;即使是顺序查找也是有优化的方法的,这里还可以提一句,我们针对原创 2022-07-04 18:37:28 · 1826 阅读 · 2 评论 -
怎样分析算法的复杂度
当我们在利用算法实现解决某一个问题时,如果这个算法是正确的,那么通常要去思考这个算法需要的时间和空间资源是多少的问题,如果一个算法需要的时间很长,那么这种算法实际上就很难有用处,同样的如果一个需要很大内存的算法在实际中也是不能使用的。一、什么是好的算法?这里我们要明确一点:好的算法 和 更优的算法 不能混为一谈;一个更优的算法消耗更少的时间、更少的空间,而我们作为初学者,应该更多的去考虑怎么写出一个好的算法,而所谓好的算法要满足这两个性质:不过事实上我们并没有那么多的数据量,并且用大量数据去测试是一个很烧钱原创 2022-07-04 16:46:09 · 1701 阅读 · 2 评论 -
关键路径:解决工程完成需要的时间问题
怎么理解关键路径中的“关键”的含义呢?这个“关键”是以工程结束为目标,举个例子吧,比如你在造火箭,众所周知火箭有很多的部件,而每个部件的制造的时间有块有慢,我们想要让火箭起飞,就肯定要等最慢的部件造完才能够组装,不然火箭一飞就爆炸了啊;所以在关键路径中,我们要找的是从源点到汇点,路径最长的路径;1、事件最早发生时间ETV,即顶点的最早发生时间:事件的最早发生时间一定是从源点开始计算;就比如以顶点V2为例:V2事件最早发生时间为6,表示在活动a1完成之后V2才可以开始;如果以V6为例,那么V6的事件最早发生时原创 2022-06-26 17:02:51 · 3460 阅读 · 10 评论 -
图解Topo拓扑排序
一、Topo排序不是排序首先我们要知道:topo排序并不是真的排序!topo排序是针对于有向无环图而言,搞出一个带有路径(前后)关系的一个序列,而这个序列就叫做topo序列;二、AOV网和Topo序列1.AOV网的概念在一个表示工程的有向图中顶点表示活动,而边表示活动之间的优先级关系,这种图就叫AOV网 (记住这个V表示顶点嘛),所以AOV网是针对于顶点的,而不是针对于边(在图中只有两种关系:针对于顶点和针对于边);2.Topo序列的概念和思想具有n个顶点的有向图,只要满足 Vi 到 Vj原创 2022-06-25 16:49:57 · 808 阅读 · 0 评论 -
手撕弗洛伊德(Floyd)寻找最短路径
一、Floyd概述Floyd为什么存在?回顾我在上篇文章(Dijkstra)里留了一个小问题:如果我想要知道任意两个节点之间的最短路径要怎么办呢?我们知道Dijkstra只是处理单源点的最短路径算法,也就是求从某一个节点到其他所有节点的最短路径,如果我们想要求出任意两个节点之间的最短路径,那我是不是要执行 N 次的 Dijkstra 算法?回顾一下在Dijkstra的实现中,是不是用到了长度为 N 的辅助向量和路径向量;那我要道任意两个节点之间的最短路径,是不是要维护 N * N 个大小的二维数辅助向量呢原创 2022-06-24 14:09:16 · 592 阅读 · 0 评论 -
图解迪杰斯特拉(Dijkstra)最短路径算法
【干货满满!】在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。而最短路径这个词不用过多解释,就是其字面意思:在图中,对于非带权无向图而言,从源点到终点边最少的路径(也就是BFS广度优先的方法);而对于带权图而言,从源点到终点权值之和最少的路径叫最短路径;最短路径应用:道路规划;我们最关心的就是去实现寻找最短路径,通过实现.原创 2022-06-22 22:34:16 · 73051 阅读 · 9 评论 -
最小生成树普里姆算法Prim
无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。根据上文..原创 2022-06-21 16:58:09 · 2627 阅读 · 1 评论 -
最小生成树之Kruskal克鲁斯卡尔算法
一、什么是最小生成树二、greedy algorithm贪婪算法和kruskal克鲁斯卡尔1.greedy algorithm贪婪算法2.kruskal克鲁斯卡尔3. 代码实现前言什么是生成树?什么又是最小生成树?对于一个连通图而言生成树是一个极小连通子图,之前我们说过,一个连通图的生成树可以有多个,如下图所示的连通图,就可以有三个生成树; 我们可以从上图中得出结论:①对于一个包含n个顶点的完全图有n个生成树;②而对于有n个顶点的连通图而言,生成树有n-1条边;继续观察上图,深入思考生成树中顶点和边....原创 2022-06-20 16:40:17 · 1267 阅读 · 1 评论 -
图的遍历、深度优先DFS、广度优先BFS
之前我们讲了用多种方法来实现图的存储,那么当图被创建出来后要怎么去遍历呢?我们知道像邻接矩阵之类的存储结构的核心是通过数组实现的,那么在遍历邻接矩阵的时候只需要用循环遍历数组一样遍历它就行了;对于像邻接表之类的存储结构的核心是使用链表实现的,那么在遍历的时候,我们可以用遍历链表一样的方法。但是这样在实际运用中会很麻烦,那么有没有一种不用区分图的存储结构,都能实现图的遍历的结构呢?解决这个问题之前,我们要清楚什么是图的遍历。简单而言就是从某一个顶点出发,按照某种搜索方式把图中顶点都访问一遍且仅访问一遍,这个过原创 2022-06-19 12:25:52 · 462 阅读 · 2 评论 -
【图的存储】邻接多重表
邻接多重表是无向图的一种存储结构。如果在无向图中我们的侧重点在顶点上,那么使用邻接表是很合适的,然而之前我们讨论过,当我们的侧重点在边上,也就是需要对边增删查改的时候,用邻接多重表就更加合适了...原创 2022-06-18 20:21:26 · 9909 阅读 · 10 评论 -
C语言数据结构、十字链表的分析及实现
结在上篇文章的最后,我们分析了邻接表的优劣,邻接表本身并没有什么大的缺陷,如果说有缺点,那么是对于有向图而言对同时表示一个顶点的出度和入度麻烦,因为需要有邻接表和逆邻接表同时表示,而且这种应用场景是存在的。十字链表就是为了使这个问题得到解决而出现的。所以十字链表就是一种将邻接表和逆邻接表结合在一起的一种图的存储结构,它针对的就是有向图中出度和入度一起使用的情况,并且大大节省了内存。十字链表是由数............原创 2022-06-16 16:25:49 · 4604 阅读 · 2 评论 -
邻接矩阵和邻接表
图的概述和存储结构(一)有一种说法是程序是由数据结构和算法组成的,这很能体现出数据结构在编码中的重要性。而代码优化的能力也是区别有基础的程序员和码农的重要标准,所以对于这一块的学习一定要稳重与细致,每一个章节都要实打实敲出能够实现该种结构的代码才算完成。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已)在此原创 2022-06-14 21:04:47 · 18471 阅读 · 5 评论