【C++】最近公用祖先LCA(前置知識)

來源:互聯網
上載者:User

標籤:最近公用祖先   應該   有根樹   介紹   es2017   節點   方式   輸入   col   

1.前言

  最近公用祖先(Least Common Ancestors),簡稱LCA,是由Tarjan教授(對,又是他)提出的一種在有根樹中,找出某兩個結點u和v最近的公用祖先問題。

2.什麼是最近公用祖先?

  在一棵樹中,每個結點都有他的父親和祖先,而最近公用祖先就是兩個節點在這棵樹上深度最大公用祖先節點

  換句話說,就是兩個點在這棵樹上距離最近的公用祖先節點。結合和文字應該很好的詮釋了最近公用祖先:

  PS:在LCA中,也可以將結點本身視為自己的祖先

  在這顆以結點1為根的樹中,4與5的最近公用祖先是2,4和3的最近公用祖先是1,4和2的最近公用祖先是1,4和1的最近公用祖先是1。

3.什麼是離線/線上演算法

  對於LCA問題,常見的方法有Tarjan(DFS+並查集)演算法,倍增演算法,ST(DFS+ST表)演算法,後兩個都是線上演算法,而前一個則是離線演算法(後續的LCA演算法會按現在給出的順序更新)。

  那麼什麼是在/離線演算法?這裡引用一段百度百科的說法:

  線上演算法:“線上演算法是指它可以以序列化的方式一個個的處理輸入,也就是說在開始時並不需要已經知道所有的輸入。”

  離線演算法:“是指基於在執行演算法前輸入資料已知的基本假設,也就是說,對於一個離線演算法,在開始時就需要知道問題的所有輸入資料,而且在解決一個問題後就要立即輸出結果。”

  這裡舉個例子,線上演算法就是我們常說的“輸入一組資料,輸出一組資料”,而離線演算法就是“輸入完所有資料在輸出答案”。  

4.LCA問題的方法介紹:

1.Tarjan演算法:

2.倍增演算法:

3.ST表+DFS演算法:

【C++】最近公用祖先LCA(前置知識)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.