1、backwash(倒灌)的判斷,如果不使用另乙個weightedunionfind物件,要在要求的時間和空間範圍內實現是很困難的
和論壇裡的學生一樣,嘗試只只使用上部的虛擬節點,下部判斷聯通使用迴圈+break,提交後不滿足時間複雜度要求
你也可以不考慮backwash這種情況,因為backwash對連通性並沒有直接影響
2、unionfind資料結構是一維的,但是輸入資料是二維的,不用說,這需要兩個維度的轉換
3、輸入資料的下標是1到n,所以必須好好測試邊界情況,這點可以用測試資料greeting57.txt測試
1、一般來說避免不必要的計算,把某些固定的值快取起來可以提高執行效率,比如計算mean和stddev
2、計算percolationstats時,需要在未開啟的site中按概率p取site開啟
這一點其實用random乙個站點,判斷site已開啟再迴圈找下乙個site,直到找到未開啟site,就可以滿足要求了
應該有更有效率的方法,比如將所有site的下標按一維儲存,每次將取出的site下標和最後一位互換,下次random時候取uniform(1,n-1),避免無效嘗試,以此類推。
(這是我自己親測100分的答案,不代表寫得最好,請在自己實在完成不了的時候再看,不然的話做這個題目的意義一點都沒有)
1percolationimport
edu.princeton.cs.algs4.weightedquickunionuf;23
4public
class
percolation
1516 firstunionfind = new weightedquickunionuf((n * n) + 2);
17 secondunionfind = new weightedquickunionuf((n * n) + 1);
18 row =n;
19 site = new
boolean
[n][n];20}
2122
public
void open(int i, int j) //
open site (row i, column j) if it is not open already
2327 site[i - 1][j - 1] = true;28
int self = (((i - 1) * row) + j) - 1;
29int up = self -row;
30int down = self +row;
31int left = self - 1;
32int right = self + 1;
3334
if (i == 1)
38if (i ==row)
4142
if ((i != 1) && isopen(i - 1, j))
4647
if ((i != row) && isopen(i + 1, j))
5152
if ((j != 1) && isopen(i, j - 1))
5657
if ((j != row) && isopen(i, j + 1)) 61}
6263
public
boolean isopen(int i, int j) //
is site (row i, column j) open?
6468
return site[i - 1][j - 1];69}
7071
public
boolean isfull(int i, int j) //
is site (row i, column j) full?
7276
int self = (((i - 1) * row) + j) - 1;
77return secondunionfind.connected(row *row, self);78}
7980
public
boolean percolates() //
does the system percolate?
8184
85public
static
void main(string args) //
test client (optional)
8688 }
1percolationstatsimport
edu.princeton.cs.algs4.stdout;
2import
edu.princeton.cs.algs4.stdrandom;
3import
edu.princeton.cs.algs4.stdstats;45
6public
class
percolationstats
1718 trys =trials;
19 successtrials = new
double
[trys];
2021
for (int i = 0; i < trials; i++)
3435
percolationtries.open(a, b);
36 successtrials[i]++;37}
3839 successtrials[i] = successtrials[i] / (n *n);40}
41 mean =stdstats.mean(successtrials);
42 stddev =stdstats.stddev(successtrials);43}
4445
public
double mean() //
sample mean of percolation threshold
4649
50public
double stddev() //
sample standard deviation of percolation threshold
5154
55public
double confidencelo() //
low endpoint of 95% confidence interval
5659
60public
double confidencehi() //
high endpoint of 95% confidence interval
6164
65public
static
void main(string args) //
test client (described below)
6678 }
4 28 c primer第四版練習習題
原來書中 中for迴圈裡 int tp p for vector iterator iter ivec.begin iter ivec.end iter tp tp iter 這段 裡新建指標tp,問題出在下面的for迴圈,最後tp已經來到指標 陣列 最後乙個元素的後一位,是無效的,作者所以才新建了...
演算法第四版,練習題 1 4 7
以統計設計輸入陣列的算術操作和比較的成本模型分析threesum 看不懂題目說啥意思 看了下英文版本的 翻譯過來的意思是 建立一種成本模型 統計算術操作和比較 加法和等號 並且考慮到輸入數字 模仿命題b 3 sum的暴力演算法使用了 n3 2次算術操作和比較輸入的三個整數的計算結果和零的關係 證明 ...
演算法第四版1 4演算法分析 習題1 4 31
組成 headstack,tailstack,tempstack headstack的棧底為佇列的頭,棧頂與tailstack的棧底相連,tailstack的棧頂為佇列的尾。pushleft 放在headstack的最底部。若headstack為空,直接入棧,若不為空,全部倒入tempstack,入...