本节将从动态连接性算法(并查集问题的模型)入手,引入算法分析和设计的整体思路和优化方法,为整个课程的引子部分。
主要内容包括 Quick Find和Quick union算法,以及这些算法的改进。
动态连接性
对于连接做如下定义:
- 自反:p 连接于自身
- 对称:若p连接于q,则q连接于p
- 传递:若p连接q,q连接r那么p连接r
我们的算法需要满足上述关于连接的定义。另外,引出了另一个概念:
连通分量:最大的可连通对象集合,有两个特点:1)连通分量内部任意两个对象都是相连通的;2)连通分量内部的对象不与外部对象相连通。
功能实现:
我们需要设计一个类,该模型具有如下功能:
- 现有N个对象,可以任意连接任意两个对象
- 有一个方法,可以得知任意两个对象是否连接
图示如下:
image.png
先来看解决这类问题的第一种方法:Quick Find.
Quick Find
快速查找是基于贪心策略的一种算法,贪心策略是指在问题求解的时候,只找出当前最优解。
基于此,设计一种数据结构来存储实验对象。
-
长度为N的整型数组
-
如果p和q有相同的id,则表示他们有连接
image.png
定义一个类描述上述模型 该类的名称成为QuickFindUF:
public class QuickFindUF