这一栏跟着我重新过一遍算法:一部分为了 HFT 和互联网面试的代码题,一部分为了比赛:比赛后半段的数学题归我。先看地图,后面每学完一块,就在这里补一篇。
地图:要学什么、按什么顺序
点图打开可交互的版本:点一个框看它解决什么、什么时候想到它;上面的按钮是几条路线,一步一步看先学什么。
算法竞赛和面试算法的学习笔记,从一张地图开始。
这一栏跟着我重新过一遍算法:一部分为了 HFT 和互联网面试的代码题,一部分为了比赛:比赛后半段的数学题归我。先看地图,后面每学完一块,就在这里补一篇。
点图打开可交互的版本:点一个框看它解决什么、什么时候想到它;上面的按钮是几条路线,一步一步看先学什么。
这一轮的四样东西都在数组上做查询,目标都是把暴力的 $O(n^2)$ 降下来。降得下来,靠的是两种性质:一种是单调性(二分、双指针),一种是能相减的累计量(前缀和、差分)。复杂度放在最前面,因为它决定一道题该往哪个方向想。
比赛后半段的数学题,难点很少在定理本身:定理大多能背下来,卡住的地方是看不出这道题该用哪一个,或者看出来了却推不到能写代码的那一步。所以这篇不按定理排,按赛场上的动作排:先讲一道数学题拿到手怎么走(第 1 节),再分数论、组合计数、线性代数三块,每样东西都讲它解决什么、题面上什么信号该想到它、式子怎么推出来(第 2 到 4 节),最后从题面开始完整写三道题(第 5 节)。
给 $n$ 个数,从中任选一些异或起来,最大能得到多少?$n = 50$ 时子集有 $2^{50}$ 个,枚举不动。可是这些子集的异或值里有大量重复:$a$、$b$、$a \oplus b$ 三个数,任选子集能得到的值和只用 $a$、$b$ 时一模一样,第三个数是多余的。把多余的数一个个去掉,剩下的数最多 60 个(每个数 60 位),能异或出的值却一个不少。剩下的这组数就是线性基。要说清楚“多余”是什么意思、为什么最多剩 60 个,需要把异或放进线性代数 …