1-1设计一个算法的步骤:
Steps to developing a usable algorithm.
・Model the problem.
・Find an algorithm to solve it.
・Fast enough? Fits in memory?
・If not, figure out why.
・Find a way to address the problem.
・Iterate until satisfied.
总结:如何使用算法?首先,问题建模,关键是理解问题四什么?有哪些元素?然后找一个可以解决这个问题的算法。若有很多可用的算法,想明白要如何选择(要空间还是时间?),明白到底要满足什么,然后不断找出最佳解决办法。
动态连通性
对连接做如下定义:
1.自反:p连接于自身
2.对称:若p连接于q,则q连接于p
3.传递:若p连接q,q连接r那么p连接r
连通分量:最大可以连通对象的集合,有两个特点:1)连通分量内部任意两个对象都是相连通的;2)连通分量内部的对象不与外部对象相连通。
功能实现:
需要设计一个类,该模型具有如下功能:
- 现有N个对象,可以任意连接任意两个对象
- 有一个方法,可以得知任意两个对象是否连接
解决这类问题的第一种方法:Quick Find
Quick Find:
快速查找基于贪心策略,支持这个算法的数据结构是一个简单的对象索引整数数组。
算法效率:对代码进行算法复杂度分析
假设我们用这个算法最后得到一个完整的连通分量,那至少需要调用N-1次union(),每次Union中至少需要2+N+1次访问数组:两次访问pid和qid,for循环中有N次访问数组比较操作,以及至少一次的赋值操作。所以我们可以得知,对于最终只得到少数连通分量而言,这种方案一般是平方级别的:(N+3)*(N-1)~N^2.我们尽量避免使用平方级别的算法。