Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 欧拉计划#14:科拉兹猜想-有哪些算法可以有效地利用记忆/速度?_Algorithm_Performance_Big O_Dynamic Programming_Memoization - Fatal编程技术网

Algorithm 欧拉计划#14:科拉兹猜想-有哪些算法可以有效地利用记忆/速度?

Algorithm 欧拉计划#14:科拉兹猜想-有哪些算法可以有效地利用记忆/速度?,algorithm,performance,big-o,dynamic-programming,memoization,Algorithm,Performance,Big O,Dynamic Programming,Memoization,问题链接: 因此,我使用R中相当“琐碎”的memonization实现解决了这个问题。基本上,我只是从1:1000000开始计算,然后计算collatz应用程序的数量,直到达到1。如果遇到一个小于当前迭代的数字,我只需将该数字的“链”添加到当前序列中 R代码: collatz <- function(n) { if(n %% 2 == 0) return(n / 2) else return(3 * n + 1) } chains <- rep(0, 1e6) for

问题链接:

因此,我使用R中相当“琐碎”的memonization实现解决了这个问题。基本上,我只是从1:1000000开始计算,然后计算collatz应用程序的数量,直到达到1。如果遇到一个小于当前迭代的数字,我只需将该数字的“链”添加到当前序列中

R代码:

collatz <- function(n) {

  if(n %% 2 == 0) return(n / 2)
  else return(3 * n + 1)

}

chains <- rep(0, 1e6)

for(i in 1:length(chains)) {

  n <- i
  iter <- 0

  while(n != 1) {

    n <- collatz(n)
    iter <- iter + 1

    if(n < i) {
      iter <- iter + chains[n]
      break
    }

  }

  chains[i] <- iter

}

which.max(chains)

collatz您正在严格按照1:1000000的顺序进行记录。但是,没有理由不在第一次看到值时进行记忆。例如,从
3
开始给出序列
3->10->5->16->8->4->2->1
。除了只记忆
3
之外,还可以记忆
10,5,16,8,4


这将减少行动的数量,也许会大大减少。继续上面的示例,第一次看到它时,将其记忆
4
保存了以后将其记忆所需的2个步骤,将
5
记忆保存了另外3个步骤。看起来这些保存的步骤应该会很快滚雪球。

只是一个建议:这些变量的命名方式我无法在合理的时间内找出代码的作用。需要改进的地方。将while循环分解成一个函数将有助于理清控制流。我正在努力使用这种方法,因为我不确定循环中迭代向量以及用于记忆的“哈希”表的预分配大小。事实证明,使用一种每次都会附加到两者的简单方法,速度要慢得多。这详细描述了您的问题:@charlespehlivian我最初的简单代码运行时间为9秒,而他说他的记忆示例几乎需要一分钟。我不相信他以最有效的方式实现了这种高级的记忆。递归有附加的问题!我在C++中的记忆版本导致堆栈溢出!