这是一个非常简单的问题;哪些项目在列表中出现多次?
array = ["mike", "mike", "mike", "john", "john", "peter", "clark"]
正确答案是["mike", "john"]
.
看来我们只能这样做:
array.select{ |e| ary.count(e) > 1 }.uniq
问题解决了。可是等等!如果数组真的很大怎么办:
1_000_000.times { array.concat("1234567890abcdefghijklmnopqrstuvwxyz".split('')) }
碰巧我需要弄清楚如何在合理的时间内做到这一点。我们谈论的是数以百万计的记录。
就其价值而言,这个大型阵列实际上是 10-20 个较小阵列的总和。如果比较这些更容易,请告诉我 - 我被难住了。
我们谈论的是每个文件 10,000 到 10,000,000 行,数百个文件。
做类似的事情
items = 30_000_000
array = items.times.map do
rand(10_000_000)
end
puts "Done with seeding"
puts
puts "Checking what items appear more than once. Size: #{array.size}"
puts
t1 = Time.now
def more_than_once(array)
counts = Hash.new(0)
array.each do |item|
counts[item] += 1
end
counts.select do |_, count|
count > 1
end.keys
end
res = more_than_once(array)
t2 = Time.now
p res.size
puts "Took #{t2 - t1}"
为你工作?
在我的机器上持续时间约为40秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)