CSP-J 总结
内存数据
速度越快,通常容量越小,价格越高
bit(b)→8Byte(B)→1024KB→1024MB→1024GB
其中 bit 为最小单位,Byte 为基本单位。
数值在计算机中是以补码的方式存储。
以下是原码反码补码的例子:
|
正数 |
负数 |
| 原码 |
00001001 |
10001001 |
| 反码 |
00001001 |
11110110 |
| 补码 |
00001001 |
11110111 |
其中数字的第一个字符为符号位,0 为正数,1 为负数。
原码是原本的数值的二进制,第一位是符号位,例如十进制的 3 的原码是 00000011,十进制的 −3 的原码是 10000011。
反码是原码除了符号位的数值都取反,例如十进制的 3 的反码是 01111100,十进制的 −3 的补码是 11111100。
补码是在反码的基础上加 1,包含进位。例如十进制的 3 的补码是 01111101,十进制的 −3 的补是 11111101。
各类大小
有符号 n 位二进制整数范围为 [−2n−1, 2n−1−1]。
无符号 n 位二进制整数范围为 [0, 2n−1]。
图片大小计算公式为:
宽×高×每位像素位数 (÷8 Byte)
例如,1920×1080 的 24 位真彩色图像:
1920×1080×24÷8=6220800 B≈ 5.93 MB
音频大小计算公式为:
采样率×量化位数×声道数 (单声道为1,双声道为2)×时同 (÷8 Byte)
视频大小计算公式为:
每帧图像大小×帧率×秒 (÷8 Byte)
数据类型
char : 8 位,1 字节
short : 16 位,2 字节
int : 32 位,4 字节
long long : 64 位,8 字节
float : 32 位,4 字节
double : 64 位,8 字节
进制转换
简单的英文进制表示符:
| 字母 |
进制 |
| B |
二 |
| O |
八 |
| D |
十 |
| H |
十六 |
当 0x 作为开头是十六进制。
整数部分十进制转为 k 进制(短除法):
例子:十进制的 10 要转为二进制。10÷2=5 ⋯ ⋯0,5÷2=2 ⋯ ⋯1,2÷2=1 ⋯ ⋯0,1÷2=0 ⋯ ⋯1,所以二进制为 (1010)2=(10)10。
小数部分十进制转为 k 进制:
例子:十进制的 0.625 要转为二进制。0.625×2=1.25⋯ ⋯1,0.25×2=0.5⋯ ⋯0,0.5×2=1⋯ ⋯1,所以二进制为 (101)2=(0.625)10
整数部分 k 进制转为十进制:
例子:二进制 1001 要转为十进制。
18(23)04(22)02(21)11(20)
将原本得值乘上权值。
1×1+1×8=1+8=9
所以 (9)10=(1001)2。
小数部分 k 进制转为十进制:
例子:二进制 0.101 要转为十进制。
0.10.5(k−1)00.25(k−2)10.125(k−3)
将原本得值乘上权值。
1×0.5+1×0.125=0.625
位运算
位运算一共有 6 种,都是在补码的形态下计算的,包括:
- 按位与
&
- 按位或
|
- 按位异或
^
- 按位取反
~
- 左移
<<
- 右移
>>
按位与
| a |
b |
a & b |
| 0 |
0 |
0 |
| 1 |
0 |
0 |
| 0 |
1 |
0 |
| 1 |
1 |
1 |
按位或
| a |
b |
a ∣ b |
| 0 |
0 |
0 |
| 1 |
0 |
1 |
| 0 |
1 |
1 |
| 1 |
1 |
1 |
按位异或
| a |
b |
a ^ b |
| 0 |
0 |
0 |
| 1 |
0 |
1 |
| 0 |
1 |
1 |
| 1 |
1 |
0 |
右移
n>>m=⌊2mn⌋
左移
n<<m=n×2m
特殊性质
- a ∣ b≥max(a,b)
- a & b≤min(a,b)
- a ^ b≤a+b
- ∼x=−(x+1)
链表和指针
链表有分单向链表和双向链表。
单向链表中间插入:(在 a 节点后插入 b 节点)

① b→next=a→next
② a→next=b
单向链表删除节点:(删除 b 节点)

① a→next=b→next
双向链表中间插入:(在 a 节点后插入 b 节点)

① b→next=a→next
② a→next=b
③ b→pre=a
④ b→next→pre=b
双向链表删除节点:(删除 b 节点)

① b→pre→next=b→next
② b→next→pre=b→pre
栈和队列
栈
队列
树
二叉树的性质
- 二叉树第 i 层上最多有 2i−1 个节点。(根在 1 层)
- 深度为 k 的二叉树只多有 2k−1 个节点。(根在 1 层)
- 任意一根二叉树,若其叶子结点的数量为 n0,度为 1 的数量为 n1,度为 2 的数量为 n2,则 n0 与 n2 一定满足 n0=n2+1 和 n=n0+n1+n2。
- 具有 n (n≥0) 个节点的完全二叉树的深度为 ⌊log2(n)⌋+1。
- 若将一颗有 n 个节点的完全二叉树自顶而下,同一层自左向右连续给节点编号 1,2,⋯,n ,则:
- 针对编号为 i 的节点:
- 其左孩子的编号为 2×i (2×i≤n)
- 其右孩子的编号为 2×i+1 (2×i+1≤n)
树的遍历
- 先序遍历(根左右)
- 中序遍历(左根右)
- 后序遍历(左右根)
哈夫曼树
构造
先排序然后两两一组,得出了和之后将和插入,继续循环直至没有值。
带权路径长度
带权路径长度计算公式如下:
带全路径长度 (WPL)=∑(叶子权值×叶子到根的边数)
图
简单图为没有自环和重边。
多重图为有自环或重边。
完全无向图含有 2n×(n−1) 条边。
有向完全图含有 n×(n−1) 条边。
排序
- 冒泡排序
- 选择排序
- 插入排序
- 左边始终有序,当前值找到位置插进去,第 k 趟后,前 k+1 个元素一定是有序的。
定义稳定性为:如果两个元素关键字相同,排序后他们的相对先后顺序不变。
| 排序算法 |
稳定性 |
| 冒泡排序 |
✔ |
| 选择排序 |
✖ |
| 插入排序 |
✔ |
| 计数排序 |
半稳定 |
前中后缀表达式
中缀 → 后缀
例子为:
a+b×c−(d+e)
- 对所有的运算按优先级增加括号:
((a+(b×c))−(d+e))
- 从内到外江运算符移动至操作数后:
((a (b c ×)+) (d e +) −)
- 去括号:
a b c×+ d e+−
中缀 → 前缀
例子为:
a+b×c−(d+e)
- 对所有的运算按优先级增加括号:
((a+(b×c))−(d+e))
- 从内到外江运算符移动至操作数前:
(− (+ a (× b c))(+ d e))
- 去括号:
− + a × b c+ d e
后缀 → 中缀
例子为:
a b c×+ d e+−
- 从左到右遍历,如果遇见符号就将符号插入前面两个值得中间并加上括号:
a (b×c) +d e +−
(a+(b×c)) d e +−
(a+(b×c)) (d+e) −
((a+(b×c))−(d+e))
- 去掉可以去的括号:
a+b×c−(d+e)
前缀 → 中缀
例子为:
− + a × b c+ d e
- 从右到左遍历,如果遇见符号就将符号插入前面两个值得中间并加上括号:
− + a × b c (d+e)
− + a (b×c) (d+e)
− (a+(b×c)) (d+e)
((a+(b×c))−(d+e))
- 去掉可以去的括号:
a+b×c−(d+e)
后缀 → 前缀
现把后缀转为中缀,再将中缀转为前缀。
前缀 → 后缀
现把前缀转为中缀,再将中缀转为后缀。
排列组合
从 n 个数中取 m 个数的排列被记为 Anm 或 Pnm 的排列。
全排列是当 n=m 的特殊情况。
Anm=n×(n−1)×(n−2)×⋯×(n−(m−1))
=(n−m)!n! (0!=1)
Anm=Cnm×Amm
Cnm=m!(n−m)!n!=Cnn−m
排列组合的方法
有任何问题可以纠正!
有帮助,赞一个