union-find

    24熱度

    1回答

    我注意到Data.UnionFind使用IO monad通過IORefs提供指針。我想大家愉快地在本地使用純代碼時調用unsafePerformIO,因爲數據結構很好理解,但是.. 是否有一種規範的清潔方法來處理這種數據結構?也許是一個圍繞IO的封裝,通過禁止大多數IO操作使不可避免的不可避免的「看起來」變得不那麼安全?

    2熱度

    2回答

    我正在讀關於着名的工會發現問題,書中說:「無論是找工會或工會將花費O(n)時間,而另一個將花費O(1) ....」 但是如何使用位串來表示集? 然後兩者結合(使用位OR)和發現(通過設置列表遍歷檢查相應位爲1)將採取O(1) .. 什麼是錯的邏輯是什麼?

    1熱度

    1回答

    我很抱歉,如果這個問題有點寬泛,但我很難試圖瞭解如何創建一個最小成本生成樹。如果它很重要的話,這是用C++編寫的。 根據我的理解,您將使用Kruskal's來選擇構建生成樹的最小成本邊。我的想法是把邊緣變成一個小堆,這樣你就可以從頂部移除,以便以最低的成本獲得邊緣。 到目前爲止,我只能實現minheap並設置聯合發現,但我仍不確定聯合發現的目的以及創建生成樹的排序算法。 我將不勝感激任何建議。編輯

    2熱度

    3回答

    這是我的一個不相交集的Objective-C實現。 - 正數指向父。 - 負數表示根子&兒童數。 (所以它們每個都在-1處開始脫節。) - 索引用作我正在分組的數據。 似乎工作正常...只是有幾個問題。 找到:如何壓縮路徑?因爲我沒有遞歸執行它,所以我必須存儲路徑,並在查找根後再次循環設置它? 加入:我基於加入兒童數而不是深度!?我想這是不對的。如果深度相等,我需要在連接過程中做些特別的事情嗎?

    9熱度

    4回答

    存在「具有路徑壓縮的加權快速聯合」算法。 代碼: public class WeightedQU { private int[] id; private int[] iz; public WeightedQU(int N) { id = new int[N]; iz = new int[N]; for(int i =

    2熱度

    1回答

    對於真正的大數據(比如超過2^32個元素和超過2^32對聯合),是否有增強的不相交集算法? 顯然最大的問題是我不能製作這麼大的數組,所以我想知道是否有更好的算法或更好的數據結構來完成我的任務?

    10熱度

    1回答

    我描述圖作爲組節點和邊緣的記錄: data MyGraph a = MyGraph { nodes :: Set a, edges :: Set (a,a), components :: UnionFindM a -- ? } emptyGraph = MyGraph{ nodes = empty, edges = empty, compone

    2熱度

    2回答

    我無法將快速查找算法中的聯合運算與集合論中A U B的一般含義相關聯。 書(算法在C++羅伯特·塞奇威克)告訴聯合操作是「掃描整個陣列的每個輸入對throgh。(第9行和在代碼10)。 基本上我們複製值在節點q對所有其他節點具有相同的值節點p。 爲什麼我們命名這個操作UNION? 代碼直接從書上抄。 #include <iostream> const int N = 10000; int ma

    3熱度

    1回答

    我正在爲聯合/查找結構實現快速聯合算法。在執行at the "Algorithms in Java" book site時,普林斯頓實現在實現路徑壓縮時(在find()方法中)未能保持樹的大小不變。這不應該對算法產生不利影響嗎?或者我錯過了什麼?另外,如果我是對的,我們將如何去修改大小數組?