tips:https://www.cnblogs.com/onepixel/articles/7674659.html十大经典排序算法
开发有效算法的流程:
1-建立问题模型
2-提出算法解决问题
3-运行时间、存储空间不足--找出问题所在--提出新算法
以上为设计和分析希算法的科学途径,找出问题的实质,通过实践验证模型,进而改进模型和方法。
2-1 动态连通性问题 Dynamic connectivity
即 并查集问题的模型
连接
连通分量:互相连接的对象的最大集合
java中:创建UF类,包含两个方法:1 实现合并;2 连接查找,返回一个布尔量。构建器需要对象的数量
由此建立数据结构。
PS:当实现算法时,对象的数量和操作的数量是巨大的,可能有大量合并与连接查找的操作,此时算法的高效尤为重要
测试:在处理更深层的问题之前,需要检查应用程序接口API的设计。
2-2-快速查找 Quick-find
attention here:
—> union(1,3)把1的内容改成3
—> 合并时,把if语句中的pid写成索引值p
快速查找算法的效率:
查找:常数次
合并:查找他们是否连通-N²次,太慢不可取
2-3- 快速合并
合并具体示例:
attention—>union(根节点,子节点),当根节点在一个连通分量里,那么子节点连接在连通分量的根节点上;当子节点在一个连通分量里,那么连通分量的根节点连接在包含根节点的连通分量根节点上。
具体实现:
效率:
虽然比快速查找法快速,但也很慢。
当树很高,查找操作代价很大。每个子节点都需要遍历。
2-4 快速合并的改进 Quick union improvement
方法1:权重weighting
任意节点x的深度是以2为底N的对数