为什么我的ruby脚本执行时间太长?

时间:2015-08-25 13:45:47

标签: ruby algorithm time-complexity primes

我正在尝试从http://www.beatmycode.com/challenge/5/take解决问题,我写了一个脚本:

def is_prime?(num)
  (2...num).each do |divisor|
    return false if num % divisor == 0
  end
  true
end
def circular_prime(num)
  circular_primes = [] 
  if num < 2
    return false
  end
  (2..num-1).each do |number|
    is_prime?(number)
    result = [number.to_s]
    (0..number.to_s.size-2).each do |x|
      var = result.last.split('')
      result << var.unshift(var.pop).join if var.uniq.size != 1
    end
    circular_primes << result if result.all?{ |x| is_prime? x.to_i }
  end
end

当我使用10100100010_000对其进行测试时,脚本的执行速度非常快,但当我使用100_000进行测试时, shell显示Interrupt错误。弱点在哪里,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的is_prime?方法太慢了。一些小的改进可能是:

  • 您不必一直测试divisornum,即平方根 num就够了。
  • 您可以跳过所有偶数,因为2是唯一的素数 号。

然而,这仍然不够好,因为算法很慢。由于您需要在连续的整数中生成素数,请考虑使用Sieve of Eratosthenes

当然有prime标准库,但我假设您想手动执行此操作。

答案 1 :(得分:0)

此脚本的时间复杂度为O(n^2),因此预计完成大量输入需要很长时间。尝试使用https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes查找素数并记住哪个数字是某个数组中的素数。