演算法導論第四版學習 習題一Percolation

2022-05-04 12:39:08 字數 3495 閱讀 1648

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分的答案,不代表寫得最好,請在自己實在完成不了的時候再看,不然的話做這個題目的意義一點都沒有)

1

import

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 }

percolation

1

import

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 }

percolationstats

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,入...