问题描述可以详见:http://coursera.cs.princeton.edu/algs4/assignments/percolation.html

关于QuickFindUF的javadoc:http://algs4.cs.princeton.edu/15uf/QuickFindUF.java.html

关于WeightedQuickUnionUF的javadoc:http://algs4.cs.princeton.edu/15uf/WeightedQuickUnionUF.java.html

附言:(引用于http://blog.csdn.net/revilwang/article/details/10823467

关于这个模型,其实存在一个问题,在算法课程的论坛上,讨论的热度很高。问题是这样的:

由于引入虚拟的顶层区域和虚拟的底层区域,那么当模型渗透的时候,可能会出现下图的情况

如右边图所示,由于所有的底层区域都和虚拟底层区域相连,所以一旦当区域渗透,则和其他的底层开启区域相连的区域也显示为区域满状态。而实际的情况应该是按照左图所示。这个问题称为 backwash,个人把这个翻译成“回流”。引入虚拟底层区域,很难避免这个问题。讨论的结果,有两种方式可以改进:

1. 不使用虚拟底层区域,只保留顶层,判断是否渗透的时候用虚拟顶层和一个for循环来判断。

2. 保留虚拟底层区域,另外加一个不使用虚拟底层的模型,将两个模型结合在一起来判断是否渗透,通过浪费一些内存来保证效率。

backwash的情况导致Percolation.java在测试时public void isfull(int i, int j) 方法出现错误,这一点从上面两张图也可以明显的看出来。(而解决的办法通过上面两种方法实现)

下面两段代码是从http://www.cnblogs.com/tiny656/p/3820653.html 复制来的,因为自己写的没有考虑到backwash的情况,所以有一些错误,就不挂上来误人子弟了。

Percolation.java

public class Percolation {

    private boolean[] matrix;
private int row, col;
private WeightedQuickUnionUF wquUF;
private WeightedQuickUnionUF wquUFTop;
private boolean alreadyPercolates; public Percolation(int N) {
if (N < 1) throw new IllegalArgumentException("Illeagal Argument");
wquUF = new WeightedQuickUnionUF(N*N+2);
wquUFTop = new WeightedQuickUnionUF(N*N+1);
alreadyPercolates = false;
row = N;
col = N;
matrix = new boolean[N*N+1];
} private void validate(int i, int j) {
if (i < 1 || i > row)
throw new IndexOutOfBoundsException("row index i out of bounds");
if (j < 1 || j > col)
throw new IndexOutOfBoundsException("col index j out of bounds");
} public void open(int i, int j) {
validate(i, j);
int curIdx = (i-1)*col + j;
matrix[curIdx] = true;
if (i == 1) {
wquUF.union(curIdx, 0);
wquUFTop.union(curIdx, 0);
}
if (i == row) {
wquUF.union(curIdx, row*col+1);
} int[] dx = {1, -1, 0, 0};
int[] dy = {0, 0, 1, -1};
for (int dir = 0; dir < 4; dir++) {
int posX = i + dx[dir];
int posY = j + dy[dir];
if (posX <= row && posX >= 1
&& posY <= row && posY >= 1
&& isOpen(posX, posY)) {
wquUF.union(curIdx, (posX-1)*col+posY);
wquUFTop.union(curIdx, (posX-1)*col+posY);
}
}
} public boolean isOpen(int i, int j) {
validate(i, j);
return matrix[(i-1)*col + j];
} public boolean isFull(int i, int j) {
validate(i, j);
int curIdx = (i-1)*col+j;
if (wquUFTop.find(curIdx) == wquUFTop.find(0)) return true;
return false;
} public boolean percolates() {
if (alreadyPercolates) return true;
if (wquUF.find(0) == wquUF.find(row*col+1)) {
alreadyPercolates = true;
return true;
}
return false;
} public static void main(String[] args) {
Percolation perc = new Percolation(2);
perc.open(1, 1);
perc.open(1, 2);
perc.open(2, 1);
System.out.println(perc.percolates());
} }

PercolationStats.java

public class PercolationStats {
private double[] x;
private int expTime;
public PercolationStats(int N, int T) { // perform T independent experiments on an N-by-N grid if (N <= 0 || T <= 0)
throw new IllegalArgumentException("Illeagal Argument");
x = new double[T+1];
expTime = T;
for (int i = 1; i <= T; i++) {
Percolation perc = new Percolation(N);
while (true) {
int posX, posY;
do {
posX = StdRandom.uniform(N) + 1;
posY = StdRandom.uniform(N) + 1;
} while(perc.isOpen(posX, posY));
perc.open(posX, posY);
x[i] += 1;
if (perc.percolates())
break;
}
x[i] = x[i]/(double) (N * N);
}
}
public double mean() { // sample mean of percolation threshold double u = 0.0;
for (int i = 1; i <= expTime; i++) { u += x[i];
}
return u / (double)expTime;
}
public double stddev() { // sample standard deviation of percolation threshold double q = 0.0;
double u = mean();
for (int i = 1; i <= expTime; i++) { q += (x[i]-u)*(x[i]-u);
}
return Math.sqrt(q / (double)(expTime - 1));
}
public double confidenceLo() { // low endpoint of 95% confidence interval double mu = mean();
double sigma = stddev();
return mu - 1.96*sigma / Math.sqrt(expTime);
}
public double confidenceHi() { // high endpoint of 95% confidence interval double mu = mean();
double sigma = stddev();
return mu + 1.96*sigma / Math.sqrt(expTime);
} public static void main(String[] args) { // test client (described below) int N = Integer.parseInt(args[0]);
int T = Integer.parseInt(args[1]);
PercolationStats percStats = new PercolationStats(N, T);
StdOut.printf("mean = %f\n", percStats.mean());
StdOut.printf("stddev = %f\n", percStats.stddev());
StdOut.printf("95%% confidence interval = %f, %f\n",
percStats.confidenceLo(), percStats.confidenceHi()); }
}

Programming Assignment 1: Percolation的更多相关文章

  1. AlgorithmsI Programming Assignment 1: Percolation

    3种版本的答案,第一种使用virtual top and bottom site, 但有backwash的问题,解决这个问题有两种方法: 1. 使用2个WQUUF, 但会增加memory. One f ...

  2. Coursera Algorithms Programming Assignment 1: Percolation(100分)

    题目来源http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业分为两部分:建立模型和仿真实验. 最关键的部分就是建 ...

  3. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer

    Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...

  4. Algorithms: Design and Analysis, Part 1 - Programming Assignment #1

    自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...

  5. Algorithms : Programming Assignment 3: Pattern Recognition

    Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...

  6. Programming Assignment 2: Randomized Queues and Deques

    实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...

  7. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 2、编程作业常见问题与答案(Programming Assignment FAQ)

    Please note that when you are working on the programming exercise you will find comments that say &q ...

  8. Programming Assignment 5: Kd-Trees

    用2d-tree数据结构实现在2维矩形区域内的高效的range search 和 nearest neighbor search.2d-tree有许多的应用,在天体分类.计算机动画.神经网络加速.数据 ...

  9. Programming Assignment 4: 8 Puzzle

    The Problem. 求解8数码问题.用最少的移动次数能使8数码还原. Best-first search.使用A*算法来解决,我们定义一个Seach Node,它是当前搜索局面的一种状态,记录了 ...

随机推荐

  1. cocos2d anchor point 锚点解析

    anchor point 究竟是怎么回事? 之所以造成不容易理解的是因为我们平时看待一个图片是 以图片的中心点 这一个维度来决定图片的位置的.而在cocos2d中决定一个 图片的位置是由两个维度 一个 ...

  2. 《Python 学习手册4th》 第十章 Python语句简介

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  3. ios游戏开发--cocos2d学习(2)

    在第一节中简单介绍了2d项目模板HelloWorld的基础代码,并做了一点小小的改变,像触摸接收.旋转.移动和颜色转变序列CCSequence的使用等等,2d本身封装好了很多方便使用的动作,只需要调用 ...

  4. 通过实验分析system_call中断处理过程

    作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本实验目的:通过以一个简单的m ...

  5. 【和我一起学python吧】Python 启航

    话说万张高楼平地起,不会走之前先学会爬吧.尤其对于我等的小菜同学来说更是这样,不管怎么先code first吧,等我等小菜们翅膀硬了才test first吧. 1, 怎么运行python? 先到pyt ...

  6. 解读MMS(Microsoft Media Server)协议

    下面是一次截取的MMS协议开始帧 部分(十六进制): 01000000cefa0bb0c00000004d4d5320 18000000000000000000000000000000 1600000 ...

  7. SQL Server 中的三种分页方式

    USE tempdb GO SET NOCOUNT ON --创建表结构 IF OBJECT_ID(N'ClassB', N'U') IS NOT NULL DROP TABLE ClassB GO ...

  8. c函数习记

    1,user groups 篇幅 the length of an article; fgetgrent(从指定的文件来读取组格式) 相关related functions;fgetpwent hea ...

  9. 第二百七十天 how can I 坚持

    终于有点事干了,今天挺忙的. 今晚没玩游戏,看了个电影<解救吾先生>,还好. 傻. 12月28了,还三天就2016了,好快. 今天地铁人好多,早上又没起来,又迟到了,去霍营倒车,竟然还差点 ...

  10. cocos2d-x图片变灰或者变亮

    //根据现有CCSprite,变亮和变灰 CCSprite* FlyLeaf::graylightWithCCSprite(CCSprite* oldSprite,bool isLight) {    ...