随机化/奇技淫巧
尚未分类
二进制分组
把图/问题按二进制分为几组,分开来跑一些算法。目前没发现太多的应用。一般用于:一个点既可能是起点又可能是终点,或者既可能有某种性质也可能没有这种性质。
这个方法被运用于很多精妙的算法:如 hamming校验码。
一个用途
例题:有个图,图中有些特殊点,求特殊点互相距离的最小值(距离指最短路径)。
做法:将点的编号二进制拆位。第 \(i\) 次,根据每个关键点第 \(i\) 位是1还是0来分成两组。以其中一组关键点为起点跑多源最短路(dijkstra),并以另一组关键点为终点。复杂度 \(O(m\log (m)\log (n))\) 大约是 \(O(n\log^2 n)\) 。因为一对点在这些情形中一定会被分到不同的组至少一次,因此有正确性。
差分求点双、边双连通分量
对每条边的两端异或一个相同的值(最好特异一点,如随机数),然后在dfs树上求子树和,如子树和为 0 则是边双连通分量。
点双也是类似的。
这种做法有概率错,就像哈希表一样,有可能被卡。
奇技淫巧
打表/找规律
对于输入只有几个数,时限在 \(O(1)\) 左右的题目。考虑用复杂度不正确的程序跑一些小样例观察规律。再不济可以暴力算出答案存进数组里,这样就可以 \(O(1)\) 查询了。(数组也是数据结构[Doge])
找规律时,可以考虑猜几个规律,带入样例和打出来的表观察不同之处,说不定东拼西凑就出来了呢。

浙公网安备 33010602011771号