Ruby——使用Hash求解Collat​​z序列

标签 ruby algorithm collatz

我对解决算法还很陌生,所以请多多包涵。

我已经解决了最大长度为 1,000,000 的 Collat​​z 序列,但我想通过使用哈希表查找已经存在的键来提高效率,从而使函数更快。但是,我知道我做错了什么,因为运行 number = 1,000,000 应该只需要大约 1-2 秒,但它仍然需要 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)

最佳答案

绞尽脑汁一晚上后,我重新做了整个事情,把每一步都写了出来,意识到我的根本问题是我不能调用之前的 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] 的值添加到该点之前的链号。

关于Ruby——使用Hash求解Collat​​z序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40269555/

相关文章:

ruby - 在 Xcode 机器人触发器中安装 Pod

ruby - 包括鞋中鞋套餐

arrays - 返回最大和的子数组

python - Collat​​z 函数未正确退出

ruby-on-rails - 从 GMail 导入联系人 - 设计问题

ruby-on-rails - 在允许用户使用设计(rails)登录之前检查用户是否处于事件状态

algorithm - 强连通图

algorithm - 循环或排序分层绘制?

c - 3n+1算法

c++ - 在我的递归函数中跟踪计数 (Collat​​z)