2016-01-28 70 views
0

這就是我在代碼中花費了這麼多時間。如何降低嵌套循環的複雜性來生成所有IP地址

ALGO

loop i in 0 -> 255 
    loop j in 0 -> 255 
     loop k in 0 -> 255 
      loop l in 0 -> 255 
       output string(i.j.k.l) //ip-address 

能否請你告訴的方式,從爲O(n^4)降低其複雜性的東西少了?任何幫助將不勝感激。

+1

有很多的IP地址。列出很多事情需要很長時間。你爲什麼需要把它們全部列出來?你想做什麼? – Teepeemm

+0

@Teepeemm我需要記錄ip-api.com/json/*ip-address*的json響應。一些私人IP範圍正在豁免,但在if語句輸出,這是我沒有打擾提及,因爲這不會有任何幫助。 –

+2

所以你想要得到一個幾乎每個IP地址的Ajax響應?這將花費太長時間,api將停止回答你。你需要重新思考你的方法。 – Teepeemm

回答

1

您不能生產O(f(n))的輸出時間小於O(f(n))。如果你想讓它運行得更快,你需要減少輸出。

你知道,IP地址往往是物理上接近附近的IP地址......

1

首先,我不知道你實際上是試圖解決什麼問題,但它是不可能的,它需要你查找每個可能的IP地址。如果你給了我們更多的上下文(即你認爲需要這種解決方案的更大的問題是什麼?),也許我們可以給你一些更現實的選擇。下面的信息解釋了爲什麼你不能改進你的算法,如果你真的想查找所有可能的地址。

有40億左右可能的IP地址。有些處於私人範圍,您無法查詢,其他組合可能無效。除非你進行一些前端過濾,否則你必須檢查所有40億次。儘管過濾,但你會檢查整個可能範圍的很大一部分。

如果n的範圍是0..255,那麼你的代碼只有O(n^4)。這是看待事物的一種奇怪的方式。另一種看待它的方法是n是2^32(即40億和變化),並且你需要檢查每一個。然後是O(n)。你可以很容易地通過他們都在一個循環:

uint ip = 0; 
do 
{ 
    // convert the integer to an IP address by extracting the individual bytes. 
    if (ip not in private address range) 
    { 
     // do the lookup 
    } 
    ++ip; 
} while (ip != 0); 

我要強調,雖然,除了在前面的過濾,這並不比原來的算法或多或少效率。

你最好先做私人IP範圍過濾(在查找之前)。這樣你就不會浪費時間尋找你不知道的東西。

順便說一句,如果您的本地網絡上有DNS服務器,DNS查找的平均時間好在60毫秒左右。假設你可以保持這一點,查找每個可能的IP地址的時間將是:

60 ms * 2^32 addresses = 257,698,037.76 seconds 

這可以工作到8年多一點。

後來補充:根據Ami Tavory在他的回答(Reserved IP addresses)中發佈的鏈接,大約有6億個保留地址。如果你將這些過濾出來,你可以按時間要求降低約15%。你只需7年即可完成!)

你需要以不同的方式處理你的問題。

+0

好的解釋順便說一下 – surajsn

0

從「如何加速這4個嵌套循環」的角度來解釋這個問題,根據定義,無法提高複雜性。

儘管如此,你需要這樣的做法來處理每個IP地址,其中一些是無關緊要的。例如,Here是保留IP地址的列表。

你可能會想出一些不同的,或更具體的,爲你的情況。

如果您可以以某種方式將這些限制編碼到循環中,則可以降低複雜性。例如:

for i0 in 0 - > 255 if not restriction0(i0): 
    for i1 in 0 -> 255 if not restricion1(i0, i1): 
     for i2 in 0 - > 255 if not restriction2(i0, i1, i2: 
       for i3 in 0 -> 255 if not restricion3(i0, i1, i2, i3): 
        do something