关于算法,那些你不知道的事

这篇博客探讨了算法的广阔世界,超越了刷题的范畴,重点关注随机化算法和一些不常见的数据结构。文章介绍了随机化快速排序、跳表、通用哈希、布隆过滤器和库克过滤器等概念,以及它们在实际应用中的价值。同时,讨论了算法安全性,如复杂度攻击和历史独立性。对于有兴趣深入学习这些高级算法和数据结构的读者,博客提供了相关的推荐资源。

关于算法,那些你不知道的事


1.算法,不止于刷题

提到算法,不管是科班出身还是半路出家的程序员可能都会说上几句,算法谁没学过谁不知道啊?对于走工业界路线而非学术路线的同学来说,算法学习的最大作用也许是找工作…… 毕竟工作后,绝大多数时候都用各种成熟的类库,少有自己实现高级数据结构和算法的时候。但刚结束一学期修的算法课,上得我还真跟没学过算法似的,让我大开眼界,虽然每次课上我都听的不是很懂,但每节都期盼着老师又能带来什么新奇的东西。一点点发现,原来竟然还有这么多很有用却从来没学习过甚至没听过的算法和数据结构啊!

这些可以算作比较前沿的研究成果了,而且又不是离我们的日常工作非常遥远的纯理论,所以个人觉得这些知识非常值得学习,哪怕只是了解一下开拓思路。参考资料的话,除了下面每节提到的具体论文外,系统介绍这些高级算法和数据结构的书还真是凤毛麟角,不过还真发现了一本:Peter Brass的《Advanced Data Structures》。此外的话,就是老老实实地看原作者或分析得比较好的论文,这也是这学期练成的一项能力。当然,有的论文挺难的,我们可以节选着看,大多数时候还是看的挺享受的!


2.随机化算法(Randomized Algorithms)

随机化(Randomization)是这门课的重点,也是以前一直忽略了的,现在却发现非常重要的算法设计策略。在《Introduction to Algorithm》(这门课的教材)中有一些系统的讲解和举例,但这本经典教材毕竟不是专门讲随机化算法的。专攻于这一方面的经典书籍是Motwani Raghvan的《Randomized Algorithms》,以及稍微现代化一些的《Probability and Computing: Randomized Algorithms and Probabilistic Analysis》,但对于我来说,这两本真的都太难了!如果像我一样只是有些感兴趣,想稍微系统了解一下的话,推荐认真学习一下《Algorithm Design》中第13章随机化算法就可以了,这一章内容从基本定义、w.h.p.、到常见随机化算法和数据结构的分析,已经足够详细了~


2.1 Randomized Quicksort

就像归并排序的关键在Merge函数一样,快速排序性能的关键就在Partition函数。但因为我们无法控制输入数据的样子,所以这时一般求助于随机化思想。随机化快速排序采取的策略有两种:1)随机选取Pivot;2)随机采样三个数取中位数。两种方式都能达到O(nlogn)。第一种方式的证明在CLRS中有详细解释,第二种方式在书中是以Problem习题形式出现的。当时在课上老师直接将这个看似挺难的问题分析,轻描淡写地转化到了掷硬币模型中,四两拨千金,给人感觉很震撼!

推荐阅读:这两种方式在《Introduction to Algorithm》中有详细的性能分析,也可以通过《Algorithm Design》补充学习,里面的证明方法能稍微容易理解一些。


2.2 Skip List

因为之前工作中重点研究过Redis的缘故,所以对Skip List有些了解,Redis中Dictionary数据结构就是用Skip List而没采取红黑树的方式实现的。当时了解是因为Skip List实现简单、缓存locality好等,但不清楚原来跳表是一种随机化数据结构。每个新插入的Key是通过反复投掷硬币(Flip a fair coin)来决定是否将其Promote到向上一级。怎么样,挺有意思的吧!但奇怪的是,很多算法书里都对Skip List只字未提,包括后面要讲到的在大型分布式系统中非常重要的Bloom Filter。

skiplist

推荐阅读

  1. 作者论文:《Skip Lists: A Probabilistic Alternative to Balanced Trees》
  2. 实现:Sedgewick的《Algorithm in C, 3rd edition》中13.5节。
  3. 基于CLRS的
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值