Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Collatz猜想相关访谈_Algorithm_Collatz - Fatal编程技术网

Algorithm 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)中解决这个

这是一个采访问题,似乎与欧拉计划有关

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)中解决这个问题。如果您知道k是什么,那么您可以使用以下逻辑构建最多在k个步骤中停止的所有数字:

  • 1具有长度为0的链

  • 如果数字z的链长度为n,则2z的链长度为n+1

  • 如果一个数字z有一个长度为n的链,z-1是三的倍数(不是0或3),并且(z-1)/3是奇数,那么(z-1)/3有一个长度为n+1的链
由此,您可以开始按照从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”。