2017-10-28 169 views
1

我有兩組多個IP範圍。每個IP範圍是一對(startIP, endIP)多頭。所以,我有兩套ab -不同的IP組之間的IP範圍

a = [(start11, end11), (start12, end12)...] 
b = [(start21, end21), (start22, end22)...] 

我希望能夠找到這在a但不是在b的IP地址。換句話說,set(ips_a) - set(ips_b)

我試圖蠻力檢查a中的每個IP對b,但這個過程需要永久,因爲每個集合中有超過1億個IP。

想知道什麼是最優化的方式來做到這一點。此外,如果任何現有的模塊這樣做。

+0

請添加一個實際的例子(和你試過的...)。 –

+0

你想要的代碼?我在'a'的每個範圍內取每個IP,並在'b'中對每個'start,end'進行檢查。只是爲了循環。 – hyades

+0

那不是代碼,那是代碼 –

回答

1

你可以嘗試下面的算法,關於這O(n log n)到的地址數:

  • 我假定每個列表中的IP地址範圍的無重疊。如果他們這樣做,消除這些重疊(合併範圍)。
  • 按範圍的開始對兩個列表排序。
  • 循環中使用兩個變量,一個跟蹤在第一列表中的當前位置,讓我們稱之爲i,另一個跟蹤在第二列表中的當前位置,讓我們稱之爲j
  • 雖然b[j] < a[i],增加j。也就是說,跳過b[j]之前a[i],不與a[i]重疊。
  • 如果a[i]b[j]重疊,請從a[i]中刪除重疊部分,並增加i。達到
  • 重複,直到a末。因此,a中也在b中的所有範圍將從a中刪除。

由於排序步驟,此算法的時間複雜度爲O(n log n)

+0

的描述啊,真好!這應該可以降低複雜性。複雜性將是'O(nlogm)',m =範圍的數量?在我的案件的範圍僅僅是幾千,我想這應該是'O(N)' – hyades

+0

@hyades這是'爲O(n log n)的''那裏是N'在較長的名單範圍內的號碼,什麼方向。 – janos

+0

對呀。我的錯。 – hyades