普林斯頓大學—算法4—學習記錄

開發有效算法的流程:

1-建立問題模型 

2-提出算法解決問題

3-運行時間、存儲空間不足--找出問題所在--提出新算法

以上爲設計和分析希算法的科學途徑,找出問題的實質,通過實踐驗證模型,進而改進模型和方法。

 

2-1 動態連通性問題 Dynamic connectivity

即 並查集問題的模型

連接

連通分量:互相連接的對象的最大集合

java中:創建UF類,包含兩個方法:1 實現合併;2 連接查找,返回一個布爾量。構建器需要對象的數量

 由此建立數據結構。

PS:當實現算法時,對象的數量和操作的數量是巨大的,可能有大量合併與連接查找的操作,此時算法的高效尤爲重要

  測試:在處理更深層的問題之前,需要檢查應用程序接口API的設計。

2-2-快速查找 Quick-find

attention here:

—> union(1,3)把1的內容改成3

—> 合併時,把if語句中的pid寫成索引值p

快速查找算法的效率

查找:常數次

合併:查找他們是否連通-N²次,太慢不可取

2-3- 快速合併

合併具體示例:

attention—>union(根節點,子節點),當根節點在一個連通分量裏,那麼子節點連接在連通分量的根節點上;當子節點在一個連通分量裏,那麼連通分量的根節點連接在包含根節點的連通分量根節點上。

具體實現:

效率

雖然比快速查找法快速,但也很慢。

當樹很高,查找操作代價很大。每個子節點都需要遍歷。

 

2-4 快速合併的改進 Quick union improvement

方法1:權重weighting

           任意節點x的深度是以2爲底N的對數

方法2:路徑壓縮 path compression

時間複雜度並不線性,但足夠接近線性

並查集問題不存在線性時間算法

2-5 Union find application 應用

滲濾模型percolation

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章