2012-02-16 131 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

相关问题