在大型列表中查找重复数字的最快方法

时间:2013-10-09 12:55:10

标签: ruby algorithm duplicates

我正在处理一个大型列表(10 ^ 5的顺序)的ID(长数据类型)。我必须在Id的列表中找到重复项。但我只能使用红宝石。

我在这里找到了一种方法。 我将遍历列表并将Id放入哈希值,但在放入哈希值之前,我会检查它是否已经是哈希值。

我不确定RUBY中哈希的复杂性。

请建议我一个更好的主意。

2 个答案:

答案 0 :(得分:5)

为什么不使用Set

require 'set'

set = Set.new
numbers.each do |number|
  puts "Number #{number} is already in the set" unless set.add?(number)
end

或者只是找到重复项:

require 'set'
set = Set.new
duplicates = numbers.reject { |number| set.add?(number) } 

答案 1 :(得分:2)

让我们看看Benchmark说的是什么:

require 'benchmark'
require 'set'


def rand_n(n, max)
  randoms = Array.new
  loop do
    randoms << rand(max)
    return randoms.to_a if randoms.size >= n
  end
end

numbers = rand_n(10000, 10000000)

counter = Hash.new
time = Benchmark.measure do
  for number in numbers
    if counter.has_key?(number)
      counter[number] = counter[number]+1
    else
      counter[number]=1
    end
  end
duplicates = counter.select{|k,v| v > 1}
end
puts time

time1 = Benchmark.measure do
  counts = Hash.new{|h,k| h[k] = 0 }
  numbers.each{|n| counts[n] +=1}
  duplicates = counts.select{|k,v| v > 1}
end
puts time1

set = Set.new
time2 = Benchmark.measure do
  duplicates = numbers.reject { |number| set.add?(number) }
end

puts time2

输出:

  0.000000   0.000000   0.000000 (  0.006114)
  0.010000   0.000000   0.010000 (  0.008529)
  0.010000   0.000000   0.010000 (  0.006098)

编辑:更新了基准测试中的重复发现并更新了结果。