![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 67
无数碎片寻你
相同的回忆,错位的时空,隔空的爱恋,散落的碎片(bilibil无数碎片寻你)
展开
-
云盘挂载 开机自动模拟 cmd- alist server
帮我写一个vbs命令:在D:\sky目录下, 然后cmd, 进入命令行后, 输入 alist server 然后回车。这里 这个目录, 换成自己的 alist.exe所在目录。接着, 我们win+r, 输入 shell:startup。原创 2024-07-12 23:12:48 · 441 阅读 · 0 评论 -
重装系统心得
原则:1、看客户需求2、满足日常办公效率3、在满足最流畅运行的条件下,进行必要软件安装。用了两天,终于把我哥的think pad系统备份重装完。修复后效果如下 :按下开机按键,秒表计时一分半后,电脑可以基本流畅丝滑使用,日常办公无明显卡顿。刚拿到手的电脑的的效果:从开机到能进行操作,需要五分钟。初步判断原因 :电脑垃圾或碎片太多,也可能中流氓软件进行的操作 : 通过浏览器,下载阿里云盘,把我的软件先传输到电脑上。然后使用geek升级版,卸载部分流氓pdf和看图软件。然后进行重启观看效原创 2023-01-24 00:02:50 · 1093 阅读 · 0 评论 -
图(Graph)的定义
• 集合V(vertex):顶点的有限集合,记为V(G) ▪ 对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0 ~ n-1 ▪ 通过编号唯一确定一个顶点• 集合E(Edge):连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G). ♥ 无向图 • 边之间的"顶点对"是无序的,则称图G为无向图. • (i,j)表示一条无向边,和(j,i)是同一条边。 ♥ 有向图 • 边之间的顶点对是有序的,则称G为有向图。原创 2022-12-24 14:32:20 · 895 阅读 · 0 评论 -
图结构
▪ 18世纪初普鲁士的哥斯尼堡,有一条河穿过,河上有两个小岛,有七座桥把两个小岛与河岸联系起来。▪ 问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。▪ [数据表示----数据结构]设邻接矩阵arc[n] [n]存储图.把图提取出来,转换成我们所擅长的图模型,去用计算机解决问题。▪ 难点:可能的走法----7! • 集合V: 顶点的有限集合。抽象出本质的东西,然后解决问题。▪形式化定义: G=(V,E) • 集合E: 边的有限集合。从哥尼斯堡的七桥问题开始。原创 2022-12-22 12:40:04 · 547 阅读 · 0 评论 -
哈夫曼树的构造及应用
▪ 具有最小带权路径长度的二叉树称为哈夫曼树,或称为最优二叉树。原创 2022-12-19 16:08:32 · 1340 阅读 · 0 评论 -
近期写博客的心路历程
最近又拖更了, 为什么呢?说来也惭愧 , 还是返回原点吧。当初为什么写博客呢?当初是听老师说,写博客可以把自己的思维拓展起来,从学习中,把自己的思路写下来。的确,从中我体会到了写博客的成就感,但那都是来源于攻克一个非常难的项目,所带来的的喜悦。我的纠结之处就在这里,我无法衡量—难的项目和需要打基础的项目直接的分量 , 对于需要打基础的博客,我很想去写,但是又力不从心了 , 脑子会了,到了写代码思路,需要想大半天,可能一天只能写一节课的知识点。原创 2022-12-14 20:45:50 · 132 阅读 · 2 评论 -
线索二叉树构建和遍历
/定义数据域 int ltag , rtag;//定义左右孩子的标志位,1为线索,0为有孩子 struct node * lchild;//左指针 struct node * rchild;//右指针 } TBTNode;原创 2022-12-14 19:54:31 · 2006 阅读 · 1 评论 -
二叉树的构造(如何唯一确定一棵二叉树?附证明)
通过构造二叉树的先序序列和中序序列,后序序列,我们可以发现,每一步都是有条不紊的,每一步都是分层次的,我们通过构造序列的过程,逆向可以构造出二叉树,就间接地证明了,这个定义的合法性.④ 根据中序序列的第二个节点,就可以确定下一层级的根节点,然后拿这个根节点去查找中序遍历的序列,就可以找到此层级的左子树和右子树,以此类推。③我们通过查找中序序列的根的左边的节点个数,就可以确定二叉树的左子树,根据根右边的节点个数,就可以确定二叉树的右子树。▪ 不同的二叉树可能具有相同的先序序列、中序序列和后序序列。原创 2022-12-11 18:04:46 · 3003 阅读 · 3 评论 -
层次遍历二叉树
既然要定义存储其双亲信息,那我们我们就需要遍历二叉树,那就非层次遍历莫属了,因为层次遍历没有递归遍历的冗余信息,没有先序遍历、中序遍历、后续遍历来回操作的烦恼,只需要按部就班的进行进队和出队节点即可,方便我们进行遍历每个节点。既然我们了解了层次遍历的次序, 那接下来就是层次遍历的设计,我们是逐层遍历,在同一层次上面的节点,先遍历的节点,其孩子在下一层也有优先权,所以我们在遍历到一个节点时,其孩子也要进入排队的序列。唯一需要注意的就是,当遍历一个节点的时候,我们要把其孩子入队,以方便下一层节点的有序遍历。原创 2022-12-10 19:09:54 · 1753 阅读 · 0 评论 -
二叉树遍历非递归算法
•三种遍历 • 先序遍历: 根节点–>左子树–>右子树 • 中序遍历: 左子树–>根节点–>右子树 • 后序遍历: 左子树–>右子树–>根节点•两类算法 • 递归算法(具体看我上一篇文章) ♥直观,易读 ♥效率低下 • 非递归算法 ♥ 如果一个算法可以使用递归或循环来进行完成,在不影响代码阅读的情况下,可以使用循环,来降低复杂度。下面介绍二叉树的遍历,把用。原创 2022-12-09 18:31:27 · 3899 阅读 · 1 评论 -
递归的效率问题及循环比较
大家都知道递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的.具体是每次调用函数本身要保存的内容包括:局变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N*局部变量、N *形参、N *调用函数地址、N *返回值。这势必是影响效率的。递归与循环是两种不同的解决问题的典型思路。当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环则不一定,两个概念不是一个车层次,不同场景做不同的尝试。**优点:**代码简洁、清原创 2022-12-07 20:50:29 · 596 阅读 · 0 评论 -
二叉树的遍历
▪ 先序遍历二叉树的过程 •访问根节点 • 先序遍历左子树 • 先序遍历右子树构建思路 :代码实现:中序和后序遍历的递归算法● 中序遍历二叉树的过程 • 中序遍历左子树 • 访问根节点 • 中序遍历右子树思路: 都差不多,都是在同一层级上进行递归调用,我们换一下顺序即可代码实现:● 后序遍历二叉树的过程 • 后序遍历左子树 • 后序遍历右子树 • 访问根节点代码实现:二叉树遍历的相关问题♥问题1 • 假设二叉树采用二叉链式存储 ,设计算法,计算一棵给定二叉树的所有节点原创 2022-12-06 22:51:38 · 421 阅读 · 1 评论 -
二叉树的基本运算
上一讲我们已经讲了创建二叉树,所以这一讲,我们来说一下二叉树的基本运算方法,为以后二叉树的运用打下基础:(1)查找节点FindNode(*b,x):(2)找孩子节点LchildNode§和Rchild-Node§:(3)求高度BTNodeDepth(*b):(4)输出二叉树DispBTNode(*b):如上图,就是我们举的例子:我们定义的二叉树节点结构如下:(1)查找节点 FindNode(*b,x)•找到值为x的节点后返回节点指针,否则返回NULL•用递归算法,采用"根-左子树-右子树"的顺序,查找值原创 2022-12-06 16:51:47 · 2121 阅读 · 0 评论 -
二叉树的存储结构
我们后来又遇到 B, B后边有“(” , 我们就把 B 压入栈顶 , 然后我们接下来处理的元素 ,就是 栈顶 B 的孩子 , 直到遇到 “)” 我们才能断定此层嵌套结束, 弹出栈顶的一个根节点。• 此时,我们有发现一个问题 , 我们根据图示知道 , 遍历到 “(” , 刚才遇到了 B ,所以接下来处理的是 B 的子树, 但是计算机怎么知道,我们是需要处理元素是 后遇到的 B呢?接下来 ,如果出现元素,就是B 的左孩子,如果出现逗号,那接下来 ,再出现元素就是B的右孩子 ,欲知后事如何,请接着遍历。原创 2022-11-15 20:44:40 · 3647 阅读 · 2 评论 -
二叉树与树、森林之间的转换
我的理解是普通的树状结构自带的特点太少,而二叉树有很多其自身特点比如满二叉树每层的节点个数是确定,总节点个数个数确定了,其边的个数也就确定了,还有很多已经研究明白的性质,在具体的实际问题中抽象出来的树状结构可能并不是二叉树,如果针对么个树状结构提供一套解决方案那么树状结构不同,代码会有差异,而此时,如果把通用的树状结构转换为二叉树,就可以使用已经研究明白的二叉树的性质解决问题了。我们知道 , 森林转换成二叉树 , 二叉树所有节点的右孩子,转换前,是其此节点的兄弟 , 左孩子仍为其左孩子 ,原创 2022-11-15 11:51:59 · 4654 阅读 · 0 评论 -
树的存储结构
{//定义数据区//指向其双亲在数组中的位置{//存储数据//存储其孩子的指针数组}TsonNode;// MaxSons 为最多的孩子节点个数。原创 2022-11-12 14:04:18 · 933 阅读 · 0 评论 -
树的性质及其证明
• 设具有 n 个节点的m次树的高度为h, 若在该数中前h-1层都是满的,即每一层的节点数都等于m^(i-1)个(1原创 2022-11-11 20:32:09 · 949 阅读 · 0 评论 -
树的基本术语
● 对于任意两个节点 di 和 dj , 若树中存在一个节点序列 di, di1,di2 , ..., din, d j. 使得序列中除 di外的任一节点都是其在序列中的前一节点的后继 ,则称该节点序列为由 di 到d j 的一条。● 每个节点的后继 , 被称作该节点的孩子节点(或子女节点).相应地 ,该节点被称作孩子节点的双亲结点(或父母节点)● 节点的层次从树根开始定义,根节点为第一层,它的孩子节点为第二层,以此类推。● 从树根节点到达节点的路径上经过的所有节点被称作该节点的祖先节点.原创 2022-11-11 16:52:13 · 1024 阅读 · 0 评论 -
树结构导学
树 : T = {D,R}● D 是包含 n 个节点的有穷集合(n>=0)• 当 n = 0 时 , 为空树● 当 n > 0 时 , 关系 R 满足以下一对多关系• 有且仅有一个节点 d0∈D 没有前驱节点, 节点 d0称作树的根节点• 除根节点d0外 , D 中的每个节点有且仅有一个前驱节点• D中每个节点可以有零个或多个后继节点有趣的术语:●每个节点的后继 , 被称作该节点的孩子节点(或子女节点) . 相应地 , 该节点被称作孩子节点的双亲节点(或父母节点)原创 2022-11-11 16:00:38 · 340 阅读 · 0 评论 -
广义表的存储结构及其基本运算
通过观察上面的广义表结构 , 广义表在同一层的数据元素包括单个数据元素(原子)和广义表的子表所以我们需要对这两者节点进行定义我们可以为这两种节点设置类型标识 :1 ---子表 , 0----原子并且原子和广义表子表的存储的数据也不一样 , 原子存放的是 数据data, 广义表存放的是指向下一个元素的指针数据{int tag;//节点类型标识🤣: 1-1子表,0-原子union{//子表指向下一级的数据节点}val;//同级指向//指向下一个元素}GLNode;原创 2022-11-10 20:37:57 · 2223 阅读 · 0 评论 -
广义表的概念及其存储
ADT GList{数据对象:D = {ei | i=1,2,...,n,n>=0, ei∈AutoSet 或 GList} //AutoSet为某数据对象数据关系:数据操作:(1) CreatGL(s): 创建广义表(2) GLLength(L): 求广义表长度;(3) GLDepth(L): 求广义表深度;(4) DisGL(L): 输出广义表L;(5) Head(L): 求表头(6) Tail(L): 求表尾}原创 2022-11-09 20:18:34 · 251 阅读 · 0 评论 -
稀疏矩阵转十字链表
● 每个非零元素用一个节点表示 , 其中 i , j, tag.value 分别代表非零元素所在的行号,列号和相应的元素值;● 头节点的i,j 代表总行数和总列数● down 和 right 分别称为向下指针和向右指针,分别用来链接同列中和同行中的下一个非零元素节点.● 作为头结点, tag.value 变为tag.link,代表头结点的链 .下面,为了我们后面构建十字链表 , 我们先假设已经创建好了十字链表 , 先尝试输出。原创 2022-11-08 22:36:12 · 2412 阅读 · 3 评论 -
稀疏矩阵的压缩存储
• 一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t很小时,即s原创 2022-11-07 22:33:26 · 1270 阅读 · 2 评论 -
对角矩阵的压缩存储
• 若一个n阶方阵A满足,其所有非零元素都集中在以对角线为中心的带状区域中,则称其为n阶对角矩阵。原创 2022-11-07 11:08:23 · 2162 阅读 · 4 评论 -
矩阵存储和特殊矩阵的压缩存储
•若一个n阶方阵A[n][n]中的元素满足aij = aji(0原创 2022-11-06 16:05:28 · 228 阅读 · 0 评论 -
数组的基本概念和存储结构
• 行序为主序的线性排列次序 : a11, a12,a13,....., a1n,a21,a22,...., a2n,...., am1,am2,...,amn•实际存储就是一维概念•任一元素aij 的存储地址:(我们是从 1 ,开始算的,是逻辑上的位序 , 所以此元素前面的所有行就是 i -1 , 此元素所在行的前面的元素就是 j-1 , 初始地址加上前面的所有元素乘以单个元素所占有的空间就是 此元素的开始地址)原创 2022-11-06 15:04:22 · 1539 阅读 · 0 评论 -
KMP算法从常规思维到解题思路(感谢博主:sofu6)
如果用数学公式来表示是这样的这个相当重要,如果觉得不好记的话,可以通过下图来理解:弄明白了这个就应该可能明白为什么可以直接将j移动到k位置了。转载 2022-10-30 10:43:38 · 239 阅读 · 2 评论 -
串的匹配 (KPM算法由来引导)
引入 KPM 算法的前提是 , B-F算法中,匹配失败后不必完全从头再来 , 找到可以利用的信息 , 可以进行跳跃性匹配下面 , 我们对字符串匹配的一些思路进行剖析:开始匹配的操作 ,我们会让 目标串 s , 和 模式串进行对齐,就想如图所示:我们当然是从串 t 的头结点开始对比串 s :a串 t :a对比 第一个元素 , 符合串 s :ab串 t :ab然后对比第二个 元素符合串 s :aba串 t :abc。原创 2022-10-28 13:32:54 · 359 阅读 · 0 评论 -
串的匹配 (Brute - Force 算法)
我们电脑里存放了一段病毒文件 , 我们不可能人工地去一个一个对比 , 这是很耗费时间的 , 我们需要拿着病毒文件 , 和 系统文件作对比 , 逐个去对比 ,找出病毒位置。逐个进行对比 , 如果不同,则 串 t 向后移动 , 从串 t 开头和 串 s 第二个元素对齐,逐个遍历 ,总能找出答案 , 符合,或者不符合。上面是机器的模拟对比 , 我们可以拿两个纸片 , s固定 , 拿着 t ,从开头开始对比 , 不匹配,就后移一位 , 然后 再进行对比匹配。原创 2022-10-27 15:21:46 · 1225 阅读 · 3 评论 -
串的链式存储及其基本操作实现
我们大部分时间都是在使用数组来存储串 , 然后进行操作的 , 对于链串我们不经常使用, 在这里我们为了练习的需要 , 实现一下链串的基本操作 , 其实也就是插入,删除, 替换 ,然后指针的交替罢了.我们通常的操作是 在链串里面 ,每个节点存储四个字节的数据, 就是一个字的数据 , 在这个我们方便对数据进行操作 , 每个 节点只放一个字节 , 那一个节点明明可以存储 4 个字节 , 我们只存一个字节 ,那就会空余 3 个字节的空间 , 那也没办法 , 继续操作即可。原创 2022-10-25 20:38:06 · 3550 阅读 · 5 评论 -
串的顺序存储的应用实例二
苏格拉底是古希腊著名的哲学家。有一天,他带领几个弟子来到一块麦地边。那时正是麦子成熟的季节,地里满是沉甸甸的麦穗。苏格拉底对弟子们说:“你们去麦地里摘一个最大的麦穗,只许进不许退。我在麦地的尽头等你们。”弟子们陆续走进了麦地。到处都是大麦穗,哪一个才是最大的呢?他们埋头向前走,看看这一株,摇了摇头;看看那一株,又摇了摇头。虽然有人也曾试着摘了几穗,但想到前面可能还有更大的,于是就毫不犹豫地把手里的麦穗扔掉了。就这样,他们一边低着头往前走,一边用心地挑挑拣拣,经过了很长一段时间。原创 2022-10-21 20:46:40 · 477 阅读 · 0 评论 -
串的顺序存储结构应用
例1 : • 问题: 设计实现串比较运算的算法 如何比较串 ,我们首先制定一下规则 ,然后根据规则再设计算法• 算法思路 (1) 比较 s 和 t 两个串共同长度范围内的对应的字符: ① 若 s 的字符 > t 的字符 , 返回 1; ② 若 s 的字符 < t 的字符 , 返回 -1; ③ 若 s 的字符 = t 的字符 , 则按照上述规则继续比较. (2)原创 2022-10-21 17:34:31 · 567 阅读 · 0 评论 -
串的概念及操作
• 由零个或多个字符组成的有穷序列.• 含零个字符的串称为空串 用 ∅ 表示• 串中所含字符的个数称为该串的长度(或串长)• 通常将一个串表示成 (a1, a2 ........an)的形式,每个ai (1原创 2022-10-20 21:46:19 · 1929 阅读 · 0 评论 -
广度优先遍历解决迷宫问题
我们之前使用深度优先遍历的方法是 , 只派一个人去探索迷宫,记录其路线 和每个节点走过的方向 , 一条道走到黑 , 当路不通时候,回溯到上一个节点 的下一个方向 , 直到这个节点全部方向都遍历完,我们就放弃路线上的这个节点 ,接着回溯到这个节点的上一个节点的另一个方向 , 我们一定可以成功 ,因为我们就算不成功,早晚也可以回溯到起点 ,从起点的下一个方向出发 ,当把所有节点所有方向都遍历完,如果有解, 我们则可以找到出口 , 无解则输出无解 .原创 2022-10-19 16:54:05 · 2484 阅读 · 1 评论 -
拓展: 只保存尾结点的链队列
换一下行不行 ,我们还是那句话,涉及到指针的时候一定要非常小心 ,我们要把队尾元素 an 指向 新元素x ,我们现在已经知道x的地址 , 还有 队尾节点 an的地址(存放在 rear中) ,(3)当队列中不止一个节点,说明我们出队完, 需要把 rear 指向前一个节点,前一个节点的后继指针指向 队首的第一个节点。原来队尾节点的后继指针指向新节点 , 然后 新节点的后继指针指向队头 ,并且标志队尾的节点也移向新元素,标志队尾。先判断链队是否为空,为空,则 新节点作为唯一一个节点, 其队首指针也指向新节点。原创 2022-10-18 12:02:49 · 527 阅读 · 0 评论 -
队列的链式存储结构及其基本运算实现
前面我们介绍了顺序队列的存储 ,是利用数组存储数据 , 然后删除节点数据和添加节点数据都是在数组完成的 , 有一个弊端就是 ,当我们操作的数量很大时 , 如果数组存储结构就很难队列操作了 ,那就需要利用链式存储结构了原创 2022-10-17 22:45:01 · 1343 阅读 · 0 评论 -
拓展 : 环形队列的另一种设计
思考:我们在上一个队列可以进行插入和删除操作 , 但是我们不能直接得出元素个数 , 我们会联想到队首指针和队尾指针 ,元素个数之间的关系 , 知其二 即可知其一 ,并且我们有了 count(计算元素个数的标志) , 就可以知道什么时候队满了 ,然后当 front 和 rear 重合时 , 我们通过队列中元素个数 , 也能区分出队满和 队空了 , 那我们的最大存储容量就是 MaxSize 了● 问题• 如果知道环形队列和, 则可以计算出队尾指针 .原创 2022-10-17 13:29:35 · 719 阅读 · 2 评论 -
环形队列的存储及基本操作
{int front;int rear;}SqQueue;//rear 指向队尾元素// front 指向队头元素的前一个位置。原创 2022-10-17 08:14:57 · 648 阅读 · 0 评论 -
队列的顺序存储结构
说白了,就是一个数组 ,然后在两端进行操作 ,两端用首队指针和尾指针分别指向 ,然后进行相关的删除,插入操作, 目的还是模拟现实对数据的处理●描述队列•数据元素data , 元素具有同一类型ElemType ,最多为MaxSize(数组容量)•当前队首front•当前队尾 rear定义队列的数据结构以上是我们的队列的存储结构, 队列中有存储数据的数组 ElemType data[MaxSize];原创 2022-10-15 21:21:23 · 1264 阅读 · 0 评论 -
队列的定义
ADT Queue{数据对象:D = { ai | ai 属于 ElemType, i=1,2,3...,n,n>=0}//ElemType为类型标识符数据关系:R = { | ai , ai+1 属于 D, i = 1,3,...,n-1}//前后顺序关系数据操作:InitQueue(&q):初始化队列 ,构造一个空队列DestroyQueue(&q):销毁队列 . 释放队列q 占用的存储空间.原创 2022-10-15 13:19:38 · 1041 阅读 · 0 评论