Algorithm Collatz猜想相关访谈
这是一个采访问题,似乎与欧拉计划有关 Collatz猜想说,如果你做以下事情Algorithm Collatz猜想相关访谈,algorithm,collatz,Algorithm,Collatz,这是一个采访问题,似乎与欧拉计划有关 Collatz猜想说,如果你做以下事情 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之间的所有数,这样这些数的链长度我想你可以通过反向运行这个过程在O(S)中解决这个
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之间的所有数,这样这些数的链长度我想你可以通过反向运行这个过程在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
|
2
|
4
|
8
|
16
| \
32 \
| 5
64 |
/| 10
/ 128 | \
21 20 3
我们可以使用一个工作队列来实现这个算法,该队列存储我们需要访问的号码及其链的长度。我们用对(1,0)填充队列,然后连续地从队列中取出一个元素(z,n),并将(2z,n+1)和(可能)(z-1)/3,n+1)放入队列。这实际上是从一开始在Collatz图中进行广度优先搜索。当我们在深度k处找到第一个元素时,我们停止搜索
假设Collatz猜想成立,我们将永远不会以这种方式得到任何副本。此外,通过这种方式,我们将发现所有数字最多可以在k步内到达(您可以通过快速归纳证明快速检查)。最后,这需要O(S)时间。要了解这一点,请注意每个生成的数字所做的工作是一个常量(出列并在队列中插入最多两个新数字)
希望这有帮助 我很好奇这个方法的空间复杂度。它最多是2^n,因为每个数字最多分支两次。我认为几乎不可能得到一个比这更好的界,因为它还没有确定这是否总是终止。“如果一个数字z有一个长度为n的链,z-1是三的倍数(不是0或1),那么(z-1)/3有一个长度为n+1的链。”-我认为这是不对的。在这种情况下,您应该在树中有一条从
4
到1
的边,因为4-1=3
@IVlad-但是4-1=3 x 1,所以不添加边。“除了零或一”我的意思是“3m代表m不等于零或一”。所以也许我应该说“不是零或三。”这更有意义:)。我把它读作“z-1而不是0或1”。