2009-10-23 58 views
0

我們知道每個集合的定義來自其他集合的聯合。2組的聯合/交集,其中每組由其子集定義

例如

A = B聯合{1,2}

B = C工會d

C = {5,6}

d = {5,7}

E = {4}

則A = {1,2,5,6,7}

工會E = {1,2,4,5,6,7}

是否有任何有效的算法來做到這一點。假設工會的層次結構可能非常深,而子集可以經常改變(不是那麼多)。 我認爲應該有辦法最大限度地減少人工合作的數量。

+1

如果B是C聯合D,那麼它的{5,6,7}和A是{1,2,5,6,7} – 2009-10-23 23:45:26

+0

thx,這是一個錯字。 – user195682 2009-10-23 23:57:20

回答

0

因此,你有一個不斷變化的工會的層次結構?就像你的例子一樣,你只對一組的價值感興趣?

然後扁平化層次結構。也就是說,在你的例子中,你將一次遍歷層次結構來找到你的集合的集合,並存儲這個集合。

每當葉集發生變化時,爲了免除重新計算聯合,您可以跟蹤每個元素當前包含的集合數。如果樹葉集合發生變化,可以快速更新,而不需要查看任何未更改的樹葉集合。然後,頻率計數> 0的那些元素當前處於聯合中。

+0

但內存不會按指數級增長到層次結構的深度嗎? – user195682 2009-10-24 02:05:26

+0

扁平化的層次結構是葉集的集合。因此,它的大小在*不同*葉集的數量上是線性的。 *如果*集都是*不同*而您的層次結構是*平衡*樹,那麼它的高度就是指數級。 – meriton 2009-10-24 13:44:20

0

關於這種情況的幾個問題。

第一個問題:這個「腳本」/「程序」需要運行多長時間?如果它不是太長,在執行聯合動作之前,簡單地存儲以前的聯合並檢查緩存可能是一個不錯的選擇。內存現在不是那麼貴:)。

第二個問題你應該問:在工會之前是否有特定順序的元素?如果它們不是,並且列表不止一次被訪問,那麼首先對列表進行排序可能非常有用(例如,當你只是列表的一半時,可以做出決定)。 Mergesort是有效連接兩個有序列表的強大技術。