gpt4 book ai didi

ruby - 数组与 Ruby 中重复元素的交集

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:47 25 4
gpt4 key购买 nike

我想(快速)确定一个数组是否包含另一个数组的所有元素,同时考虑到数组可能有重复的元素。

因此,我尝试了这样的事情:

alice = %w(a a a b)
bob = %w(a a b c d e)
alice & bob => ["a", "b"]
alice - bob => []

但我想要的是一个运算符,它可以让我确定 bob 不包含 alice 的所有元素,因为 bob 没有足够的“a”字符。

最佳答案

alice.select{|x| alice.count(x) > bob.count(x)}

更新设置基准:

require 'benchmark'

def subset_multivalue?(a, b)
bb = b.clone
a.each do |e|
i = bb.index(e)
if i
bb.delete_at(i)
else
return false
end
end
return true
end

def subset_multivalue2?(a, b)
a.find{|x| a.count(x) > b.count(x)}
end

def subset_multivalue3?(alice, bob)
alice_counts = alice.each_with_object(Hash.new(0)) { |o, h| h[o] += 1 }
bob_counts = bob.each_with_object(Hash.new(0)) { |o, h| h[o] += 1 }

alice_counts.all? do |k, v|
bob_counts.has_key?(k) && bob_counts[k] >= v
end
end

alice = %w(a a a b)
bob = %w(a a b c d e)

Benchmark.bm do |x|
x.report("dave:") do
1000000.times do
subset_multivalue?(alice, bob)
end
end

x.report("me:") do
1000000.times do
subset_multivalue2?(alice,bob)
end
end

x.report("andrew:") do
1000000.times do
subset_multivalue3?(alice,bob)
end
end
end

结果:

       user     system      total        real
dave: 15.054000 0.000000 15.054000 ( 15.108864)
me: 11.529000 0.031000 11.560000 ( 11.689669)
andrew: 65.036000 0.047000 65.083000 ( 67.463859)

关于ruby - 数组与 Ruby 中重复元素的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com