【发布时间】:2016-12-26 12:45:00
【问题描述】:
这是一个非常简单的问题;哪些项目多次出现在列表中?
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 行,数百个文件。
【问题讨论】:
-
有点头脑风暴,但是如果我们将这些值输入到哈希表中,那么如果它们开始冲突,我们会假设它是重复的?
-
头脑风暴继续:假设 1,000,000,000 个条目的 32 位散列将需要一个最多 4 GB 的表。通过使用每个位代表一个占用的散列的位集,这可以归结为 116 兆字节。这种方法需要两次遍历数据以过滤掉潜在的重复项。
-
什么是您的用例可接受的运行时?不确定我是否理解较小数组的比较注意:如果您确定每个数组包含未出现在其他数组中的项目,这只会返回相同的结果。
-
我无法忘记你的头像。
-
@CarySwoveland 嘿,Cary,我前段时间给你发了电子邮件,寻求 Ruby 的帮助。我想象我的化身唱男高音。你怎么看?
标签: arrays ruby performance sorting unique