以下是我对Eratosthenes筛选的实现,以找到上限参数的素数。
目前,当我的参数为2,000,000时,我的代码在大约2秒内完成。我看到我通过将数字设置为nil再做一个额外的步骤,然后压缩而不是仅仅在一步中删除这些数字。
我将如何实施此功能?您是否还有其他建议可以提高我的代码速度?
def sieve(upper)
i = 0
list = (2..upper).to_a
(2..Math.sqrt(upper)).each do |mult|
init = mult + i
(init..upper-1).step(mult) do |index|
list[index] = nil
end
i += 1
end
list.compact
end
答案 0 :(得分:1)
您可以跳过mult
不是素数的循环。
def sieve(upper)
i = 0
list = (2..upper).to_a
(2..Math.sqrt(upper)).each do |mult|
if list[i] #proceed only when mult is prime
init = mult + i
(init..upper-1).step(mult) do |index|
list[index] = nil
end
end
i += 1
end
list.compact
end
在我的机器上将运行时间从1.9秒减少到0.7秒。不过,我确信还有很多工作要做。