Percolation(渗透)问题

Percolation(渗透)问题

@(算法)
Coursera作业链接

直接将马克飞象导出的md文件发到博客,排版不是很清晰,抱歉,可查看GitHub详细代码和文档


实际问题:将一个不透水的均质方块分割为N*N,最上方为水源,随机打开方块中任意格子,重复此项操作多次,产生一条路径使水能穿过这个方块到达最下方。

the model

percolation系统使用n-n格点,每个格点site有open/blocked两种状态,如果最上面一行和最底下一行有路径联通,那说明这个系统是percolates的。
这里写图片描述


这个问题可以和之前学过dynamic-connectivity问题相联系,因为当open一个site后,这个site需要和周边的open site相连接,这里可以使用quick-find、qucik-union、weighted-quickunion算法。
这个问题看起来比较复杂,实则核心就是进行动态连接。


一开始编写代码或者分析的时候思路比较混乱,我使用了二维数组 a[row][col] 来代表这个方形系统,后来直接用一维数组来表达这个方形系统。
Percolation和使用的WeightedQuickUnionUF算法中均有数组来表达这个方形格点,搞得很混乱。


仔细想想,捋清思路,感觉解决算法问题,数据结构的定义和使用需要非常清楚,弄清楚会有事半功倍的效果。

这个实际问题和动态连接区别在于,每个site不仅需要和别的site相连,本身还具备open/block的性质,所以需要单独定义一个数组表示site的open/block性质

之前出现的程序编写之所以不正确,或者思路混乱,是因为数据结构没有理解清楚。本题中的site既要有open&blocked的性质,又得进行Union操作,那本来WeightedQuickUnionUF中只有一组数组用来进行Union,所以我们需要另外定义一组数组来表示Open&blocked性质。同时这两组数组通过下标“对齐”的方式,来展现的就是对一个site进行操作。

我在类Percolation中定义了一个成员~一维数组a用来表示方形系统中每个节点的open/blocked状态,

a[i]=true;//表示site open
a[i]=false;//表示site blocked

定义了一个成员~类WeightedQuickUnionUF对象,这个对象内的数组表示连接情况,
并且下标0表示virtual top site,下标N*N+1表示virtual bottom site.


这里简化以3*3方形系统为例:
方形系统:

1 2 3
4 5 6
7 8 9

数组a:

0 1 2
3 4 5
6 7 8

WeightedQuickUnionUF类中的数组:
0表示vitual top site

1 2 3
4 5 6
7 8 9

10表示vitual bottom site
注意:在定义的Percolation类中的方法对s

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值