📜  最大序列长度 |科拉兹猜想

📅  最后修改于: 2021-09-17 07:35:32             🧑  作者: Mango

给定一个整数N 。任务是在从1N-1的范围内找到其 Collatz 序列中具有最大项数和序列中项数的数字。

数字 N的 collatz 序列定义为:

  • 如果N奇数,则将N更改为3*N + 1
  • 如果NEven然后将N更改为N / 2

例如,让我们看看N = 13时的序列:
13 -> 40 -> 20 -> 10 -> 5 > 16 -> 8 -> 4 -> 2 -> 1

例子:

方法:

正如在上面讨论的N = 13示例中, N = 13N = 40 的collatz 序列具有相似的术语,除了一个,这确保可能涉及动态编程来存储子问题的答案并重用它。

但是在这里正常的记忆将不起作用,因为在一个步骤中,我们要么使一个数字变大(在上面的例子中 N = 13 取决于 N = 40 的解决方案)要么除以2 (N = 40 解决方案取决于解决方案N = 20)。

因此,我们将使用 Map/dictionary 数据结构来存储子问题的解决方案,而不是使用 dp 数组,并将执行 collatz 序列中讨论的正常操作。

下面是上述方法的实现:

def collatzLenUtil(n, collLenMap):
      
    # If value already 
    # computed, return it
    if n in collLenMap:
        return collLenMap[n]
      
    # Base case
    if(n == 1):
        collLenMap[n] = 1
  
    # Even case
    elif(n % 2 == 0):
        collLenMap[n] \
        = 1 \
           + collatzLenUtil(n//2, collLenMap)
  
    # Odd case
    else:
        collLenMap[n] \
        = 1 \
          + collatzLenUtil(3 * n + 1, collLenMap)
      
    return collLenMap[n]
  
def collatzLen(n):
      
    # Declare empty Map / Dict
    # to store collatz lengths
    collLenMap = {}
      
    collatzLenUtil(n, collLenMap)
  
    # Initalise ans and 
    # its collatz length
    num, l =-1, 0
      
    for i in range(1, n):
          
        # If value not already computed,
        # pass Dict to Helper function
        # and calculate and store value
        if i not in collLenMap:
            collatzLenUtil(i, collLenMap)
          
        cLen = collLenMap[i]
        if l < cLen:
            l = cLen
            num = i
      
    # Return ans and 
    # its collatz length
    return (num, l)
  
print(collatzLen(10))
输出:
(9, 20)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。