欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)一個簡單的并查集的示例代碼

 更新時間:2018年03月19日 14:22:41   作者:黃天浩  
本篇文章主要介紹了python實現(xiàn)一個簡單的并查集的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

并查集是一種樹型的數(shù)據(jù)結構,用于處理一些不相交集合的合并及查詢問題。常常在使用中以森林來表示。

并查集有三種基本操作,獲得根節(jié)點,判斷兩節(jié)點是否連通,以及將兩不連通的節(jié)點相連(相當于將兩節(jié)點各自的集合合并)

用UnionFind類來表示一個并查集,在構造函數(shù)中,初始化一個數(shù)組parent,parent[i]表示的含義為,索引為i的節(jié)點,它的直接父節(jié)點為parent[i]。初始化時各個節(jié)點都不相連,因此初始化parent[i]=i,讓自己成為自己的父節(jié)點,從而實現(xiàn)各節(jié)點不互連。

  def __init__(self, n):
    self.parent = list(range(n))

由于parent[i]僅表示自己的直接父節(jié)點,查詢兩個節(jié)點是否相交需要比較它們的根節(jié)點是否相同。因此要封裝一個查詢自己根節(jié)點的方法。

  def get_root(self, i):
    while i != self.parent[i]:
      i = self.parent[i]

    return i

接下來可以通過來比較根節(jié)點是否相同來判斷兩節(jié)點是否連通。

  def is_connected(self, i, j):
    return self.get_root(i) == self.get_root(j)

當要連通兩個節(jié)點時,我們要將其中一個節(jié)點的根節(jié)點的parent,設置為另一個節(jié)點的根節(jié)點。注意,連通兩個節(jié)點并非僅僅讓兩節(jié)點自身相連,實際上是讓它們所屬的集合實現(xiàn)合并。

  def union(self, i, j):
    i_root = self.get_root(i)
    j_root = self.get_root(j)
    self.parent[i_root] = j_root

接下來我們做兩個小優(yōu)化。

由于調用get_root時需要通過不斷找自己的直接父節(jié)點,來尋找根節(jié)點,如果這棵樹的層級過深,會導致性能受到嚴重影響。因此我們需要在union時,盡可能的減小合并后的樹的高度。

在構造函數(shù)中新建一個數(shù)組rank,rank[i]表示節(jié)點i所在的集合的樹的高度。

因此,當合并樹時,分別獲得節(jié)點i和節(jié)點j的root i_root和j_root之后,我們通過訪問rank[i_root]和rank[j_root]來比較兩棵樹的高度,將高度較小的那棵連到高度較高的那棵上。如果高度相等,則可以隨便,并將rank值加一。

  def union(self, i, j):
    i_root = self.get_root(i)
    j_root = self.get_root(j)

    if self.rank[i_root] == self.rank[j_root]:
      self.parent[i_root] = j_root
      self.rank[j_root] += 1
    elif self.rank[i_root] > self.rank[j_root]:
      self.parent[j_root] = i_root
    else:
      self.parent[i_root] = j_root

通過對union操作的改良可以防止樹的高度過高。我們還可以對get_root操作本身進行優(yōu)化。

當前每次執(zhí)行get_root時,需要一層一層的找到自己的父節(jié)點,很費時。由于根節(jié)點沒有父節(jié)點,并且文章開始處提到過如果一個節(jié)點沒有父節(jié)點,那么它的父節(jié)點就是自己,因此可以說只有根節(jié)點的父節(jié)點是自己本身?,F(xiàn)在我們加上一個判斷,判斷當前節(jié)點的父節(jié)點是否為根節(jié)點,如果不為根節(jié)點,就遞歸地將自己的父節(jié)點設置為根節(jié)點,最后返回自己的父節(jié)點。

  def get_root(self, i):
    if self.parent[i] != self.parent[self.parent[i]]:
      self.parent[i] = self.get_root(self.parent[i])
    return self.parent[i]

以上是python實現(xiàn)一個簡單的并查集的方式。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Django 設置多環(huán)境配置文件載入問題

    Django 設置多環(huán)境配置文件載入問題

    這篇文章主要介紹了Django 設置多環(huán)境配置文件載入問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 基于Python和PyYAML讀取yaml配置文件數(shù)據(jù)

    基于Python和PyYAML讀取yaml配置文件數(shù)據(jù)

    這篇文章主要介紹了基于Python和PyYAML讀取yaml配置文件數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • NDArray 與 numpy.ndarray 互相轉換方式

    NDArray 與 numpy.ndarray 互相轉換方式

    這篇文章主要介紹了NDArray 與 numpy.ndarray 互相轉換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 淺析使用Python操作文件

    淺析使用Python操作文件

    文件操作對編程語言的重要性不用多說,如果數(shù)據(jù)不能持久保存,信息技術也就失去了意義。按照本人經(jīng)驗,IO也是蠻頭疼的一件事,因為不會用得太多,所以總是記不住API,每次都要重新google就會打斷思路,還不一定每次都快速得到正確的文章。
    2017-07-07
  • 淺談Python協(xié)程

    淺談Python協(xié)程

    這篇文章主要介紹了Python協(xié)程的的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • Python使用post及get方式提交數(shù)據(jù)的實例

    Python使用post及get方式提交數(shù)據(jù)的實例

    今天小編就為大家分享一篇關于Python使用post及get方式提交數(shù)據(jù)的實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 深入理解Python異常處理的哲學

    深入理解Python異常處理的哲學

    這篇文章主要給大家介紹了關于Python異常處理的哲學,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實現(xiàn)

    opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實現(xiàn)

    這篇文章主要介紹了opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python正則表達式re.sub各個參數(shù)的超詳細講解

    python正則表達式re.sub各個參數(shù)的超詳細講解

    Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項,下面這篇文章主要給大家介紹了關于python正則表達式re.sub各個參數(shù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 淺談python中常用的excel模塊庫

    淺談python中常用的excel模塊庫

    本文主要介紹了python中常用的excel模塊庫,感興趣的同學,可以參考下。
    2021-06-06

最新評論