1. const用于声明一个变量, 其值不能被修改
- 如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个 节点:首先,我们需要创建一个新的节点。然后,我们为新节点的数据成员赋值42。接下来,我们将新节点的next成员设置为当前的头节 点,最后更新头指针以指向新节点。这样,新节点就成为了链表的第一个节点。
- 对于高度为 h 的完全三叉树,其节点数最少为 3^0 + 3^1 + … + 3^(h-1)
- 高精度计算主要是用来处理大整数或需要保留多位小数的运算;大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累 加商;高精度加法运算的关键在于逐位相加并处理进位;高精度乘法的运算时间与两个整数的位数都有关,而不仅仅是长度较长者的位数
- 哈夫曼编码,又称为 Huffman Coding是一种可变长编码( VLC, variable length coding))方式,比起定长编码的 ASCII 编码来说,哈夫曼编码能节省很多的空间,因为每一个字符出现的频率不是一致的;哈夫曼编码首先会使用字符的频率创建一棵树,然后通过这个树的结构为每个字符生成一个特定的编码,出现频率高的字符使用较短的编码,出现频率低的则使用较长的编码,这样就会使编码之后的字符串平均长度降低,从而达到数据无损压缩的目的。
- 哈夫曼编码方法:
- 计算字符串中每个字符的频率
- 按照字符出现的频率进行排序,组成一个队列 Q出现频率最低的在前 面,出现频率高的在后面。
- 把这些字符作为叶子节点开始构建一颗哈夫曼树,哈夫曼树又称为最优 二叉树,是一种带权路径长度最短的二叉树
- 对字符进行编码编码原则是:对于每个非叶子节点,将 0 分配给连接线的左侧,1 分配给连接线的右侧,最终得到字符的编码就是从根节点开始,到该节点的路径上的 0 1 序列组合。
有关哈夫曼的题:
做法:合并a(5%)和b(9%),得到新节点ab(14%)。
合并c(12%)和d(13%),得到新节点cd(25%)。
合并ab(14%)和e(16%),得到新节点abe(30%)。
合并cd(25%)和abe(30%),得到新节点abcde(55%)。
最后,合并abcde(55%)和f(45%),得到根节点 abcdef(100%)。
从哈夫曼树中,我们可以为每个字符生成哈夫曼编码。 从根节点开始,左子树的边表示1,右子树的边表示0。
- 前中后序遍历互相转换:
一、前序表达式转换为中序表达式:
从右往左开始,取出一个操作符和操作符右边的两个数进行计算,并将计算的结果放过去,直到计算结束。
二、后序表达式转换为中序表达式:
从左向右开始,取出一个操作符和操作符左边的两个数进行计算,并将计算的结果放过去,直到计算结束,以后序表达式“ab+cde+**”为例,将其转换为中序表达式:
- 中序表达式转换为后序表达式:
这个有点复杂,我们假设中序表达式中只有+、*、(、),将中序表达式 a+b*c+(d*e+f)*g,转换为后序表达式:abc*+de*f+g*+,转换过程需要借助一个辅助栈,转换的规则是这样的:
从左向右扫描,遇到操作数,则直接输出;当遇到操作符(+、-、*)和左括号时,则从栈中弹出栈元素并写到输出直到发现优先级(+优先级最低,左括号优先级最高)更低的元素为止(注意,不弹出这个优先级更低的元素),但是有一个例外,即除非在处理右括号的时候,否则我们绝不从栈中弹出左括号,当从栈弹出元素的工作完成后,再将当操作符压入栈中;当遇到右括号的时候,则将栈中元素弹出并写入到输出直到遇到一个左括号,但是这个左括号只是被弹出,并没有写到输出中。如果从左向右扫描结束,栈中还有元素,则将栈中元素弹出并写到输出,直到栈为空。
四、中序表达式转换为前序表达式
这个比较复杂,以中序表达式 2*3/(2-1)+3*(4-1)为例,转换规则如下
1、反转表达式,让它逆序排列,如2*3/(2-1)+3*(4-1),反转后为)1-4(*3+)1-2(/3*2
2、从字符串中取出下一个字符并处理:
2.1、如果是操作数,则直接输出
2.2、如果是),则压入栈中
2.3、如果是运算符,但不是( 也不是 ),则不断进行如下处理
2.3.1、如果栈为空,则此运算符入栈,结束此步骤
2.3.2、如果栈顶为),则此运算符入栈,结束此步骤
2.3.3、如果此运算符与栈顶元素优先级相同或更高,则此运算符入栈,结束此步骤
2.3.4、否则,执行连续的出栈操作,知道满足上述三个条件之一,结束此步骤
2.4、如果是(,执行连续的出栈操作,直到遇见)为止,并将)出栈且丢弃之
3、如果有更多的字符,则转到第2步
- 字符处理完毕,则执行连续的出栈操作,直到栈为空
- 再次反转表达式,得到最终的结果.
- 一道小题:
1.从前序遍历中,我们知道A是根节点。
2.在中序遍历中, A之前的部分DEB是左子树, A之后的部分CFG是右子树。
3.对于左子树DEB,从前序遍历中我们知道B是左子树的根节点。
4.在中序遍历中, B之前的部分DE是B的左子树。
6.对于左子树DE,从前序遍历中我们知道D是左子树的根节点, E是D的右子节点。
7.对于右子树CFG,从前序遍历中我们知道C是右子树的根节点。
8.在中序遍历中, C之后的部分FG是C的右子树。
9.对于右子树FG,从前序遍历中我们知道F是右子树的根节点, G是F的右子节点。
10.根据上述分析,我们可以得到以下二叉树结构:
- 有向无环图:若一个有向图(有向图是一副具有方向性的图,是有一组顶点和一组有方向的边组成的,每条方向的边都连接着一对有序的顶点。全部由无向边构成图称为无向图)中不存在环,则称为有向无环图。简称DAG图(Directed Acyclic Graph)顶点中不可能出现重复的操作数。
有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列
- 操作系统是管理计算机硬件和软件资源的软件,它为计算机程序提供服务。Linux - Windows - Android - 是一个操作系统,主要用于移动设备,HTML - 是一种用于描述网页的标记语言,不是操作系统。
- 最长公共子序列可以不连续,但最长公共子串必须是连续的。
- 在 Linux 系统终端中,mkdir命令用于创建一个新的目录
13.Linux 系统中常用命令:
- 关于数据结构的一些小知识:
1.队列是一种先进先出(FIFO)「即先进先出」的线性结构
2.哈夫曼树是带权路径长度最短的树,是用来解决最短编码问题的,和树的深度优先搜索无关。( 哈夫曼树通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树)
3.散列表(即哈希表)是一种通过散列函数将关键字映射到存储位置的数据结构
4.二叉树是一种每个结点最多有两个子结点的树结构
15 .哈希表(可以根据一个key值来直接访问数据,因此查找速度快)
一般来说,实现哈希表可以采用两种方法:
- 数组+链表
- 数组+二叉树
举个栗子:(想到一等效替代法)
10.最长公共子序列相关的题
下面给大家欣赏一下原稿,由于wps简体中文版本十分丑陋,而本人又没有VIP,所以只有用比丑陋的WPS简体中文版本,稍微好看一点,但是还是十分丑陋的WPS繁体中文ฅʕ•̫͡•ʔฅ( ⁼̴̀ .̫ ⁼̴ )✧
不要在意5这个细节ʕ•̫͡• ʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ
上面那张图有点看不清ヽ(✿゚▽゚)ノ,所以又发了一遍,再此感谢c知道
完结,撒花🎉