CSP初赛易错易考基础知识点(自用)
文章为众多博客内容的整合,参考的博客会在文末放出链接
三目运算符:
(表达式)?(成立操作):(不成立操作)。
二叉树:
前/先序遍历:根 \(\rightarrow\) 左子树/儿子 \(\rightarrow\) 右子树/儿子。
中序遍历:左子树/儿子 \(\rightarrow\) 根 \(\rightarrow\) 右子树/儿子。
后序遍历:左子树/儿子 \(\rightarrow\) 右子树/儿子 \(\rightarrow\) 根。
遍历的特殊结论
前/先序遍历 + 中序遍历 = 确定二叉树。
后序遍历 + 中序遍历 = 确定二叉树。
特殊的二叉树及其性质
满二叉树/完美二叉树:所有叶结点的深度均相同的二叉树称为满二叉树/完美二叉树。
完全二叉树:只有最下面两层结点的度数可以小于 2,且最下面一层的结点都集中在该层的最左侧。
对于一棵满二叉树/完美二叉树,其深度为 \(k\),则其节点总数为\(2^{k-1}\) ,此结论可逆。
对于一棵满二叉树/完美二叉树/完全二叉树,若任意节点(除叶节点外)的编号为 \(i\),其左儿子的编号为\(2_i\),右儿子的编号为 \(2_{i+1}\)。此结论可逆,证明显然。
字符串:
主定理讲解博客
各种排序算法
图片/视频占用储存空间的计算
小数的进制转换:
十进制转换为n(二、八、十六)进制:
乘n取整,整数正序排列。
如:十进制的a转二进制,a不断乘以2,变成1为止,每次乘了后把整数取出来。(0.6875)10=(0.1011)2
n(二、八、十六)进制转换为十进制:
小数点后从左往右逐位乘以n的(-1,-2,-3..)次方,再相加。
如:二进制的a转十进制,小数点后从左往右每一位逐位乘以1/2、1/4、1/8、1/16...
前中后缀表达式:
前缀表达式:
- 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。
- 举例:(3+4)*5-6的前缀表达式为
- * + 3 4 5 6
.
求值原理:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
求前缀表达式:- * + 3 4 5 6的值:
1. 从右至左扫描,将6、5、4、3压入堆栈;
2. 遇到 + 运算符,因此弹出3和4(3为栈顶元素,4为次顶元素),计算 3+4 的值,得7,再将7入栈;
3. 接下来是 * 运算符,因此弹出7和5,计算 7*5=35 ,将35入栈。
4. 最后是 - 运算符,计算 35-6 的值,即29,得最终结果29.
中缀表达式
- 中缀表达式就是常见得运算表达式,如(3+4)*5-6。
- 中缀表达式求值是我们人熟悉的,但是计算机不好操作,往往会将中缀表达式转成其他表达式来操作。
后缀表达式
后缀表达式称逆波兰表达式,与前缀表达式相似,只是运算符于操作数之后。
举例: (3+4)*5-6的后缀表达式为3 4 + 5 * 6 -
后缀表达式计算机求值
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算。并将结果入栈;重复上述过程直到表达式最右端,最后算出的值即为结果。
举例: 求 (3+4)*5-6 的后缀表达式 (3 4 + 5 * 6 -)
1. 从左至右扫描,将3和4入栈;
2. 遇到运算符 + ,因此弹出4和3,计算 3+4 的值,再将7入栈;
3. 将5入栈;
4. 接下来是 * 运算符,因此弹出5和7,计算出 7*5=35,将35入栈;
5. 将6入栈;
6. 最后是 - 运算符,计算 35-6 的值,即29,由此得出最终结果。
中缀表达式转换为后缀表达式
1. 初始化两个栈:运算符栈s1和储存中间结果栈s2;
2. 从左至右扫描中缀表达式;
3. 遇到操作数时,将其压入s2;
4. 遇到运算符时,比较其与s1栈顶运算符的优先级:
(1)如果s1为空,或栈顶运算符为左括号“(” ,则直接将此运算符入栈;
(2)否则,若优先级比栈顶运算符高,也将运算符压入是s1;
(3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到4.1步骤与s1中新的栈顶运算符相比较;
5. 遇到括号时:
(1)如果时左括号“(” ,则直接压入s1;
(2)如果是右括号“)” ,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
6. 重复步骤2至5,直到表达式的最右边;
7. 将s1中剩余元素依次弹出并压入s2;
8. 依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式。
哈希冲突解决方法-线性探测
如哈希表大小M = 7, 哈希函数:H(K) = K mod M。插入这些值:701, 145, 217, 19, 13, 749
H(K) = 701 % 7 = 1
H(K) = 145 % 7 = 5
H(K) = 217 % 7 = 0
H(K) = 19 % 7 = 2
H(K) = 13 % 7 = 1(冲突) --> 2(已经有值) --> 3(插入位置3)
H(K) = 749 % 7 = 2(冲突) --> 3(已经有值) --> 4(插入位置4)
补码反码
1、原码
顾名思义,原码就是十进制数直接转换成二进制之后直接形成的二进制编码。
2、补码
正数的补码是本身,负数的补码是其反码加一。
3、反码
顾名思义:正数的反码是本身,负数的反码是其除符号位之外的所有位按位取反的结果。