WC2017 Day4
计算机架构和程序底层优化
- 卡常!卡常!
- 好像就是洛可强论文内容
0x00 信息的表示和处理
- 二进制
整数的表示
- 位向量
- 16进制
字长?
- NOI Linux:32位
- 这导致NOI Linux系统处理64位整数很慢
- 大多数操作系统:64位
字节顺序?
- 小端法
- 大端法
- 绝大多数个人计算机使用小端法
有符号数
- 取反加一
四则运算
- 除法向零取整(c++)
位运算与逻辑运算
- 逻辑运算是短路的,1||i++并不会使i+1
- 负数的移位运算并不好使,可能和你想象的不一样
- 移位超过字长是未定义的,可能会出错
浮点数
- 没什么好讲的
编程技巧
- 整数当作位向量使用
- 求1的个数?
- 查表
- 求后缀0的个数?
- 二分法
- 查表法
- LOWBIT?
- x & -x
- bitset!
- 用整数表示集合
- 优化状压DP
0x01 程序的底层表示
机器指令
- 汇编语言 第三版
好书
- 加减乘很快
- 除法很慢
跳转很不稳定
除法优化
- 少取模
- 除以常数的优化
- 《论程序底层优化的一些方法和技巧》 洛可强 2009
0x02 CPU基础知识
数字逻辑电路
组合逻辑电路
CPU的实现
- 线性
- 流水线,会出问题
- 解决方案:加Bubble,转发(Forwarding),分支预测
- 现代CPU:超标量(多核),乱序执行
编程技巧
- 用三元运算符(a>b?a:b)取代条件跳转,消除分支预测错误
- 四路归并
0x03 层次存储方式
- 磁盘(HDD)
- 随机访问储存器(RAM)
- 固态硬盘(SSD)
- 寄存器 (Register)
局部性
- 时间局部性
- 空间局部性
编写高速缓存友好的代码
- 优化局部性
- 避免使用步长为$ 2^n $的访问方式
线性代数
矩阵的转置
- 沿对角线翻折
行列式
- 消元后主对角线乘积,或者递归求解
- |A||B|=|AB|
- 交换两行,行列式取反
把一行乘以c加到另一行上,行列式不变
下面都是什么玩意
数据压缩算法和通信问题
0x01 一些通信题
0x02 数据压缩算法
无损压缩
- 主要用于文本压缩
- 基于文本结构的压缩
- 基于信息熵的算法
有损压缩
- 主要用于图片压缩
信息熵
- $ H=\sum -p_{i}\log{p_{i}} $
- pi为每种字符出现的频率
- aaaaaab与ab
- 英语与汉语
压缩算法?
- 游程编码
- BWT
- 哈弗曼编码
- 算数编码
- RAR
- ZIP
图片压缩算法?
- DFT
- DCT
- SVD
总结
- 明天WC2017
- gtmd
- rp++