问题描述可以详见: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. Mobile testing基础之签名

    1. 什么是数字签名? 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的 2. 为什么要数字签名? 最简单直接的回答: 系统要求的. Android系统 ...

  2. 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验

    希望使用的第三方Recovery下载地址: ClockworkMod ROM Manager - Recoveries http://clockworkmod.com/rommanager 适配的型号 ...

  3. Geodesic-based robust blind watermarking method for three-dimensional mesh animation by using mesh segmentation and vertex trajectory

    之前因为考试,中断了实验室的工作,现在结束考试了,不能再荒废了. 最近看了一篇关于序列水印的文章,大体思想是:对于一个网格序列,首先对第一帧进行处理,在第一帧上,用网格分割算法(SDF)将网格分割成几 ...

  4. python中List的sort方法的用法

    python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东 ...

  5. 数往知来C#面向对象准备〈二〉

    面向对象(OOP→Object-Oriented Programming) 1.什么是面向对象? 一种分析问题的方式. 2.面向对象三大特征: 封装(隐蔽代码实现/复用/修改方便).继承.多态. 3. ...

  6. 【暑假】[实用数据结构]UVa11991 Easy Problem from Rujia Liu?

    UVa11991 Easy Problem from Rujia Liu?  思路:  构造数组data,使满足data[v][k]为第k个v的下标.因为不是每一个整数都会出现因此用到map,又因为每 ...

  7. Azure支持docker简介以及使用指南

    Docker 是一个开源的项目,主要的特点是能将应用程序包装在一个 LXC (Linux Container) 容器中,当这些应用被包装进容器后,部署.迁移都变得更为简单.与传统的虚拟化技术相比,虚拟 ...

  8. Tkinter教程之Text(2)篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811347 '''Tkinter教程之Text(2)篇''''''6.使用tag来指定文本的属 ...

  9. BITED数学建模七日谈之二:怎样阅读数学模型教材

    今天进入我们数学建模七日谈的第二天:怎样阅读数学建模教材? 大家再学习数学建模这门课程或准备比赛的时候,往往都是从教材开始的,教材的系统性让我们能够很快,很深入地了解前人在数学模型方面已有的研究成果, ...

  10. Unity3d自定义脚本模板

    这是一个小技巧,打开Unity安装目录,如: C:\Program Files (x86)\Unity\Editor\Data\Resources\ScriptTemplates /* * * Tit ...