![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 69
算法
加拿大侠
《码农翻身》的爱好者
展开
-
顺序表的线性表示
想象一下,你有一串珍珠项链,每颗珍珠代表一个数据元素,珍珠一颗接一颗地连在一起,这就是线性表。如果这些珍珠都放在同一个盒子里,而且盒子里的珍珠是按照一定的顺序排列的,那么这个盒子就是顺序表。查找操作:就像在项链上找一颗特定的珍珠,如果珍珠就在你手边,那很快;挤一挤:如果你想在项链中间加一颗珍珠,可能就得把后面的珍珠都往后挪一挪,这就比较麻烦了。最坏情况:查找的元素在表尾或不存在,需要比较n次,时间复杂度为O(n)。即使盒子可以变大,珍珠的排列方式还是一样的,找珍珠的速度还是很快。原创 2024-06-21 17:23:51 · 278 阅读 · 0 评论 -
矩阵的压缩存储
想象一下,数组就像一排排的座位,每个座位上都有一个编号,这样你就知道每个座位在哪里。如果你有两层或者更多层的座位,比如电影院里的座位,你可以先按行来排,也可以按列来排。这就是多维数组的存储方式。但是,如果你把座位压缩存储了,你就不能随便挑一个座位来看有没有人坐,这就像是失去了随机存取的能力。稀疏矩阵:就像一个很大的电影院,但是只有零星几个人坐着,大部分座位都是空的。对称矩阵:就像镜子里的反射,左边的和右边的座位是一模一样的。三角矩阵:只有下面或者上面的座位有人,中间的座位都是空的。原创 2024-06-21 17:23:38 · 207 阅读 · 0 评论 -
二叉树的遍历和线索二叉树
操作过程是先将根节点入队,然后出队并访问,接着如果有左子树,则将左子树的根节点入队,如果有右子树,则将右子树的根节点入队,如此反复,直到队列为空。线索二叉树是一种特殊的二叉树,它通过将二叉树中的空指针(原本指向空的左右孩子节点)改为指向前驱或后继的线索,从而将二叉树的节点排列成一个线性序列。中序线索二叉树的构造:在摘苹果的过程中,如果一个苹果左边没有苹果(空的),你就把它的左边箭头指向前一个摘的苹果;先序遍历:就像你先摘中间最大的苹果,再去摘左边的苹果,最后摘右边的苹果。这样摘的顺序就是后序遍历的顺序。原创 2024-06-21 17:23:20 · 434 阅读 · 0 评论 -
树和森林存储
通过特定的画法转换,包括在兄弟结点间加连线,保留与第一个孩子的连线,其他连线抹去,并进行45度旋转。这样,我们很快就能找到孩子的爸爸,但是要找孩子的兄弟姐妹,就得一个个问过去。二叉树转换为森林:断开根的右链,将右子树视为森林转换后的二叉树,重复此过程直到只剩一棵没有右子树的二叉树,再转换为树。中序遍历森林:就像先去森林里的第一棵树的小树,然后是第一棵树,再去下一棵树。先序遍历森林:就像先去森林里的第一棵树,然后是它的小树,再去下一棵树。先序遍历森林:先访问第一棵树的根,再遍历其子树森林,然后遍历剩余森林。原创 2024-06-19 01:36:15 · 370 阅读 · 0 评论 -
树和二叉树的应用
基本概念:哈夫曼编码是一种可变长度的编码方式,它根据字符出现的频率来分配编码,频率高的字符使用较短的编码,频率低的字符使用较长的编码,以此来减少数据的平均编码长度,实现数据压缩。RL平衡旋转(先右后左双旋转):当一个节点的右孩子的左子树上插入新节点,导致该节点的平衡因子从-1减至-2,需要进行两次旋转操作,先右旋转后左旋转。LR平衡旋转(先左后右双旋转):当一个节点的左孩子的右子树上插入新节点,导致该节点的平衡因子从1增至2,需要进行两次旋转操作,先左旋转后右旋转。这里的“权”通常是指数据元素出现的频率。原创 2024-06-19 01:36:04 · 736 阅读 · 0 评论 -
图的存储方法
这个方法的好处是,如果你的朋友不多(也就是图里的点不多),那么这个方法就比较省空间。想象一下,每个箭头(也就是图里的边)都有一个自己的小卡片,上面写着它从哪里来,到哪里去。同时,每个点也有自己的卡片,上面写着所有从它这里出发或者指向它的箭头。在无向图里,边是双向的,所以这个方法会给每条边两个记录,一个从这个点出发,一个指向这个点。选择哪种存储方法取决于图的特定需求,如边的稠密程度、操作的频率等。边结构包含标志域、两个顶点的位置、指向下一条依附于相同顶点的边的指针,以及相关信息的指针。原创 2024-06-19 01:35:35 · 323 阅读 · 0 评论 -
【串】字符串搜索算法
KMP算法是一种改进的字符串搜索算法,它通过预处理模式串来创建一个部分匹配表( next 数组),这个表用于在字符不匹配时确定模式串应该回溯到哪个位置,而不是简单地将模式串的指针重置为1。这样,当你在书里找的时候,如果发现当前的字和那段文字不匹配,你就不用从头开始,而是根据你之前记下来的信息,知道应该从那段文字的哪个位置开始重新比对。如果你手指指的那一行和那段文字的第一个字一样,你就继续往下看下一个字,如果还一样,就继续比对,直到所有的字都对上了,你就找到了这段文字。原创 2024-06-19 01:35:19 · 381 阅读 · 0 评论 -
图论的概念
其中 V(G) 是图 G 中顶点的有限非空集合,E(G) 是图 G 中顶点之间的关系(边)的集合。如果图 G' = (V', E') 的顶点集合 V' 是图 G = (V, E) 的顶点集合 V 的子集,并且边集合 E' 是 E 的子集,则 G' 是 G 的子图。如果图不是连通的,那每个连通分量的生成树组成了生成森林。子图:如果一个大图里面有一个小区域,这个区域的节点和边都是大图的一部分,那这个小区域就是大图的子图。边的权和网:边的权就像是边上的一个标签,表示这条边的某种重要性或成本,带有权的图称为网。原创 2024-06-19 01:34:38 · 246 阅读 · 0 评论 -
图的遍历。
如果图是连通的,就像城市里的路都是通的,你可以从任何地方出发,最后走到所有地方。BFS就像你在城市里逛街,先从一家店开始,然后去旁边的几家店,再去这些店旁边的店,一层一层往外扩,直到所有的店都逛过。DFS就像是你在探险,找到一个洞口就往里钻,直到钻到头了,然后退回来,换个洞口继续钻,直到所有的洞都钻过。当不能继续访问时,回退到最近访问的顶点,如果还有未访问的邻接顶点,继续搜索。基于邻接矩阵的遍历得到的DFS序列是唯一的,而基于邻接表的遍历序列不唯一。如果无向图是连通的,从任一顶点出发可以访问所有顶点。原创 2024-06-19 01:34:21 · 339 阅读 · 0 评论 -
图的应用。
Kruskal算法:这个算法像是一个拍卖会,所有的线(边)都按它们的长度(权值)来排序,然后你一条一条地看,如果这条线连接的两个点之前没有被连起来过,你就买下它,直到所有的点都被连起来。Dijkstra算法:这个算法就像是你在规划一次旅行,你从一个点出发,然后看看哪个邻近的点离你最近,你就先去那里,然后再从那里出发,继续找下一个最近的点,直到你到达目的地。Prim算法:就像你在玩一个游戏,开始时你站在一个点上,然后你看看周围哪个点离你最近,你就走过去,然后继续找下一个最近的点,直到所有点都被你走到过。原创 2024-06-19 01:34:07 · 329 阅读 · 0 评论 -
查找的基本概念
其中,n 是查找表的长度,P_i 是查找第 i 个数据元素的概率(通常假设每个数据元素的查找概率相等,即 P = 1/n),C_i 是找到第 i 个数据元素所需进行的比较次数。平均查找长度:衡量查找算法效率的主要指标之一,它是所有查找过程中进行关键字比较次数的平均值。查找:就像你在一堆书里找一本特定的书一样,查找就是在你的数据堆里找到你想找的那个数据。它可以是数组、链表、树等数据结构。查找表:这就像是你书架上所有的书,你用它来找到你想要的那本书。静态查找表:查找操作后不会对查找表进行任何修改的查找表。原创 2024-06-19 01:33:53 · 269 阅读 · 0 评论 -
顺序查找,折半查找,分块查找
如果不是,你再猜“张三”是在前一半还是后一半,然后再找那一半的中间文件,如此反复,直到找到或者确定没有。基本思想:假设表是按关键字排序的,查找时如果发现当前元素的关键字小于待查找关键字,且下一个元素的关键字大于待查找关键字,则可以提前结束查找,因为后续元素的关键字都会更大。建立索引表,索引表中的元素包含各块的最大关键字和块内第一个元素的地址,索引表本身也是有序的。基本思想:通过比较中间元素与给定值,将查找范围缩小一半,然后继续在相应的半区进行查找,直到找到元素或确定元素不存在。原创 2024-06-19 01:33:41 · 318 阅读 · 0 评论 -
B树和B+树
B+树结点的关键字数范围是[1, m](根结点)和[\lceil \frac{m}{2} \rceil, m-1](非根内部结点),B树则是[1, m-1](根结点)和[\lceil \frac{m}{2} \rceil, m-1](非根内部结点)。想象一下,B树就像一个图书馆里的书架,书架的每一层都可以放很多书(但有上限),每本书都有个书名(关键字),书架的每一层都按照书名的字母顺序排列。B+树的叶结点包含所有关键字,非叶结点仅作为索引,而B树的叶结点关键字不重复。原创 2024-06-19 01:33:22 · 822 阅读 · 0 评论 -
散列表是什么
散列表里有一个“神奇公式”,这个公式可以把人的名字(关键字)转换成一个特定的位置(地址),这样你就能直接找到这个人的电话号码。检测地址为 Addr 的位置上是否有记录,若无记录则查找失败,若有记录则比较它与 key 的值,若相等则查找成功,否则计算下一个散列地址并继续查找。直接定址法:就像你直接用人的名字的笔画数来找电话号码,简单直接,但如果名字笔画数分布不均匀,有些位置就会空着,浪费空间。散列表就像是一个超市的储物柜,每个格子都有一个编号,顾客(数据)可以通过自己的密码(键值)来找到对应的储物柜格子。原创 2024-06-19 01:33:08 · 257 阅读 · 0 评论 -
归并排序和基数排序
如果你要排序的东西很大,比如大文件或者大图片,那么用链表来存储这些东西会比较好,因为链表在移动东西的时候不需要把整个东西都搬来搬去,只需要改改链接就可以了。快速排序:这个算法很聪明,它先随便拿一个东西,然后把比它小的都放到左边,比它大的都放到右边,然后再对左右两边分别这么做,很快就能排好序。堆排序:这个算法是把东西堆成一个特殊的堆,然后再一点点地把堆顶的东西拿出来,放到堆的末尾,同时保持堆的特性。简单选择排序:就像你在一堆东西里找最大的,拿出来,再找剩下的最大的,再拿出来,直到全部拿出来。原创 2024-06-19 01:32:51 · 388 阅读 · 0 评论 -
外部排序是什么
在归并树中,记录数较少的初始归并段应尽早归并,记录数较多的初始归并段应尽可能晚归并,从而建立总I/O次数最少的最佳归并树。这里用到了一个叫做哈夫曼树的聪明点子。就是说,先把那些卡片少的堆早点合并,卡片多的堆晚点合并,这样整体上合并的次数就会少,也就是I/O操作次数会减少。在归并过程中,k个叶结点存放k个归并段当前参与比较的记录,内部结点用来记忆左右子树中的“失败者”,胜者继续向上比较,直到根结点。优化就像是你整理书架的时候,想办法让每次拿的书堆更大一些,或者让合并书堆的次数更少一些,这样整理的速度就快了。原创 2024-06-19 01:32:38 · 325 阅读 · 0 评论 -
二叉树的概念
二叉树:是由n个结点构成的有限集合,可以为空,或者由一个根结点和两个互不相交的子树组成,这两个子树分别称为左子树和右子树。完全二叉树:高度为h,有n个结点的二叉树,其每个结点都与高度为h的满二叉树中编号为1至n的结点一一对应。这种树的特点是,左边的娃的“关键字”(可以理解为名字或者编号)都比爹小,右边的娃都比爹大。按层序编号后,如果某个结点为叶子结点或只有左孩子,则所有编号大于该结点的结点都是叶子结点。满二叉树:高度为h的二叉树,含有2^h - 1个结点,每个结点都有两个孩子。原创 2024-06-18 10:36:18 · 243 阅读 · 0 评论 -
树的概念描述
结点的层次和深度:就像你数楼层一样,从最上面的家长开始数,家长是第一层,下面的每一层就是层次;树是什么:想象一下,树就像一个家庭树,有一个最顶端的“家长”(根结点),然后下面有孩子,孩子们下面还有孩子,这样一层一层地排下去。有序树和无序树:如果家里的成员站队时,谁站前面谁站后面是有规定的,那就是有序树;结点:就是家里的成员,除了家长,每个成员都有一个直接的“上一代”(双亲)。双亲和孩子:在路径上最接近结点K的结点E是K的双亲,K是E的孩子。有序树和无序树:子树从左到右有次序的为有序树,无次序的为无序树。原创 2024-06-18 10:36:08 · 239 阅读 · 0 评论 -
串的模式匹配算法
这种方法的缺点是,有时候你可能已经看了一半,但发现不一样,还得翻回去重新开始,这就比较浪费时间。在你翻书的时候,如果发现当前这一页的某个部分和你想要找的词有相似之处,即使后面不一样,你的助手也会告诉你,根据已经匹配的部分,可以跳过一些不需要再看的地方,直接从新的位置开始比较。如果已匹配的前缀序列中存在某个后缀,该后缀正好是模式的前缀,则可以将模式串向后滑动到与这些相等字符对齐的位置,并继续比较。当你在书里找这个词的时候,如果发现当前看的部分和词不完全一样,就根据部分匹配值告诉你可以跳到哪个位置继续比较。原创 2024-06-18 10:35:59 · 310 阅读 · 0 评论 -
栈的概念与用途
在计算机里,栈是一种特殊的列表,你只能在一端,也就是“栈顶”,添加或者删除数据。共享栈:想象一下,如果有两个盘子,但是它们共用一个桌子,你可以把两个盘子分别放在桌子的两端,这样两个盘子就可以共享桌子的空间了。链式存储:这就像是一串项链,每个珠子代表一个东西,你可以在项链的一头添加或者移除珠子,而且不用担心项链会满,因为项链可以无限长。后进先出:就像你先放一个苹果,再放一个香蕉到盘子里,如果你想拿东西吃,你先拿到的是香蕉,然后才是苹果。函数调用:当你在写程序的时候,计算机会用栈来记住每个函数调用的信息。原创 2024-06-18 10:35:42 · 353 阅读 · 0 评论 -
栈和队列的应用。
比如你要计算一个数学表达式,中缀表达式就像是我们平时写的那样,先写数字,然后写运算符。想象一下,你有一个盒子(栈),用来放括号。你一边看一边把括号往盒子里放,如果看到一个右括号,就得检查盒子里是不是有对应的左括号,有就拿出来,没有就说明括号用错了。递归就像是你打电话,每次电话接通都要记下对方的号码(压栈),等挂了电话(出栈),再打下一个。栈和队列就像是生活中的排队和打电话,一个是用来先来先服务(队列),一个是用来后进先出(栈)。机算:使用栈,扫描元素,操作数压栈,运算符时弹出两个元素进行运算,结果压栈。原创 2024-06-18 10:35:33 · 270 阅读 · 0 评论 -
【无标题】队列详解【易忘】
这样,无论你的队伍有多长,都不会有溢出的问题,因为每个人都知道下一个是谁,队伍可以无限延伸。队列就是这样一种东西,它有两头,一头是进的(队尾),一头是出的(队头)。队列:是一种线性表,但与数组或链表不同,队列的操作有严格的限制,只能在一端插入元素(称为队尾),在另一端删除元素(称为队头)。输入受限的双端队列:与输出受限的双端队列相反,这种队列允许在一端进行插入和删除操作,但在另一端只允许删除操作。假溢出指的是当队列的指针移动到数组的末尾时,虽然数组中还有空间,但队列已经被认为是满的。原创 2024-06-18 10:35:24 · 246 阅读 · 0 评论 -
线性表的基本操作
线性表,就像它的名字一样,就是一排排整齐排列的元素,它们都是同一种类型的数据,比如全是数字或者全是字符串。最后,虽然线性表是按顺序排列的,但是它具体怎么存放在电脑里,可以有不同的方式,比如可以像书架上排列整齐的书一样存放,也可以像项链上的珠子一样一个接一个地串起来。ListDelete(&L, i, &e) :删除操作,删除表L中第i个位置的元素,并用e返回被删除元素的值。线性表是一种逻辑结构,它表示元素之间的一对一相邻关系。Length(L) :求表长操作,返回线性表L的长度,即L中数据元素的数量。原创 2024-06-18 10:35:14 · 361 阅读 · 0 评论 -
线性表的链式表示
删除结点操作:删除第i个结点需要先检查位置的合法性,然后找到第i-1个结点(前驱结点),并将其链接到被删除结点的后继结点上。想象一下,单链表就像一排排的座位,每个座位上都有一个人,而且每个人手里都拿着一张纸条,上面写着他后面那个人的名字。删除操作:如果你想让第10个人离开队伍,你得先找到第9个人,然后告诉第11个人,以后第9个人就是你的前一个人了,然后把第10个人从队伍里踢出去。插入操作:如果你想在第10个人后面加一个人,你就得让第10个人知道后面的人变了,新来的人要知道他前面是第10个,后面是第11个。原创 2024-06-18 10:35:01 · 390 阅读 · 0 评论 -
数据结构的基本概念
书放在书架上的方式,可以是一排排挨着放(顺序存储),也可以是每本书之间用绳子连起来(链式存储),或者每本书旁边有个标签告诉你它是什么(索引存储),或者直接在书脊上写上编号,一查编号就知道它在哪(散列存储)。就像书架上的书,有的是按大小排,有的是按颜色排,还有的可能是按作者排。就像书架上的书,我们关心三件事:书怎么排(逻辑结构)、书放在哪里(存储结构)、以及我们怎么操作这些书(数据的运算)。就像书架上排列整齐的书,每本书都有它的位置。概念:逻辑结构指的是数据元素之间的逻辑关系,与数据的存储方式无关。原创 2024-06-18 10:34:51 · 361 阅读 · 0 评论 -
算法和算法的性能指标
加法规则:两个时间复杂度的和,取两者中较大的一个作为结果,表示为 O(f(n)) + O(g(n)) = O(\max(f(n), g(n)))。乘法规则:两个时间复杂度的乘积,直接相乘,表示为 O(f(n)) \times O(g(n)) = O(f(n) \times g(n))。算法就像是做一件事情的步骤清单。乘法规则:如果两个算法的时间复杂度相乘,就是它们各自的时间乘起来,就像两个食谱的时间加起来。时间复杂度:衡量算法执行时间的增长趋势,通常用大O符号表示,如O(n)、O(log n)等。原创 2024-06-18 10:34:42 · 215 阅读 · 0 评论 -
排序算法的概念
也就是说,如果元素Ri和Rj具有相同的关键字,并且Ri在排序前位于Rj之前,那么使用稳定排序算法后,Ri仍然会位于Rj之前。在外部排序过程中,数据需要在内存和外部存储(如硬盘)之间不断移动,这通常涉及到更复杂的算法和更多的I/O操作。稳定性就像是在排队时,如果你和你的好朋友站在一起,不管队伍怎么排,你们俩总是在一起。在排序算法中,如果两个元素的数字一样,稳定排序算法会确保它们在排序后还是挨在一起,就像你们俩排队一样。内部排序:这种排序方式指的是在排序过程中,所有的数据元素都可以存放在内存中。原创 2024-06-18 10:34:19 · 346 阅读 · 0 评论 -
【无标题】插入排序
插入排序是一种简单直观的排序算法,其基本思想是将一个记录插入到已经排好序的序列中,使得插入后的序列仍然有序。稳定性就是说,如果你有两张相同的牌,排序之后,这两张牌的相对位置不会变。然后你拿出第二张牌,看看它应该插在哪,是插在第一张牌前面,还是后面,反正得让它排好。概念:首先将序列的第一个元素视为有序序列,然后将剩余的元素依次插入到这个有序序列中。接着,你继续拿出剩下的牌,每拿一张,就把它放到前面已经排好的牌里合适的位置。你先把牌分成几堆,每堆的牌数一样,但是堆和堆之间可能有重复的牌。原创 2024-06-18 10:34:08 · 360 阅读 · 0 评论 -
两种选择排序
时间复杂度:堆排序的时间复杂度是O(n log n),这是因为构建堆的时间是O(n),而每次从堆中移除最大或最小元素并重建堆的时间是O(log n)。稳定性:堆排序同样是不稳定的排序算法,因为在调整堆的过程中,相同值的元素可能会改变它们原来的顺序。当根节点输出后,将堆的最后一个元素与堆顶元素交换,然后根据堆的规则向下调整以保持堆的性质。找最小的:每次你从剩下的牌里找到最小的那一张,然后把它放到已经排好的牌堆的最上面。调整堆:然后你把堆的最后一张牌放到顶上,重新调整堆的形状,让它继续保持堆的规则。原创 2024-06-16 09:29:50 · 320 阅读 · 0 评论 -
两种交换排序
快速排序的优点是快,特别是金鱼(数据)很多的时候。从序列的一端开始,相邻元素两两比较,如果顺序错误(即后面的元素比前面的元素大),则交换它们的位置。交换排序是一种排序算法,它通过比较序列中的元素,根据比较结果来交换元素的位置,以实现排序的目的。经过一轮比较后,最小的元素会“冒泡”到序列的开始位置(或最大的元素会移动到序列的末尾)。冒泡排序的好处是简单,不需要额外的空间,但它的缺点是慢,特别是金鱼(数据)很多的时候。从缸的一头开始,看看相邻的两条金鱼,如果大的在前,小的在后,就把它们的位置换一下。原创 2024-06-16 09:29:38 · 226 阅读 · 0 评论 -
【排序】两种选择排序
想象一下,你有一堆乱七八糟的卡片,每张卡片上都有一个数字。选择排序就像是你在每轮游戏中,都从这堆卡片里找到最小的那个数字,然后把它放到最前面去。这个过程要重复好几次,直到所有的卡片都按从小到大的顺序排好。空间:你不需要额外的卡片,就在原地搞定。时间:这个方法比较慢,因为你每次都要从头到尾找一遍最小的数字。稳定性:这个方法不太稳定,有时候两张卡片上的数字一样,但它们的位置可能会在排序过程中被搞乱。原创 2024-06-09 02:09:39 · 302 阅读 · 0 评论 -
数据结构讲了什么
第1章:时间复杂度与空间复杂度时间复杂度:衡量算法执行所需时间的量度,通常用大O表示法来描述。空间复杂度:衡量算法执行过程中所需的存储空间量度。第2章:线性表顺序表:使用数组来实现的线性表,支持随机访问。插入和删除操作可能需要移动大量元素。查找操作可以直接访问任意位置。链式表:使用链表来实现的线性表,不支持随机访问。插入和删除操作不需要移动元素,只需修改指针。查找操作需要从头开始遍历。单链表、双链表、循环链表:链表的不同变体,具有不同的结构和特性。原创 2024-06-11 00:48:53 · 848 阅读 · 0 评论 -
【排序】两种交换排序
冒泡排序想象一下,你有一池子的鱼,但它们乱糟糟的,你想把它们按大小排个队。冒泡排序就像是你从一头开始,看到两个鱼挨在一起,如果大的在前,你就把它们换个位置。然后你继续往前看,继续换位置,直到你走到池子的另一头。这时候,最大的鱼就被排到了最后。然后你再从头开始这个过程,但这次不用再管已经排好的最大的鱼了。你就这样一遍又一遍地做,直到所有的鱼都按大小排好了队。这个过程就像是气泡从水底冒到水面,所以叫冒泡排序。快速排序快速排序就像是你玩一个找朋友的分组游戏。原创 2024-06-09 02:04:17 · 278 阅读 · 0 评论 -
三种插入排序(有空需要加一下代码和图解)
插入排序是什么?想象一下,你手里有一副扑克牌,要把它们按顺序排好。插入排序就是这种一个一个地把牌插入到已经排好的部分的方法。直接插入排序概念:就像你手里已经有了一些排好的牌,然后你再拿到一张新牌,你就在手里的牌堆里找到它应该插入的位置,把它插进去。步骤:假设最开始你手里有一张牌,这就是你的“有序序列”。然后你拿到第二张牌,你就在第一张牌的前面或者后面找到它的位置,把它放进去。接着是第三张、第四张...每拿到一张新牌,你就在已经排好的牌堆里找到它的位置,然后把它放进去。原创 2024-06-09 01:59:41 · 344 阅读 · 0 评论 -
邻接矩阵和邻接表的时间复杂度
*空间复杂度**:但这个方法空间上更节省,因为如果你班上每个人都只有几个朋友,用信封这种形式记录大家的朋友关系,只占据很小的空间。但如果班上有非常多的同学们,而且大多数同学的朋友不多,那么每个同学有他们的朋友名单,这样的邻接表就更适合了。如果班上的同学不多,比如就几十个,而且彼此间的交友情况很复杂,那么使用一个大表格,也就是邻接矩阵,就比较合适了。因为朋友关系复杂,快速找到谁是谁的朋友更重要。**时间复杂度**:如果你想查所有小红的朋友,你需要看看她的信封里面都装了谁的名字,就得看一会儿才能找全。原创 2024-06-01 01:04:56 · 450 阅读 · 0 评论 -
如何在计算机中存储各种数据结构
在计算机中,数据结构存储的实现依赖于多种因素,包括数据的类型、大小以及操作系统如何管理内存。他们是怎么在计算机中存储的?### 1. 数组假设你要记录一系列同学的名字,你可以用一列不同颜色的信封(数组元素)来代表每个同学的名字,并且这些信封从第一个到最后一个都顺序排列。数组是用于存储相同类型数据的数据结构。在计算机中,数组通常存放在一块连续的内存区域中,以便快速随机访问各个元素。### 2. 链表。原创 2024-06-04 09:11:42 · 808 阅读 · 0 评论 -
B+树是什么
想象一下,你有一本巨大的电话号码簿。这本簿子非常复杂,它有一种特殊的结构,让找号码既快速又方便。我们来用简单的话语解释一下这种结构,我们把它叫做B+树。### B+树是用来干什么的?它就像一个高级的电话号码簿。你可以很快找到想要的电话,或者快速的查完全部的人名,并且更新电话簿也很简单。### B+树长什么样子?想象你的电话号码簿每一页是下面这样的:- **顶层节点(根节点)**:你可以把它当作目录,里面有指向分目录的箭头。这些箭头实际上是指向信息的快捷方式。原创 2024-06-01 00:58:25 · 104 阅读 · 0 评论 -
常见的算法的时间复杂度
线性搜索,就是这么个“一件一件慢慢来”的意思,时间复杂度是 **O(n)**,就代表了,随着厨具数量 **n** 的增加,你找到东西的时间也会相应地增加。你拿过最左的,和紧挨着的下一个比较,如果左边比右边高,你再互换他们的位置。排序后的结果——时间复杂度是 **O(n^2)**,所以,数量多的时候,要排整齐,等的时间真的好长。这种方法相比一件一件找会快很多,时间复杂度是 **O(log n)**,说明你要用的时间,跟厨具数量的对数差不多,就是说即使厨具超多,找到勺子也不会很慢。又回到了找勺子的话题。原创 2024-06-03 21:22:50 · 280 阅读 · 0 评论 -
邻接矩阵是什么
用大白话讲,邻接矩阵就像是一个表格,用来表示一个“点”的集合以及它们相互之间的连接情况。在这些点中,有些可能会相互连接起来,比如城市的交通路口,有些可以没有任何连接,就像两个不相连的城市。邻接矩阵这张表格的每一行和每一列对应一个点,点之间的连接情况就用表格中的格子来表示。所以,这张表就能很直接地告诉我们这几个小伙伴之间的朋友关系(互相认识的情况),比如“小明认识小红和小刚”或者“小红认识小明和小花”。- 如果两个小伙伴互相认识,就在对应的行和列交汇的方格里写上数字1;小明 小红 小刚 小花。原创 2024-06-01 01:06:45 · 272 阅读 · 0 评论 -
B树是什么
想象一下你家有一个超级大的书架,上面放着很多不同种类的书籍,但是为了查找方便,你打算按照一定的规则来排列它们。原创 2024-06-03 19:25:56 · 332 阅读 · 0 评论