2010-02-05 79 views
1

我有一個包含n個間隔[0,1]算法陣列

每個間隔看起來像[a(i),b(i)] 0<=a(i)<b(i)<=1 , i = 1...n

我需要找到一種有效的算法中確定每個n個間隔的,如果它的內部包含一個列表內發現間隔其他區間。

我試過很多選擇,但我只能找到一個在爲O(n^2)

有什麼建議?

+0

您是否試圖查看每個區間是否完全位於其他區間內,或者它們是否重疊? – 2010-02-06 05:29:23

回答

2

提示:對列表進行排序。

+0

試過了。 我有點不能它nlogn(快速排序),但事後我仍然無法找到一個體面的解決方案,然後在更短的工作N^2 – Idan 2010-02-05 18:58:25

+0

什麼你嘗試列表進行排序,之後做的,是什麼問題? – danben 2010-02-05 19:00:10

+0

對數組進行排序後,我試着搜索每個a的b部分,但是通過這種方式,您會遍歷數組一次,因此,您將得到一個效率爲O(n * n)的算法。 – Idan 2010-02-05 19:20:45

1

假設只有一個區間[0,1]。如果它不在列表中,只是爲了方便而添加它。

排序端點。在兩個端點相同的情況下,在相應的右端點上反向排序它們。因此[0.1,0.2],[0.1,0.3]將被排序爲0.1,0.1,0.2,0.3,其中第一個0.1以第二間隔進行。同樣如果右端點是相等的。

每個端點都應該有一個對其間隔的引用,以便您可以找到給定端點的時間間隔。

掃描排序的端點。和你一樣,建立一棵樹。使用[0,1]作爲根。節點可能是紅色或綠色。他們從紅色開始。所以根節點最初是紅色的。

樹的想法是,如果一個區間包含另一個區間,那麼它最終將成爲樹中的祖先。如果兩個區間不重疊或部分重疊,它們將位於不同的分支中,並且它們唯一的共同祖先將是根,或者包含它們的其他區間。

當遇到每個左端點時,通過向其當前樹節點添加一個紅色節點作爲其間隔,將其添加到樹中的臨時位置。因此,我們遇到的第一個端點會導致相應的時間間隔被添加到根目錄下,併成爲當前節點。因此,在遇到右手端點之前,樹節點可能會連接多個節點。

當遇到右手端點時,其節點變爲綠色,因爲我們已經從一端到另一端完全覆蓋了它。如果它有任何紅色的後代,它們必須被移動,因爲當正好轉向的綠色節點包含它們的左端時,它不包含它們的右端。所以我們把它們全部移到父節點(它仍然是紅色的)。

我們繼續這個過程,直到我們到達1.0端點。此時樹完成。所有節點都是綠色的。每個節點下的節點表示對應的時間間隔包含的時間間隔。

+0

通常認爲是爲他做某人的功課的糟糕形式。一個更好的主意是指導並幫助海報理解他需要能夠自己找到答案的概念。 – danben 2010-02-05 20:07:49

+0

感謝您的指導。我會記住它。 – Permaquid 2010-02-05 21:23:06

+0

感謝您的提示... 坦率地說,我不知道我明白你是怎麼建議我應該將節點插入樹中的......但我很欣賞這種努力 – Idan 2010-02-05 21:47:15

1
  1. 排序根據自己的起點打破關係,使得早期的端點出現後
  2. 觀察到,在排定的順序,每一個元素E的間隔,含值e只能存在於它的左邊。
  3. 因此從左側線性掃描到目前觀察到的最大終點的軌跡。在任何階段,如果當前時間間隔的終點小於最大終點,我們發現一個包含在另一個時間間隔內的時間間隔。