场景一
小时候去商场玩时,爸爸妈妈经常告诉我,如果你在商场走丢了,千万不要到处乱跑,站在原地不动就好了,我们会来找你的。
长大后学了计算机才明白,原来那个时候爸爸妈妈就已经会用DFS算法。如果我在原地等待他们,爸爸妈妈就可以通过记忆进行搜索,时间复杂度变为O(N)(N指商场面积),很快就可以找到我了。
场景二
假如一个很小且混乱的桌子,你很容易就找到了自己需要的东西,这是一个很经典的算法LRU Cache。假如你每次都往桌子上随意放东西,实际上每次放的东西都是处于堆顶。假如你每次都将东西进行整理,但是没有记住每件东西所存放的位置,这种效率要比随便乱放东西低一个层级,不过是浪费时间而已。
场景三
假设你想到了某个正则语言,通过编写程序不断询问某个句子是否是这门正则语言,经过一定次数的询问后,能够得到这门正则语言相应的DFA,即Angluin‘s Learning Algorithm算法。
场景四
KMP和相关联的AC(Aho-Corasick)自动机,刚了解时误以为是自动AC机,后来使用后,算法中的效率和思想真的是惊喜到我了。
场景五
FFT(快速傅立叶变换)算法,对n次多项式乘法计算时,时间复杂度为。
扩展欧几里得算法,代码行数少且容易记忆,在做数论题时,求解不定时方程、乘法逆元等经常使用。
快速幂取模算法,求解k阶矩阵的n次方时,复杂度为k3。想要使用好这个算法,得对它进行充分的理解,理解之后代码写起来容易,计算效率很高。
自适应辛普森算法,主要解决所有一维定积分,代码行数20行,算法中主要采用递归计算三点辛普森公式。
场景六
Streaming算法。这个是在之前面试中被问到的,当时听到这个问题时,大脑是处于懵逼状态,因为根本就没有接触过这个算法。问题大致是:给一个未知长度的Streaming data,在Streaming结束时返回n个等概率的data。
我当时的第一反应是,未知长度,概率肯定也是未知的,这怎么可能还能保证等概率???
后来我去研究了一番,这个算法刷新了我的认知,简直令我惊叹,居然这么简单。首先将前n个data进行保留,对后面进来的data,通过概率选择是否保留,即用n除以i(i为当前data位置)得到概率;如果进行保留,将之前保留的data随机删除一个,最后在返回n。该算法的复杂度为o(L)。