《Algorithms》摘录评注之壹:绪论

本笔记基于ROBERT SEDGEWICK & KEVIN WAYNE开设的《Algorithms》课程,同时配有同名教材。
slides本身内容丰富详实,所以我会先甄选出重点的篇幅整理出来并做简单批注,后续会添上对应算法题的演示。

课程总览:
image_1anntk63i12c61im5qn91nf6185b2a.png-144.2kB
image_1anntnleo1b4d1l1u1749edf55h2n.png-116.1kB

使用Quick-Find方法来解决,直接对数组的每一个元素进行检查和操作:
image_1anntorff1qrj1a1i5l1f9n1cgf3h.png-82.6kB
代码实现:
image_1anntpvmr1ek3prncji1tbi1tq94b.png-60.2kB

使用这个方法的问题是成本太高了,对N个目标进行Nunion连接操作共需要访问数组N²次。
试一试别的方法:使用Quick-Union(懒人方法),通过对元素的“根”来进行检查和操作。
image_1anpn728n3du3bck1f162g1bms9.png-69.9kB
代码实现:
image_1anpn838v3bjlh9fqhsk11ka61g.png-61.3kB
image_1anpn8jkq2gf1aisnicus61kc49.png-54.7kB
但这个懒人办法也太慢了。前一个Q-Findunion操作要访问N次数组,同时它的“树”(把元素连接起来的样子想象成是树的枝桠)是扁平的,但是保持这样的扁平代价太大;后一个Q-U的“树”会变得非常高,使其find操作也可能需要访问N次数组。那怎么办呢?只要在操作树的时候进行“权衡”就能两全其美啦:
image_1anpn992ese0114k13n21703kp13.png-68.2kB
image_1anpn9fdmnkgbnd4eql4l6nf1g.png-116kB

“权衡”之后Q-Union的树不再肆意地乱长,而是根据以小服大的方式比较均衡扁平地排列开来了。再想一想,还可以把树变得更加扁平吗?
image_1anpna0setho17se1ifn1h3k17ul2a.png-58.6kB
image_1anpna5uv9g51s9lst9anq1spu2n.png-54.9kB
对,使用路径压缩!将检查过后的节点直接指向根,这样树就进一步扁平了。
对解决动态连接问题的这几种方法总结、对比一下,我们要追求在最坏情况下效率最高(成本最小)的方法:
image_1anpnaltkkdt43n1csu1b6o1j573h.png-60.4kB
现在来简单看一看如何分析算法(的效率/成本):
image_1anpnb3s41fjbpal1v78vft1n5n4b.png-78.4kB
image_1anpnb9pm13l223p1o9rcgsrfv4o.png-58.5kB
使用“约等于”的波浪号标记来简化数字进行分析:
image_1anpnbvvrdja1bof19uonno4pb5i.png-93.4kB
来看一下不同算法复杂度的增长速度:
image_1anpnceq10hga6lpqphv376c.png-116.6kB
常用的用来标记算法复杂度的符号说明:
image_1anpng5lrk3jbq5gu81n7g1q1i7j.png-42.8kB

每篇文章除特殊声明外均以 CC BY-NC-SA 4.0 协议发布,非商业用途可以在保留署名和来源的情况下任意转载。