我是解决算法的新手,所以请耐心等待。
我已经解决了最大长度为1,000,000的Collatz序列,但我希望通过使用哈希表来查找已经存在的键以使功能更快,从而提高效率。但是,我知道我做错了什么,因为它应该只需要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)
答案 0 :(得分:1)
在我的脑子里整整一整夜之后,我重新整理了整个事情,并在每一步都写出了每一步,并意识到我的根本问题是我不能从之前调用collatz方法(因为该方法计算整个链条,而我需要它来停止我已经计算过的数字)。以下是我的解决方案:
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]的值来添加到此时的链编号。