Ruby - 使用Hash来解决Collat​​z序列

时间:2016-10-26 18:22:32

标签: ruby algorithm collatz

我是解决算法的新手,所以请耐心等待。

我已经解决了最大长度为1,000,000的Collat​​z序列,但我希望通过使用哈希表来查找已经存在的键以使功能更快,从而提高效率。但是,我知道我做错了什么,因为它应该只需要1-2秒就可以运行数字= 1,000,000,但它仍然需要9-10秒才能运行。我在算法中使用哈希表是一个新手,所以有人可以告诉我在我的方法中我做错了什么吗?

非常感谢!

def collatz(n)
  chain = 1
  until n == 1
    n = (n.even?) ? (n/2) : (n*3+1)
    chain += 1
  end
  chain
end

def longest_chain2(number)
  cache = { 1 => 1 }
  start_num = 1
  longest = 1
  while start_num < number
    chain = cache[start_num]
    if chain > longest
      longest = chain
      longest_start = start_num
    end
    start_num += 1
    cache[start_num] = collatz(start_num)
  end
  return longest_start
end

puts longest_chain2(1000000)

1 个答案:

答案 0 :(得分:1)

在我的脑子里整整一整夜之后,我重新整理了整个事情,并在每一步都写出了每一步,并意识到我的根本问题是我不能从之前调用collat​​z方法(因为该方法计算整个链条,而我需要它来停止我已经计算过的数字)。以下是我的解决方案:

def longest_chain2(number)
  cache = { 1 => 1 }
  start_num = 1
  longest = 1
  while start_num < number
    n = start_num
    chain = 0
    while n != 1 && n >= start_num
      if n.even?
        n = n/2
      else
        n = 3*n+1
      end
      chain += 1
    end
    chain += cache[n]
    if chain > longest
      longest = chain
      longest_start = start_num
    end
    cache[start_num] = chain
    start_num += 1
  end
  return longest_start
end

这样,我将添加尚不存在的密钥,同时调用cache [n]的值来添加到此时的链编号。