随机化/奇技淫巧

尚未分类

二进制分组

把图/问题按二进制分为几组,分开来跑一些算法。目前没发现太多的应用。一般用于:一个点既可能是起点又可能是终点,或者既可能有某种性质也可能没有这种性质。

这个方法被运用于很多精妙的算法:如 hamming校验码

一个用途

例题:有个图,图中有些特殊点,求特殊点互相距离的最小值(距离指最短路径)。

做法:将点的编号二进制拆位。第 \(i\) 次,根据每个关键点第 \(i\) 位是1还是0来分成两组。以其中一组关键点为起点跑多源最短路(dijkstra),并以另一组关键点为终点。复杂度 \(O(m\log (m)\log (n))\) 大约是 \(O(n\log^2 n)\) 。因为一对点在这些情形中一定会被分到不同的组至少一次,因此有正确性。

差分求点双、边双连通分量

对每条边的两端异或一个相同的值(最好特异一点,如随机数),然后在dfs树上求子树和,如子树和为 0 则是边双连通分量。

点双也是类似的。

这种做法有概率错,就像哈希表一样,有可能被卡。

奇技淫巧

打表/找规律

对于输入只有几个数,时限在 \(O(1)\) 左右的题目。考虑用复杂度不正确的程序跑一些小样例观察规律。再不济可以暴力算出答案存进数组里,这样就可以 \(O(1)\) 查询了。(数组也是数据结构[Doge])

找规律时,可以考虑猜几个规律,带入样例和打出来的表观察不同之处,说不定东拼西凑就出来了呢。

posted @ 2025-02-20 21:10  Luke_li  阅读(3)  评论(0)    收藏  举报