摘要:算法鏈接學習工具,,環境搭建在小伙伴的推薦下,這個學期開始上普林斯頓的算法課。一系列的整數對代表與相互連接,比如等,每一個整數代表了一個。我覺得這個可能也是并查集相關應用。這學期繼續學習深入理解了就能明白了。
《算法》鏈接:1.5 Case Study: Union-Find
學習工具:mac,java8,eclipse,coursera
環境搭建
在小伙伴的推薦下,這個學期開始上普林斯頓的算法課。
這門課有自己的Java library,剛開始的時候研究載入這個library花了好長時間,最終的解決方案是下載algs4.jar包,然后在eclipse軟件中將其作為外部library,使用的時候import statement要寫成類似這樣的:
import edu.princeton.cs.algs4.StdRandom;1 Dynamic connectivity
教授一開始就講到了dynamic connectivity,其實這是Union Find算法的一種應用,這學期選修的另外一門network model和這個也有關。
Input: 一系列的整數對(p,q)代表p與q相互連接("is connected to"),比如(4,3)(3,8)等,每一個整數代表了一個object。這里的"is connected to"表示的是沒有方向的對稱連接,且一個p可以與自身p相連。
Goal:當讀取的(p,q)整數對本來不相連時,輸出這個整數對(p,q)且使其相連;如果相連的話,就不輸出,忽略這個整數對
algs4.jar中已經有了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)
數組形式進行存儲array id[i]
如果兩個objects相互鏈接,那么他們數組的值相同
All sites in a component must have the same value in id[].
例如,當union(p,q)時,p所存的值改為q所存的值。id[p] = id[q]
同樣是id[i]數組形式,不同的地方是id[i]中存儲父節點
如果兩個sites的根相同,那么他們在同一個component
根節點i == id[i]
例如,當union(p,q)時
pID = id[p]; qID = id[q]; 循環數組中所有值等于pID的,如果id[i]==pID,則id[i] = qID; 也就是說p所在的樹將作為q的子樹4 Improvement
4.1 weighted
增加sz[]數組來存儲一顆樹里面objects的個數
當要鏈接(p,q)時,需要比較sz[i]和sz[j]的大小(假設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教授列舉了相當多的應用,物理學上的,應用到其他算法或者語言的。所給的面試題也很常見。
最近剛接觸seo相關的內容,老師談到IR system需要將用戶提供的單詞和收集的items中相關的words比對,如果對上了(match),那么這些items就可能是用戶想要的。我覺得這個可能也是并查集相關應用。這學期繼續學習深入理解了就能明白了。
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) }
要點
導入WeightedQuickUnionUF,在程序中主要使用connect(p,q),union(p,q)函數
題目默認(1,1)就是左上角的位置,(n,n)就是右下角的位置,所以我先創建了一個siten+1的二維數組, 并全部初始化為0,代表全部block
創建WeightedQuickUnionUF對象,由于UF算法中都是以一維數組存儲,所以數組uf[1]-uf[NN]對應NN矩陣中的位置,并且根據老師的提示,創建了top virtual site uf[0]和bottom site uf[NN+1], 所以整個uf一維數組的長度是NN+2
最關鍵也是最容易出錯的地方就在open一個點以后,檢查上下左右鄰近的點,并對open的鄰近做union的過程,要考慮到邊緣位置的特殊情況,比如中心點在第一行,那么該點上下左右最多只有三個臨近點,而上點可以與top virtual site連通。
Debug
Percolation.java的問題
幾次發現結果不對,問題都出在open函數里面
對eclipse還不熟,測試中In in = new In(args[0]) 語句要求從命令行鍵入文件名,回車運行。eclipse的操作方法是,在 run configurations-->arguments-->program arguments-->鍵入文件名,可以不打引號,也可以打引號。
如果不想寫路徑,只寫filename.txt,文件要放在項目目錄下(我的項目名是algs),因為eclipse默認的根目錄就是項目目錄
等待解決的bug:一旦連通,再在第N行open的單元格會變成full狀態,因為bottom virtual root 已經聯通,那么與之相連的方塊都認為是與top virtual root 相連的。目前想到的解決方案有
去掉bottom root,但是這樣會遍歷n次
isFull方法加上if判斷
思考優化open 方法
Percolationstat.java 的問題
Percolationstat.java 在編寫時,for循環里面,每一次判斷一個網格是不是連通之前都要新創建一個n-by-n的網格,但是我把創建的語句寫在了for循環外面,導致同一個網格會被實驗T次
計算時除號/左右兩邊numberOfOpenSites和(nn)都是整數,所以得到的結果也是整數;需要強制轉換成double類型,即numberOfOpenSites/(double)(nn)
每次讀取一組整數對后,open site前先要判斷這個點是否被open了,以免多計算在numberOfOpenSites里面
作業提交遇到的問題
所有的fields 和自己定義的methods都要寫為private
最后提交的作業91分,看了一下report, 扣分主要就扣在bottom root與所有最后一行的sites連通的問題上。以后有時間再來修改code吧
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66447.html
摘要:并查集包括查詢和聯合,主要使用不相交集合查詢主要是用來決定不同的成員是否在一個子集合之內聯合主要是用來把多個子集合成一個集合的實際運用計算機網絡檢查集群是否聯通電路板檢查不同的電路元件是否聯通初始化聯通與檢測與是否聯通返回聯通的數 并查集(Union-Find)包括查詢(Find)和聯合(Union),主要使用不相交集合(Disjoint-Sets)查詢(Find)主要是用來決定不同的...
摘要:聯合查找算法是并查集數據結構一種應用。并查集是一種樹型的數據結構,其保持著用于處理一些不相交集合的合并及查詢問題。的特征是刪除節點。目前就職于騰訊事業部,從事神經機器翻譯工作。 5. TF - Graph模塊TF把神經網絡模型表達成一張拓撲結構的Graph,Graph中的一個節點表示一種計算算子。Graph從輸入到輸出的Tensor數據流動完成了一個運算過程,這是對類似概率圖、神經網絡等連接...
摘要:題目要求提供一個二維數組表示一張地圖,其中代表陸地,代表海洋。這里使用一個新的二維數組來表示對應地圖上的元素屬于哪個并查集。在合并的時候先進行判斷,如果二者為已經相連的陸地,則無需合并,否則將新的二維數組上的元素指向所在的并查集。 題目要求 Given a 2d grid map of 1s (land) and 0s (water), count the number of isla...
摘要:在這個方法里,查找連通分量的標識只需要的時間復雜度,但是將兩個分量連接起來卻需要遍歷整個數組,因此時間復雜度為。 什么是Union Find Union Find是并查集的一種數據結構。 先理解兩個對象之間相連的關系對象p和對象q相連是指: 自反性:p和p相連對稱性:如果p和q相連,那么q和p也相連傳遞性:如果p和q相連而且q和r相連,那么p和r相連 在并查集中,如果想要將連個對象相連...
閱讀 1114·2023-04-25 14:35
閱讀 2846·2021-11-16 11:45
閱讀 3444·2021-09-04 16:48
閱讀 2199·2021-08-10 09:43
閱讀 543·2019-08-30 13:17
閱讀 1637·2019-08-29 13:27
閱讀 908·2019-08-26 13:58
閱讀 2168·2019-08-26 13:48