2012-02-16 161 views
17

該腳本必須驗證一個預定義IP是否存在於大量IP中。目前,該功能類似於這樣我的代碼(認爲「IPS」是我的IP的陣列和「IP」是預定義的IP)找到字符串數組中字符串的最快方法

ips.each do |existsip| 
    if ip == existsip 
    puts "ip exists" 
    return 1 
    end 
end 
puts "ip doesn't exist" 
return nil 

有沒有更快的方式做同樣的事情?

編輯:我可能錯誤地表達了我自己。我可以做array.include?但我想知道的是:array.include?該方法會給我最快的結果?

+1

使用散列或代替將數組的 – Phrogz 2012-02-16 15:28:37

+0

任何Ruby編程之前,請先閱讀http://ruby-doc.org/core-1.9.3/Enumerable.html。 – tokland 2012-02-16 15:30:17

+0

你可以使用'Array'類中定義的'include?'方法使這個操作看起來更整潔,我不確​​定它是否會提高查找速度 – 2012-02-16 15:30:54

回答

31

您可以使用Set。它在Hash上實現,對於大數據集將更快 - O(1)。

require 'set' 
s = Set.new ['1.1.1.1', '1.2.3.4'] 
# => #<Set: {"1.1.1.1", "1.2.3.4"}> 
s.include? '1.1.1.1' 
# => true 
+1

或者在你的情況下:'s = Set.new(ips)' – Phrogz 2012-02-16 15:32:39

+0

你好再Alex :) .include方法源代碼似乎和我的幾乎一樣。或者它實際上更快? – Cocotton 2012-02-16 15:36:45

+2

@Cocotton:[更快](http://stackoverflow.com/questions/5551168/performance-of-arrays-and-hashes-in-ruby/5552062#5552062)。你也可以用ip作爲關鍵字和'true'作爲值來使用Hash。 – steenslag 2012-02-16 15:49:23

2

您是否嘗試過Array#include?功能?

http://ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F

你可以從它幾乎完全一樣的東西,除了本身的來源看。

+1

這仍然是一個O(n)時間操作,因爲它必須搜索數組中的每個項目(即使它在C中)。 – Phrogz 2012-02-16 15:33:54

+0

我知道一個枚舉可以排序,但我不知道如何搜索這樣一個排序的數組。人們可以創建索引數據庫列來完成這項工作。 – 2012-02-16 17:54:20

+1

即使是二進制搜索也是O(log n)。散列項目並在散列表中查找它是一個與存儲的項目數量無關的恆定時間操作。 – Phrogz 2012-02-16 22:04:37

2
ips = ['10.10.10.10','10.10.10.11','10.10.10.12'] 

ip = '10.10.10.10' 
ips.include?(ip) => true 

ip = '10.10.10.13' 
ips.include?(ip) => false 

check Documentaion here

+0

但是這實際上比我的方法更快嗎?因爲這個源代碼似乎和我的幾乎一樣。 – Cocotton 2012-02-16 15:36:10

+0

ofcourse它更快..我在我的項目中使用..此外,當有一種方法在紅寶石,爲什麼我們應該寫額外的代碼。 – 2012-02-16 15:39:02

+0

@ dku.rajkumar想說的是,它應該更快,因爲'.include?'在Array類的C級上實現。 – Ikon 2015-07-14 13:40:39

3

一個更快的方法是:

if ips.include?(ip) 
    puts "ip exists" 
    return 1 
else 
    puts "ip doesn't exist" 
    return nil 
end 
+0

稍微快一點,因爲'each'出現在C而不是Ruby中,但對於Hash或Set,它仍然是O(n)而不是O(1)。 – Phrogz 2012-02-16 15:33:17

相關問題