代码:https://github.com/RedemptionC/CourseraAlgorithms/tree/master/percolation
这是学习完并查集后的编程作业,需要提交两个类:percolation和percolationStats
Percolation
问题背景很复杂,但是问题模型就是:判断一个n*n的网格,最下一行是否有full site
所谓full site就是通过一系列的open site(它的上下左右相邻的),和最上一行相连的open site
这里使用并查集来解决问题:
核心代码在构造函数percolation和open里:
在open里我们将传入的坐标对应的点设为open,同时要将它与它上下左右open的点union起来
(实际做的时候使用的是课程提供的UF类,在本文最后面会附上对union find不同实现的笔记)
在percolation里,我们要使用传入的参数n,生成一个n*n的grid,并做一些初始化:
一开头说过,我们要判断的是最上一行和最下一行任两点的连同,所以这里当然要使用虚拟点,一个与最上一行所有的点相连,一个与最下一行所有的点相连
但是这样做有一个问题,本实验提供了一个测试程序:
percolate之后,full site会被显示为淡蓝色,但是很可能不是full site的也成为了淡蓝色,比如右图中的点
这是因为,我们使用了两个虚拟点,如上所述,一旦最下行有一个full site,那么该点与下面的虚拟点相连,而虚拟点又与最下一行所有的点相连,所以只要他是open site,最终都会显示为full site,也就是右图中的淡蓝色
解决方法是使用两个uf对象,一个与上下虚拟点都相连,一个只与上面的虚拟点相连,在判断是否连通(percolate)时,我们使用前者,判断两个虚拟点是否相连,判断是否为full site时,我们使用后者,判断该点是否与上面的虚拟点相连
此外,uf一般是使用一维数组,而这里是n*n,二维,所以要使用一个函数,将二维坐标展平为一维,(x,y)->x*n+y
percolationStats
这里主要是使用上面的percolation类做一个测试:如果每个点open的概率相同,要open多少个点,才能percolate(连通)
重复多次,最终算出均值,方差等统计数据
并查集
总的来说并查集有两种实现:qu