一些过去CSP 的简单题总结出来的小知识

1. const用于声明一个变量, 其值不能被修改

  1. 如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个 节点:首先,我们需要创建一个新的节点。然后,我们为新节点的数据成员赋值42。接下来,我们将新节点的next成员设置为当前的头节 点,最后更新头指针以指向新节点。这样,新节点就成为了链表的第一个节点。
  2. 对于高度为 h 的完全三叉树,其节点数最少为 3^0 + 3^1 + … + 3^(h-1)
  3.  高精度计算主要是用来处理大整数或需要保留多位小数的运算;大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累 加商;高精度加法运算的关键在于逐位相加并处理进位;高精度乘法的运算时间与两个整数的位数都有关,而不仅仅是长度较长者的位数
  4. 哈夫曼编码,又称为 Huffman Coding是一种可变长编码( VLC, variable length coding))方式,比起定长编码的 ASCII 编码来说,哈夫曼编码能节省很多的空间,因为每一个字符出现的频率不是一致的;哈夫曼编码首先会使用字符的频率创建一棵树,然后通过这个树的结构为每个字符生成一个特定的编码,出现频率高的字符使用较短的编码,出现频率低的则使用较长的编码,这样就会使编码之后的字符串平均长度降低,从而达到数据无损压缩的目的。
  5. 哈夫曼编码方法:
  1. 计算字符串中每个字符的频率
  2. 按照字符出现的频率进行排序,组成一个队列 Q出现频率最低的在前 面,出现频率高的在后面。
  3. 把这些字符作为叶子节点开始构建一颗哈夫曼树,哈夫曼树又称为最优 二叉树,是一种带权路径长度最短的二叉树
  4. 对字符进行编码编码原则是:对于每个非叶子节点,将 0 分配给连接线的左侧,1 分配给连接线的右侧,最终得到字符的编码就是从根节点开始,到该节点的路径上的 0 1 序列组合。

有关哈夫曼的题:

f0be5bcbb6f24fb3873229bcd58480c7.png 

做法:合并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。

4b7819070cc04f5090ad38f8551e824a.png 

  1. 前中后序遍历互相转换:

一、前序表达式转换为中序表达式:

从右往左开始,取出一个操作符和操作符右边的两个数进行计算,并将计算的结果放过去,直到计算结束。

二、后序表达式转换为中序表达式:

从左向右开始,取出一个操作符和操作符左边的两个数进行计算,并将计算的结果放过去,直到计算结束,以后序表达式“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. 字符处理完毕,则执行连续的出栈操作,直到栈为空
  2. 再次反转表达式,得到最终的结果.
  3. 一道小题:         a6cf06a13e46446b8e2b1df8d14b5b26.png

 

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.根据上述分析,我们可以得到以下二叉树结构:

5a0ac4e9f5c24d7a8b66173e93b6daca.png

 

  1. 有向无环图:若一个有向图(有向图是一副具有方向性的图,是有一组顶点和一组有方向的边组成的,每条方向的边都连接着一对有序的顶点。全部由无向边构成图称为无向图中不存在环,则称为有向无环图。简称DAG图(Directed Acyclic Graph)顶点中不可能出现重复的操作数。

有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列

  1. 操作系统是管理计算机硬件和软件资源的软件,它为计算机程序提供服务。Linux - Windows - Android - 是一个操作系统,主要用于移动设备,HTML - 是一种用于描述网页的标记语言,不是操作系统。
  2. 最长公共子序列可以不连续,但最长公共子串必须是连续的。
  3. 在 Linux 系统终端中,mkdir命令用于创建一个新的目录

13.Linux 系统中常用命令:

1e38b0f9e49d49b389d777948ba15fc2.png 

  1. 关于数据结构的一些小知识:

1.队列是一种先进先出(FIFO)「即先进先出」的线性结构

  2.哈夫曼树是带权路径长度最短的树,是用来解决最短编码问题的,和树的深度优先搜索无关。( 哈夫曼树通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树)

 

  3.散列表(即哈希表)是一种通过散列函数将关键字映射到存储位置的数据结构

   4.二叉树是一种每个结点最多有两个子结点的树结构

15 .哈希表(可以根据一个key值来直接访问数据,因此查找速度快)

417ccf5baa2146a88eaa67a1fb8da18e.png 

一般来说,实现哈希表可以采用两种方法:

  1. 数组+链表
  2. 数组+二叉树

举个栗子:(想到一等效替代法)

e0d9cbbc6a7a49c78bff5f9675db564a.png 

10.最长公共子序列相关的题66ab0277c0c84e25830a45fc56fb2c3a.png

 

下面给大家欣赏一下原稿,由于wps简体中文版本十分丑陋,而本人又没有VIP,所以只有用比丑陋的WPS简体中文版本,稍微好看一点,但是还是十分丑陋的WPS繁体中文ฅʕ•̫͡•ʔฅ( ⁼̴̀ .̫ ⁼̴ )✧

f1247eb45be647b5bb08a06d128b214d.png 

 

 

5177e8d0a79b4155828e15c84112a200.png

ced5132351974df8b8d8eb6fb38f4c54.png 

e4c419ef126945ab84f18240a4354e20.png 

9bc4cc713fea4262a1b3622ea2079f7a.png 

91835acb96ef4b43b8032a827ed2a68c.png不要在意5这个细节ʕ•̫͡• ʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ

 

7b32e734343247d181ec0f2623a4ce3e.png 

f63831cca8c04125878e86b69e493850.png 

21a6bebbf71f4aebbd2594d84101c7d4.png 

138b2af992a04c7689eec28d9bbaa99b.png 

 

5ef744ba0ccd4fc8aec9a7c945932e5c.png 

 54d7356155df438696ac2e9ccab5599a.png上面那张图有点看不清ヽ(✿゚▽゚)ノ,所以又发了一遍,再此感谢c知道

完结,撒花🎉

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值