在大量数字列表中搜索特定数字的效率
Efficiency of searching a large list of numbers for certain digits
我有以下代码,其中 eratosthenes(N)
returns 一个从 1 到 N 的素数数组。我想要做的是从此列表中删除包含数字 0、2、 4、5、6、8。我的代码似乎效率低下且错误,因为它需要大约 20 秒(eratosthenes(N)
是瞬时的)才能达到 100,000,并且没有删除我想要的所有数字。有没有更好的、可扩展的解决方案来解决这个问题?
N = 1_000_000
primes = eratosthenes(N)
primes.each do |num|
if ["0", "2", "4", "5", "6", "8"].any? { |digit| num.to_s.include?(digit) }
primes.delete(num)
end
end
我认为您正在寻找类似的东西:
primes.reject!{|num| num % 2 == 0}
你的方法的问题是每个 delete
重写数组,并且为每个删除的项目调用它,所以算法的复杂度是 O(n^2) 而不是 O(n)。
你应该这样做:
primes.reject!{|num| ["0", "2", "4", "5", "6", "8"].any? { |digit| num.to_s.include?(digit) }}
或者简单地说:
primes.reject!{|num| num.to_s[/[024568]/]}
这只是样式问题,但我会将所有内容放在一行中(注意此处 reject
中缺少 !
):
primes = eratosthenes(N).reject{|num| num.to_s[/[024568]/]}
我有以下代码,其中 eratosthenes(N)
returns 一个从 1 到 N 的素数数组。我想要做的是从此列表中删除包含数字 0、2、 4、5、6、8。我的代码似乎效率低下且错误,因为它需要大约 20 秒(eratosthenes(N)
是瞬时的)才能达到 100,000,并且没有删除我想要的所有数字。有没有更好的、可扩展的解决方案来解决这个问题?
N = 1_000_000
primes = eratosthenes(N)
primes.each do |num|
if ["0", "2", "4", "5", "6", "8"].any? { |digit| num.to_s.include?(digit) }
primes.delete(num)
end
end
我认为您正在寻找类似的东西:
primes.reject!{|num| num % 2 == 0}
你的方法的问题是每个 delete
重写数组,并且为每个删除的项目调用它,所以算法的复杂度是 O(n^2) 而不是 O(n)。
你应该这样做:
primes.reject!{|num| ["0", "2", "4", "5", "6", "8"].any? { |digit| num.to_s.include?(digit) }}
或者简单地说:
primes.reject!{|num| num.to_s[/[024568]/]}
这只是样式问题,但我会将所有内容放在一行中(注意此处 reject
中缺少 !
):
primes = eratosthenes(N).reject{|num| num.to_s[/[024568]/]}