arrays - 如何查找 MASSIVE 数组中哪些项出现多次?

标签 arrays ruby performance sorting unique

这是一个非常简单的问题;哪些项目在列表中出现多次?

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('')) }

碰巧我需要弄清楚如何在合理的时间内做到这一点。我们谈论的是数以百万计的记录。

就其值(value)而言,这个巨大的数组实际上是 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 秒。

关于arrays - 如何查找 MASSIVE 数组中哪些项出现多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037626/

相关文章:

java - 错误 : java. util.Arrays$ArrayList 无法转换为 java.util.ArrayList

ruby - 适用于 Ruby 1.9 的分配跟踪器?

javascript - 检查数组是否在 javascript 中最有效地排序(增加,严格增加,减少,严格减少)

mysql - SELECT * 与 SELECT * LIMIT(性能)

ruby - WEBrick:记录 POST 数据

.net - 如何将位图存储在.NET的内存中?

javascript - 为什么某些数组在 chrome 检查器中的值旁边显示有字母?

javascript - 创建一个函数以将整数数组旋转给定的步数

java - 使用大小参数实例化名称数组的公共(public)构造函数

ruby-on-rails - 将 template.js.erb 重写为 template.js.slim