Coursera Algorithm Ⅰ week1 编程作业 percolation

代码: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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值