Algorithm 欧拉计划#14:科拉兹猜想-有哪些算法可以有效地利用记忆/速度?
问题链接: 因此,我使用R中相当“琐碎”的memonization实现解决了这个问题。基本上,我只是从1:1000000开始计算,然后计算collatz应用程序的数量,直到达到1。如果遇到一个小于当前迭代的数字,我只需将该数字的“链”添加到当前序列中 R代码: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
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++中的记忆版本导致堆栈溢出!