摘要:算法鏈接學(xué)習(xí)工具,,環(huán)境搭建在小伙伴的推薦下,這個學(xué)期開始上普林斯頓的算法課。一系列的整數(shù)對代表與相互連接,比如等,每一個整數(shù)代表了一個。我覺得這個可能也是并查集相關(guān)應(yīng)用。這學(xué)期繼續(xù)學(xué)習(xí)深入理解了就能明白了。
《算法》鏈接:1.5 Case Study: Union-Find
學(xué)習(xí)工具:mac,java8,eclipse,coursera
環(huán)境搭建
在小伙伴的推薦下,這個學(xué)期開始上普林斯頓的算法課。
這門課有自己的Java library,剛開始的時候研究載入這個library花了好長時間,最終的解決方案是下載algs4.jar包,然后在eclipse軟件中將其作為外部library,使用的時候import statement要寫成類似這樣的:
import edu.princeton.cs.algs4.StdRandom;1 Dynamic connectivity
教授一開始就講到了dynamic connectivity,其實這是Union Find算法的一種應(yīng)用,這學(xué)期選修的另外一門network model和這個也有關(guān)。
Input: 一系列的整數(shù)對(p,q)代表p與q相互連接("is connected to"),比如(4,3)(3,8)等,每一個整數(shù)代表了一個object。這里的"is connected to"表示的是沒有方向的對稱連接,且一個p可以與自身p相連。
Goal:當(dāng)讀取的(p,q)整數(shù)對本來不相連時,輸出這個整數(shù)對(p,q)且使其相連;如果相連的話,就不輸出,忽略這個整數(shù)對
algs4.jar中已經(jīng)有了UF這個class,可以直接使用。
public static void main(String[] args) { int n = StdIn.readInt(); UF uf = new UF(n); while (!StdIn.isEmpty()) { int p = StdIn.readInt(); int q = StdIn.readInt(); if (uf.connected(p, q)) continue; uf.union(p, q); StdOut.println(p + " " + q); } StdOut.println(uf.count() + " components"); }2 Quick Find (eager approach)
數(shù)組形式進(jìn)行存儲array id[i]
如果兩個objects相互鏈接,那么他們數(shù)組的值相同
All sites in a component must have the same value in id[].
例如,當(dāng)union(p,q)時,p所存的值改為q所存的值。id[p] = id[q]
同樣是id[i]數(shù)組形式,不同的地方是id[i]中存儲父節(jié)點
如果兩個sites的根相同,那么他們在同一個component
根節(jié)點i == id[i]
例如,當(dāng)union(p,q)時
pID = id[p]; qID = id[q]; 循環(huán)數(shù)組中所有值等于pID的,如果id[i]==pID,則id[i] = qID; 也就是說p所在的樹將作為q的子樹4 Improvement
4.1 weighted
增加sz[]數(shù)組來存儲一顆樹里面objects的個數(shù)
當(dāng)要鏈接(p,q)時,需要比較sz[i]和sz[j]的大?。僭O(shè)i,j分別是他們的root)
4.2 path compression
只需要增添一個語句
id[i] = id[id[i]]
兩種運用
quick union with path compression
weighted quick-union with path compression
5 Applications教授列舉了相當(dāng)多的應(yīng)用,物理學(xué)上的,應(yīng)用到其他算法或者語言的。所給的面試題也很常見。
最近剛接觸seo相關(guān)的內(nèi)容,老師談到IR system需要將用戶提供的單詞和收集的items中相關(guān)的words比對,如果對上了(match),那么這些items就可能是用戶想要的。我覺得這個可能也是并查集相關(guān)應(yīng)用。這學(xué)期繼續(xù)學(xué)習(xí)深入理解了就能明白了。
Write a program to estimate the value of the percolation threshold via Monte Carlo simulation.
Percolation. Given a composite systems comprised of randomly distributed insulating and metallic materials: what fraction of the materials need to be metallic so that the composite system is an electrical conductor? Given a porous landscape with water on the surface (or oil below), under what conditions will the water be able to drain through to the bottom (or the oil to gush through to the surface)? Scientists have defined an abstract process known as percolation to model such situations.
The model. We model a percolation system using an n-by-n grid of sites. Each site is either open or blocked.
open
full
Percolation data type:
public class Percolation { public Percolation(int n) // create n-by-n grid, with all sites blocked public void open(int row, int col) // open site (row, col) if it is not open already public boolean isOpen(int row, int col) // is site (row, col) open? public boolean isFull(int row, int col) // is site (row, col) full? public int numberOfOpenSites() // number of open sites public boolean percolates() // does the system percolate? public static void main(String[] args) // test client (optional) }
PercolationStats data type:
public class PercolationStats { public PercolationStats(int n, int trials) // perform trials independent experiments on an n-by-n grid public double mean() // sample mean of percolation threshold public double stddev() // sample standard deviation of percolation threshold public double confidenceLo() // low endpoint of 95% confidence interval public double confidenceHi() // high endpoint of 95% confidence interval public static void main(String[] args) // test client (described below) }
要點
導(dǎo)入WeightedQuickUnionUF,在程序中主要使用connect(p,q),union(p,q)函數(shù)
題目默認(rèn)(1,1)就是左上角的位置,(n,n)就是右下角的位置,所以我先創(chuàng)建了一個siten+1的二維數(shù)組, 并全部初始化為0,代表全部block
創(chuàng)建WeightedQuickUnionUF對象,由于UF算法中都是以一維數(shù)組存儲,所以數(shù)組uf[1]-uf[NN]對應(yīng)NN矩陣中的位置,并且根據(jù)老師的提示,創(chuàng)建了top virtual site uf[0]和bottom site uf[NN+1], 所以整個uf一維數(shù)組的長度是NN+2
最關(guān)鍵也是最容易出錯的地方就在open一個點以后,檢查上下左右鄰近的點,并對open的鄰近做union的過程,要考慮到邊緣位置的特殊情況,比如中心點在第一行,那么該點上下左右最多只有三個臨近點,而上點可以與top virtual site連通。
Debug
Percolation.java的問題
幾次發(fā)現(xiàn)結(jié)果不對,問題都出在open函數(shù)里面
對eclipse還不熟,測試中In in = new In(args[0]) 語句要求從命令行鍵入文件名,回車運行。eclipse的操作方法是,在 run configurations-->arguments-->program arguments-->鍵入文件名,可以不打引號,也可以打引號。
如果不想寫路徑,只寫filename.txt,文件要放在項目目錄下(我的項目名是algs),因為eclipse默認(rèn)的根目錄就是項目目錄
等待解決的bug:一旦連通,再在第N行open的單元格會變成full狀態(tài),因為bottom virtual root 已經(jīng)聯(lián)通,那么與之相連的方塊都認(rèn)為是與top virtual root 相連的。目前想到的解決方案有
去掉bottom root,但是這樣會遍歷n次
isFull方法加上if判斷
思考優(yōu)化open 方法
Percolationstat.java 的問題
Percolationstat.java 在編寫時,for循環(huán)里面,每一次判斷一個網(wǎng)格是不是連通之前都要新創(chuàng)建一個n-by-n的網(wǎng)格,但是我把創(chuàng)建的語句寫在了for循環(huán)外面,導(dǎo)致同一個網(wǎng)格會被實驗T次
計算時除號/左右兩邊numberOfOpenSites和(nn)都是整數(shù),所以得到的結(jié)果也是整數(shù);需要強(qiáng)制轉(zhuǎn)換成double類型,即numberOfOpenSites/(double)(nn)
每次讀取一組整數(shù)對后,open site前先要判斷這個點是否被open了,以免多計算在numberOfOpenSites里面
作業(yè)提交遇到的問題
所有的fields 和自己定義的methods都要寫為private
最后提交的作業(yè)91分,看了一下report, 扣分主要就扣在bottom root與所有最后一行的sites連通的問題上。以后有時間再來修改code吧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66447.html
摘要:并查集包括查詢和聯(lián)合,主要使用不相交集合查詢主要是用來決定不同的成員是否在一個子集合之內(nèi)聯(lián)合主要是用來把多個子集合成一個集合的實際運用計算機(jī)網(wǎng)絡(luò)檢查集群是否聯(lián)通電路板檢查不同的電路元件是否聯(lián)通初始化聯(lián)通與檢測與是否聯(lián)通返回聯(lián)通的數(shù) 并查集(Union-Find)包括查詢(Find)和聯(lián)合(Union),主要使用不相交集合(Disjoint-Sets)查詢(Find)主要是用來決定不同的...
摘要:聯(lián)合查找算法是并查集數(shù)據(jù)結(jié)構(gòu)一種應(yīng)用。并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),其保持著用于處理一些不相交集合的合并及查詢問題。的特征是刪除節(jié)點。目前就職于騰訊事業(yè)部,從事神經(jīng)機(jī)器翻譯工作。 5. TF - Graph模塊TF把神經(jīng)網(wǎng)絡(luò)模型表達(dá)成一張拓?fù)浣Y(jié)構(gòu)的Graph,Graph中的一個節(jié)點表示一種計算算子。Graph從輸入到輸出的Tensor數(shù)據(jù)流動完成了一個運算過程,這是對類似概率圖、神經(jīng)網(wǎng)絡(luò)等連接...
摘要:題目要求提供一個二維數(shù)組表示一張地圖,其中代表陸地,代表海洋。這里使用一個新的二維數(shù)組來表示對應(yīng)地圖上的元素屬于哪個并查集。在合并的時候先進(jìn)行判斷,如果二者為已經(jīng)相連的陸地,則無需合并,否則將新的二維數(shù)組上的元素指向所在的并查集。 題目要求 Given a 2d grid map of 1s (land) and 0s (water), count the number of isla...
摘要:在這個方法里,查找連通分量的標(biāo)識只需要的時間復(fù)雜度,但是將兩個分量連接起來卻需要遍歷整個數(shù)組,因此時間復(fù)雜度為。 什么是Union Find Union Find是并查集的一種數(shù)據(jù)結(jié)構(gòu)。 先理解兩個對象之間相連的關(guān)系對象p和對象q相連是指: 自反性:p和p相連對稱性:如果p和q相連,那么q和p也相連傳遞性:如果p和q相連而且q和r相連,那么p和r相連 在并查集中,如果想要將連個對象相連...
閱讀 1105·2023-04-25 14:35
閱讀 2842·2021-11-16 11:45
閱讀 3443·2021-09-04 16:48
閱讀 2197·2021-08-10 09:43
閱讀 541·2019-08-30 13:17
閱讀 1636·2019-08-29 13:27
閱讀 906·2019-08-26 13:58
閱讀 2167·2019-08-26 13:48