首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collatz猜想相关访谈

Collatz猜想相关访谈
EN

Stack Overflow用户
提问于 2011-03-25 19:53:45
回答 1查看 2.1K关注 0票数 9

这是一个面试问题,似乎与Euler 问题14项目有关

Collatz猜想说,如果您做以下操作

代码语言:javascript
复制
If n is even, replace n by n/2.
If n is odd, replace n by 3n+1.

你最终只能得到1。

例如,5 -> 16 -> 8 -> 4 -> 2 -> 1

假设猜想为真,每个数都有一个链长:达到1所需的步骤数(链长1为0)。

给出了自然数n,m和自然数k,给出了求1到n之间的所有数的算法,使得这些数的链长为<= k,其中任意一个数的链必须只包含介于1和m之间的数(即不能超过m)。

一个简单的方法是用暴力把它赶出去,并把它和回忆录结合起来。

采访者说,有一个O(S)时间算法,其中S是我们需要输出的数字数。

有人知道可能是什么吗?

EN

回答 1

Stack Overflow用户

发布于 2011-03-25 20:17:56

我认为您可以在O(S)中通过向后运行这个过程来解决这个问题。如果您知道k是什么,那么可以使用以下逻辑在最多k个步骤中生成停止的所有数字:

  • 1有一个长度为0的链。
  • 如果一个数z有一个长度n的链,那么2z有一个长度n+ 1的链。
  • 如果一个数z的链长为n,z- 1是三(0或3除外)的倍数,(z - 1)/3是奇数,则(z - 1) /3有一条长度n+1的链。

从这里开始,您可以开始在从1开始的序列中建立数字:

代码语言:javascript
复制
                  1
                  |
                  2
                  |
                  4
                  |
                  8
                  |
                  16
                  | \
                  32 \
                  |   5
                  64  |
                 /|   10
                / 128 | \
               21     20 3

我们可以使用一个工作队列来完成这个算法,存储我们需要访问的数字和它们的链的长度。我们用对(1,0)填充队列,然后从队列(2z,n+ 1)和(可能)((z-1)/ 3,n+ 1)连续地将一个元素(z,n)排到队列中。这实际上是在Collatz图中进行宽度优先搜索,从1开始。当我们在k深度找到第一个元素时,我们停止搜索。

假设Collatz猜想成立,我们就永远不会得到这样的重复。此外,我们会发现,所有的数字最多可以在k步中这样做(你可以用快速的归纳证明来快速地检查这个数字)。最后,这需要O(S)时间。要查看这一点,请注意,生成的每个数字所做的工作是一个常量(去队列并将最多两个新数字插入到队列中)。

希望这能有所帮助!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5437445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档