開發有效算法的流程:
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