【发布时间】:2013-12-04 01:55:37
【问题描述】:
我有一个简单的方法可以找到素数,将它们放入一个数组中,然后将它们相加。有哪些可能的步骤来加快速度?
def prime?(number, array)
array.each do |x|
if number % x == 0
return false
end
end
true
end
def sum_prime(number)
i = 0
prime = 1
output = [2]
while prime < number
if prime?(prime, output)
i += 1
output << prime if prime != 1
p prime
end
prime += 2
end
output.inject(:+)
end
sum_prime(200000)
array#each 好吗?我可以采用不同的方式连接以获得更快的结果吗?
【问题讨论】:
-
假设您必须将值存储在一个数组中,
array.inject(:+)似乎与 ruby 中的速度一样快。唯一的其他建议是使用像 C 这样的编译语言,但即使这样,改进也可能可以忽略不计。 -
将您的结果与使用内置 Prime 类 (ruby-doc.org/stdlib-1.9.3/libdoc/prime/rdoc/Prime.html) 进行比较。那么你可能会知道你是否可以更快地获得它:)
-
对于非常大的 sum_prime,您可以将请求发送到更快的语言。您还可以通过使用现有已知值启动哈希并从那里开始来做一些捷径:shortCut={100 => sum_prime(100), 1000 => sum_prime(1000), ad-nausum。然后你可以从最小的价值开始计算,并为自己节省相当多的内存。
-
@mr.musicman 如果不需要在数组中,则在每个
prime可用时将每个值添加到sum += prime。 -
如果您的目标只是对素数求和,那么downloading a list 可能会更好。