《数据结构与算法学习笔记》
文章平均质量分 52
昨夜西风凋碧树,独上高楼,望尽天涯路。(初级版)
衣带渐宽终不悔,为伊消得人憔悴。(中级版)
众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。(终极版)
代码骑士
学习、记录、进步、分享。(断剑重铸之日,骑士归来之时!)
展开
-
回 溯 法
一、(what?)二、(why?)三、(how?)四、典型例题分析:原创 2023-11-18 11:20:07 · 181 阅读 · 0 评论 -
动 态 规 划
1、(what?)2、(why?)3、(how?)原创 2023-11-18 11:18:58 · 157 阅读 · 0 评论 -
贪 心 算 法
一、贪心本质(what?)“一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全部最优的解决方案。”——《算法导论》贪心算法并不是从整体考虑问题的最优解,而是在局部寻找出最优解。所以贪心算法能得到很多问题的整...原创 2022-01-27 08:41:11 · 4549 阅读 · 2 评论 -
分 治 算 法
一、什么是分治(what?)分治,即分而治之。这是一种将大规模问题分解为若干个规模较小的相同子问题,进而求得最终结果的一种策略思想。二、为什么要分治(why? )当一个问题规模较大,且(1)原问题可分为若干个规模较小的子问题。(2)子问题相互独立。(3)子问题的解可以合并为原问题的解。这时使用分治算法能更好的解决问题。三、怎么使用分治(how?)分治的步骤一般如下:...原创 2022-03-25 21:59:58 · 3423 阅读 · 1 评论 -
数组存储结构-矩阵的转置算法
矩阵(包括稀疏矩阵)的转置,就是将矩阵中的所有元素的行标和列标进行互换。因为实现矩阵转置的前提是将矩阵存储起来,数据结构中提供了 3 种存储矩阵的结构,分别是三元组顺序表、行逻辑链接的顺序表和十字链表。如果采用前两种结构,矩阵的转置过程会涉及三元组表也跟着改变:不仅如此,如果矩阵的行数和列数不等,也需要将它们互换。前两步比较简单,关键在于最后一步的实现。下面先介绍较容易的一种。图 3 矩阵转置的第一个过程图 4 矩阵转置的第二个过程对比图 4 和图 2b) 可以看到,矩阵被成功地转置。...转载 2022-08-15 10:08:33 · 4271 阅读 · 0 评论 -
数据结构-静态链表创建
在上图中,从a[1]存储的数据元素1开始,通过存储的游标变量3,就可以在a[3]中找到元素1的直接后继元素2;同样,通过元素a[3]存储的游标变量5,可以在a[5]中找到元素2的直接后继元素3,这样的循环过程直到某元素的游标变量为0截止(因为a[0]默认不存储数据元素)。使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。.........原创 2022-08-02 16:37:42 · 939 阅读 · 0 评论 -
数据结构-链式队列及基本操作
链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素。此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。...原创 2022-08-08 16:04:26 · 1047 阅读 · 0 评论 -
数据结构-树存储结构
如果说线性存储结构(如顺序表、链表、栈、队列)是表示数据之间“一对一”的关系,那么树存储结构表示的就是数据之间“多对多”的关系。线性存储结构:图1图2树存储结构:图3树型存储结构类似于家族的族谱,各个结点之间也同样可能具有父子、兄弟、表兄弟的关系。本节中,要重点理解树的根结点和子树的定义,同时要会计算树中各个结点的度和层次,以及树的深度。原创 2022-08-22 20:55:53 · 296 阅读 · 0 评论 -
数据结构-单链表操作
注意步骤(2)(3)的顺序不能颠倒,否则会导致插入位置后的部分链表丢失。(2)将新结点的next指针指向插入位置后的结点。(3)将插入位置前的节点指针next指向新的结点。(2)手动释放掉结点,回收被结点占用的存储空间。插入位置一共分三种,分别是头部插入、中间插入和尾部插入。先找到目标位置再更改结点的数据域。(1)创建一个新的要插入的结点。(1)将结点从链表中摘下。...原创 2022-07-27 13:59:00 · 1251 阅读 · 0 评论 -
数据结构-判断单链表是否有环
该算法的实现思想需要借助一个论点,即在一个链表中,如果 2 个指针(假设为 H1 和 H2)都从表头开始遍历链表,其中 H1 每次移动 2 个节点的长度(H1 = H1->next->next),而 H2 每次移动 1 个节点的长度(H2 = H2->next),如果该链表为有环链表,则 H1、H2 最终必定会相等;1) 最直接的实现思想就是:从给定链表的第一个节点开始遍历,每遍历至一个节点,都将其和所有的前驱节点进行比对,如果为同一个节点,则表明当前链表中有环;有环链表并不一定就是循环链表。......转载 2022-08-07 07:19:58 · 538 阅读 · 0 评论 -
反转链表-头插反转法
1)思想是指在原有链表的基础上,依次将位于链表头部的节点摘下,然后采用从头部插入的方式生成一个新链表,则此链表即为原链表的反转版。一开始创建一个新的头结点,然后在创建一个temp指针。...原创 2022-07-30 15:20:18 · 1706 阅读 · 0 评论 -
数据结构-循环队列及基本操作
上一篇我们学习了什么是顺序队列和基本实现方法,但是顺序队列自身存在一个很大的bug,就是当我们把一个元素入队时,队尾的指针会向前移动,当元素出队时,队头指针也会向前移动,这样就造成了元素都持续向一个方向进入和输出,虽然符合队列的基本特性,但是很容易造成数据溢出。当我们入队、出队到最后一个空间时,明明前面还有四个空间可以使用,但是就是用不了,这就造成了内存空间的浪费,和“假溢出”,为了解决这个问题,我们可以使用循环队列的方法来解决。例如,我们在内存中开辟一块五个单位长度的数组作为队列的存储单元。...原创 2022-08-08 15:43:54 · 840 阅读 · 0 评论 -
数据结构-字符串详解
1、字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。2、对一些特殊的串进行的命名,比如说:空串:存储 0 个字符的串,例如 S = ""(双引号紧挨着);空格串:只包含空格字符的串,例如 S = " "(双引号包含 5 个空格);子串和主串:假设有两个串 a 和 b,如果 a 中可以找到几个连续字符组成的串与 b 完全相同,则称 a 是 b 的主串,b 是 a 的子串。注意:空格串和空串不同,空格串中含有字符,只是都是空格而已。...原创 2022-08-11 17:49:09 · 3865 阅读 · 0 评论 -
数组存储结构-矩阵的计算
例如:C12 = 6 是因为:A11*B12 + A12*B22 + A13*B32 + A14*B42,即 3*2 + 0*0 + 0*4 + 5*0 = 6 ,因为这是 A 的第 1 行和 B 的第 2 列的乘积和,所以结果放在 C 的第 1 行第 2 列的位置。下面介绍使用行逻辑链接的顺序表计算矩阵乘积的方法。所以,第 n 行的非0元素的位置范围是:大于或等于第 n 行第一个元素的位置, 小于第 n+1 行第一个元素的位置(如果是矩阵的最后一行, 小于矩阵中非 0 元素的个数 + 1)。...转载 2022-08-15 17:15:49 · 792 阅读 · 0 评论 -
数据结构-顺序队列及基本操作
与栈结构类似,队列也是对数据存取有着严格要求的线性存储结构。与栈不同的是,队列的两端都是可进行操作的,元素只能从队尾进入,队头取出。同时具有“先进先出”的存取特点。顺序队列,即用顺序表的方式的进行存储的队列结构。因此,只要使用顺序表按以上两个要求操作数据,即可实现顺序队列。由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。...原创 2022-08-08 15:21:52 · 1915 阅读 · 0 评论 -
数据结构-树的四种遍历方法
全站最好理解的树的4种遍历方法:数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)_正弦定理的博客-CSDN博客_数据结构后序遍历原创 2022-08-24 09:20:44 · 868 阅读 · 0 评论 -
数据结构-顺序表操作
3)进行插入操作时,要目标位置开始的元素依次向后移动,最后将目标位置腾出,把元素放入其中。①这里使用realloc()函数用来给动态数组额外申请更多的物理空间。(2)进行删除操作,从目标元素开始,将它后面的元素依次向前一个元素进行覆盖。size+1把顺序表的实际容量增加一个单位。(1)用查找函数找到目标位置,然后通过数组下标进行赋值。(1)从顺序表的第一个元素开始进行顺序查找。(1)判断删除元素的位置是否正确。(1)判断插入的位置是否合理。(2)给新插入的元素分配空间。......原创 2022-07-26 17:52:08 · 1438 阅读 · 0 评论 -
数据结构-二叉树四种遍历方法(代码)
例图:以下的几种遍历均以此图为基准。转载 2022-08-26 12:14:55 · 4009 阅读 · 0 评论 -
数据结构-数组存储结构
2、数组和其他线性存储结构不同,顺序表、链表、栈和队列存储的都是不可再分的数据元素(如数字 5、字符 'a' 等),而数组既可以用来存储不可再分的数据元素,也可以用来存储像顺序表、链表这样的数据结构。我们知道,顺序表的底层实现还是数组,因此等价于数组中继续存储数组。由此,我们可以得出这样一个结论,一维数组结构是线性表的基本表现形式,而 n 维数组可理解为是对线性存储结构的一种扩展。以此类推,n 维数组,指的是存储 n-1 维数组的一维数组。注意,无论数组的维数是多少,数组中的数据类型都必须一致。...原创 2022-08-14 09:33:25 · 1935 阅读 · 0 评论 -
数据结构-判断链表相交
在此基础上,我们可以这样优化第1种实现方案,以图2中的L1和L2为例,从L1尾部选取和L2链表等长度的一个子链表(也也就是图3中的temp子链表),同时遍历temp和L2链表,依次判断2个遍历节点是否相同,如果相同则表明L1和L2相交;分别遍历链表1和链表2,对于链表1中的每个节点,依次和链表2中的各节点进行比对,查看它们的存储地址是否相同,如果相同,则表明它们相交;反之,如果2个链表不相交,则这2个链表的最后一个节点必定不相同。.........转载 2022-08-01 11:27:16 · 796 阅读 · 0 评论 -
数据结构-双向链表创建
我们常见的单链表能很好的表示元素间“一对一”的关系,也能根据指针的走向找到某个元素的后继结点,但是对于一些特殊问题,比如需要大量查找到一个元素的前驱结点,单链表总是通过从头向后遍历的方式无疑使运行速度和效率大大降低,为此,我们将引出一个新的链表数据结构,也就是双链表。所以双链表做事更灵活效率更高,单链表显得就有些轴。当然,单链表也有自己的优势,那就是比双链表更加节省空间,因为它只占一个指针域。双链表,也称双向链表,顾名思义,它是具有两个方向的链表,不像单链表形式那么单一,相比单链表多了一个指针域。.....原创 2022-08-04 10:02:20 · 1129 阅读 · 0 评论 -
数据结构-双向链表操作
先创建好一个双向链表:代码: 结果: (1)加表头假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可:(2)加表中 (3)加表尾 2、双向链表删除节点 只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可3、双向链表查找节点双向链表同单链表一样,都仅有一个头指针。因此,双链表查找指定元素的实现同单链表类似,都是从表头依次遍历表中元素。4、双向链表修改节点通过遍历找到存储有该数据元素的结点,直接更改其数据域即可。完整代码:原创 2022-08-05 10:13:06 · 1238 阅读 · 0 评论 -
数组存储结构-顺序存储
数组是一种线性存储结构,对存储的数据通常只做插入和修改(数组的查找和删除的算法效率是极低的),因此数组结构的实现用的是顺序存储结构。顺序存储结构是一维的,数组是多维的。因此数组中的数据存储要制定行和列的先后顺序。通常,数组中数据的存储有两种方式:1、以列序为主(先列后行):按照行号从小到大的顺序,依次存储每一列的元素。示例:当二维数组 a[6][6] 按照列序为主的次序顺序存储时,数组在内存中的存储状态如图 1 所示2、以行序为主(先行后列):按照列号从小到大的顺序,依次存储每一行的元素。...转载 2022-08-14 10:01:23 · 5778 阅读 · 0 评论 -
数据结构-二叉树的存储结构
二叉树的顺序存储采用的存储结构是顺序表(数组)。但是只有完全二叉树才可以使用顺序表存储。如果想要存储普通二叉树,我们就要先将普通二叉树转换为完全二叉树。普通二叉树转完全二叉树的方法很简单,只需给二叉树额外添加一些节点,将其"拼凑"成完全二叉树即可。上图中,左侧是普通二叉树,右侧是转化后的完全(满)二叉树。解决了二叉树的转化问题,接下来学习如何顺序存储完全(满)二叉树。完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可。转载 2022-08-24 09:10:02 · 7079 阅读 · 0 评论 -
反转链表-递归反转法
(1)思想:和迭代反转法的思想恰好相反,递归反转法的实现思想是从链表的尾节点开始,依次向前遍历,遍历过程依次改变各节点的指向,即另其指向前一个节点。(2)实现(建议先看代码,再看图解,使理解更加深刻):开始递归: new_head经过三次函数递归的调用来到了链表的最后一个结点,因为new_head=head->next,所以head始终保持在new_head的前一个结点处。递归到最后一层时: 开始逐层出递归: 递归结束。最后的结果为: 代码片段:完整代码:输出结果:...原创 2022-07-30 11:20:23 · 2169 阅读 · 1 评论 -
数据结构-广义表
广义表又称列表,也是一种线性存储结构,通数组类似,广义表中即可存储不可再分的元素也能存储可在分元素。例如:数组中可以存储‘a’、3这样的字符或数字,也能存储数组,比如二维数组、三维数组,数组都是可在分成子元素的。广义表也是如此,但与数组不同的是,在广义表中存储的数据是既可以再分也可以不再分的,形如:{1,{1,2,3}}。如果创建一个二维数组来存储{1,{1,2,3}}。在存储上确实可以实现,但无疑会造成存储空间的浪费。广义表记作:其中,LS 代表广义表的名称,an 表示广义表存储的数据。...转载 2022-08-15 20:04:28 · 5180 阅读 · 1 评论 -
数据结构-顺序表存储
0)定义顺序表结构体类型的函数,返回值是顺序表的结构体。(3)定义空间大小为宏定义的长度。(2)初始化长度为0,即表为空。(1)为动态数组分配存储空间。(1)函数参数为顺序表结构体。(2)循环输出顺序表中的元素。(3)定义顺序表的空间大小。(1)定义一个动态数组。(2)定义顺序表的长度。3、输出顺序表中的元素。......原创 2022-07-25 20:09:48 · 350 阅读 · 0 评论 -
反转链表-迭代反转法
反转链表,又可以称为翻转或逆置链表,如图常用的实现方案有4种,这里分别将它们称为迭代反转法、递归反转法、就地逆置法和头插法。值得一提的是,递归反转法更适用于反转不带头节点的链表;其它3种方法既能反转不带头节点的链表,也能反转带头节点的链表。......原创 2022-07-30 09:52:19 · 925 阅读 · 0 评论 -
数据结构-顺序栈及基本操作
顺序栈的存储结构是顺序表,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,且进栈出栈都在表的同一侧。原创 2022-08-08 10:20:45 · 659 阅读 · 0 评论 -
数据结构-单链表存储
包括数据域和指针域charelem;//数据域//指针域,用来连接后继元素}link;//link为节点名,每个结点都是一个link结构体。原创 2022-07-27 10:12:36 · 2189 阅读 · 0 评论 -
数组存储结构-矩阵的压缩存储
数据结构中,提供针对某些特殊矩阵的压缩存储结构。本节主要介绍三种特殊矩阵,以及对稀疏矩阵压缩存储的三种具体实现方法:1、三元组顺序表2、行逻辑链接的顺序表3、十字链表。转载 2022-08-14 18:56:05 · 1987 阅读 · 1 评论 -
树存储结构-二叉树
(1)是有序树(任意结点的子结点之间存在某种规律);(2)每个结点度不为2(最多只能有两个分支)。原创 2022-08-24 08:12:25 · 251 阅读 · 0 评论 -
数据结构-双向循环链表
通过向 main 函数中调用 initLine 函数,就可以成功创建一个存储有。当问题中涉及到需要 "循环往复" 地遍历表中数据时,就需要使用双向循环链表。单链表通过首尾连接可以构成单向循环链表。数据的双向循环链表,双向链表进行首尾连接。...转载 2022-08-05 10:20:06 · 237 阅读 · 0 评论 -
反转链表-就地逆置法
1)思想就地逆置法和头插法的实现思想类似,唯一的区别在于,头插法是通过建立一个新链表实现的,而就地逆置法则是直接对原链表做修改,从而实现将原链表反转。(2)实现在原链表的基础上做修改,需要额外借助2个指针(假设分别为beg和end)。...原创 2022-07-30 18:06:49 · 1395 阅读 · 0 评论 -
数据结构-链栈及基本操作
链栈的存储结构是链表。我们通常将链表的头部作为栈顶,尾部作为栈底。这样可以在出栈入栈时节省大量遍历的时间。原创 2022-08-08 12:12:55 · 875 阅读 · 0 评论 -
数据结构-静态链表操作
代码】数据结构-静态链表操作。原创 2022-08-02 16:50:36 · 378 阅读 · 0 评论 -
数据结构学习笔记(C++):线性表顺序存储结构
本程序主要体现了线性表的顺序存储结构,主要实现了以下几个功能://1、W:给线性表赋值//2、D:删除按位置//3、C:按值删除//4、I:插入//5、S:按位查找//6、G:按元素查找//7、L:数组长度//8、P:打印输出//9、E:判空//10、Q:结束//11、R:排序下面是代码,如有不足的地方还请各位大佬多多指正//数据结构学习笔记(C++):线性表顺序存储结构#include<iostream>#define MAXSIZE 100//定义...原创 2021-10-01 15:51:45 · 438 阅读 · 0 评论 -
数据结构学习笔记(C++):线性表的链式存储(单链表)
本程序主要体现了线性表的链式存储结构,主要实现了以下几个功能: //构造函数--定义头结点,链表长度为0 //析构函数--释放所有结点空间 //构造函数(含参)--W把数组和n值传入给链表 //获取链表的长度--L //按位查找,第i个元素--G(i) //按值查找,返回位--C(x) //插入操作--I(i,x)...原创 2021-10-02 02:12:53 · 445 阅读 · 0 评论 -
数据结构学习笔记(C++):栈的顺序存储结构
本程序主要体现了线性表的链式存储结构,主要实现了以下几个功能://压栈//出栈//取栈顶//判断栈是否为空下面是代码,如有不足的地方还请各位大佬多多指正://数据结构学习笔记(C++):栈的顺序存储结构 #include<iostream>#define MAXSIZE 10 using namespace std;class seqStack{public: seqStack();//构造函数 ~seqStack();//析构函数public: v原创 2021-10-02 15:45:30 · 449 阅读 · 0 评论 -
数据结构学习笔记(C++):栈的链式存储结构
本程序主要体现了线性表的链式存储结构,主要实现了以下几个功能://压栈//出栈//取栈顶//判断栈是否为空下面是代码,如有不足的地方还请各位大佬多多指正://数据结构学习笔记(C++):栈的链式存储结构 #include<iostream>using namespace std;class linkStack{ public: struct Node { int data; Node *next; }; public: linkStack原创 2021-10-02 16:27:34 · 438 阅读 · 0 评论