初赛错题相关知识
强弱类型编程语言
音频、视频、图片存储空间计算
图片
水平方向像素数 \(\times\) 竖直方向像素数 \(\times\) 色彩位率 \(=\) 图片所占空间(\(\text{Bit}\))。
除以 \(8\times 1024\) 得到 \(\text{KB}\)。
视频
若干张图片叠加。每张图片所占空间 \(\times\) 秒数 \(\times\) 每秒的帧数。
音频
秒数 \(\times\) 采样率 \(\times\) 位深 \(\times\) 单双通道 \(=\) 音频所占空间(\(\text{Bit}\))。
vim 编辑器
https://zhuanlan.zhihu.com/p/624892621
空间换算
\(\text{B}\) 结尾 \(1000\) 单位一换算。
\(\text{iB}\) 结尾 \(1024\) 单位一换算。
竞赛图
竞赛图,也就是有向完全图。每对顶点间有一条有向边称为竞赛图。
有 \(1\sim 5\) 的点的竞赛图分别为 \(1,1,2,4,12\)。
兰道定理
兰道定理是用来判断竞赛图的定理。
将一个竞赛图的每一个点的出度从小到大排序后的序列记为竞赛图的比分序列。
一个长度为 \(n\) 的序列 \(s_i\) 是合法的比分序列当且仅当:\(\forall i\in \left[1,n\right],\sum\limits_{j=1}^i s_j\ge \tbinom{n}{2}\),且 \(i=n\) 时等号一定成立。
性质
- 竞赛图缩点后呈链状。缩点后前面的点向后面的每个点连边。
- 竞赛图的每个强连通分量存在哈密顿回路。
- 竞赛图存在一条哈密顿路径。
- 竞赛图没有自环,没有双元环。若有环,则一定有三元环。
C++ sizeof 计算
https://blog.csdn.net/qq_41610710/article/details/105646168
int
占 4 字节,long long
占 8 字节,char
占 1 字节,bool
占 1 字节。数组开多少位就占多少位。指针无论什么类型都占 4 字节。
string
类型无法使用 sizeof
。
struct
的 sizeof
则是其中所有变量中的 sizeof
最大值的整数倍(变量的个数倍)。如一个 int
和 一个 char
的 sizeof
为 8。
union
和 enum
则是变量 sizeof
的最大值。
另外,int8_t
、int16_t
这些类型,数字代表其 \(\text{Byte}\) 大小,除以 8 是 \(\text{Bit}\)。
C++ strlen 计算
计算字符串长度,以 \0
结尾。注意 0 后不能接数字。
如果没有,则随机返回一个值。
IP 地址
xxx.xxx.xxx.xxx
A、B 类等,以第一个数字作为区分。
类 | 范围值 |
---|---|
A | 0$\sim$127 |
B | 128$\sim$191 |
C | 192$\sim$223 |
D | 224$\sim$239 |
E | 240$\sim$255 |
A、B、C 类为主要分配地址。D类用于组播。E类保留作研究使用,因此网络上没有可用的 E 类地址。
排序
以从小到大为例。
选择排序
每次从第 \(i+1\) 到第 \(n\) 个找到最小的 \(j\) 跟 \(i\) 交换。
最好 \(\mathcal O(1)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n^2)\)。不稳定。
特点:每次排序完开头一定是有序的。
冒泡排序
每次比较 \(i\) 和 \(i+1\),若 \(i+1\) 更小则交换。
最好 \(\mathcal O(n^2)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n^2)\)。稳定。
特点:每次排序完末尾一定时有序的。
插入排序
每次将当前数插入至当前有序数组中合适的位置。
最好 \(\mathcal O(n^2)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n^2)\)。稳定。
希尔排序
每次以 \(k\) 为间隔,将对应子序列进行插入排序。然后逐渐减小 \(k\),最终当 \(k=1\) 时就完成了排序。
最好 \(\mathcal O(n)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n^{1.5})\)。不稳定。
堆排序
构建堆,每次加入数字,进行上移操作。
最好 \(\mathcal O(n)\),最坏 \(\mathcal O(n\log n)\),平均 \(\mathcal O(n\log n)\)。不稳定。
特点:可以做到只求前几大的数字。
归并排序
分治。每次将两个排序好的有序数组再次排序。
最好 \(\mathcal O(n\log n)\),最坏 \(\mathcal O(n\log n)\),平均 \(\mathcal O(n\log n)\)。稳定。
快速排序
分治。每次选定一基准点,按照与基准点的大小关系分成两半,然后继续排序下去。
最好 \(\mathcal O(n\log n)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n\log n)\)。不稳定。
计数排序
记录每个数出现的次数,计算出每个数之前的数出现的次数 \(s_i\)。从后往前遍历数组,将元素 \(i\) 填在第 \(s_i\) 的位置,\(s_i\) 减 1。
最好 \(\mathcal O(n+k)\),最坏 \(\mathcal O(n+k)\),平均 \(\mathcal O(n+k)\),\(k\) 表示极差。稳定。
桶排序
将每个数划分到不同的桶(桶按该划分方式是有序的)中,每个桶单独排序,然后汇总。
最好 \(\mathcal O(n+k)\),最坏 \(\mathcal O(n^2)\),平均 \(\mathcal O(n+k)\)。\(k\) 表示极差(可能)。不稳定。均匀分配到桶中时时间复杂度为 \(\Theta (n)\)。
基数排序
按照各数字个位的大小顺次进入到不同的桶中(10 个桶代表着 \(0\sim 9\)),再按照 \(0\sim 9\) 的顺序依次取出所有的数字。此时得到的序列在个位数上时单调不降。然后再按照十位、百位依次排序即可得到排序完成的序列。
最好 \(\mathcal O(nk)\),最坏 \(\mathcal O(nk)\),平均 \(\mathcal O(nk)\)。\(k\) 表示最大的位数。稳定。