当前位置: 首页 > 知识库问答 >
问题:

Project Euler p14增强性能

卢知
2023-03-14

我已经用以下代码完成了项目欧拉问题14:

def longest_Collatz_sequence():
    """
    returns longest Collatz
    sequence based on formula:
    n --> n/2 (n is even)
    n --> 3n + 1 (n is odd)
    """
    bestSequence = []
    lengthOfLongest = 0
    longestSequence = []
    for n in range(999999,1,-1):
        while n != 1:
            l = len(longestSequence)
            if n % 2 == 0:
                longestSequence.append(n)
                n /= 2
            elif n % 2 != 0:
                longestSequence.append(n)
                n = (n * 3) + 1
            if longestSequence[-1] == 2 and lengthOfLongest < l:  
                lengthOfLongest = l
                bestSequence = longestSequence[:]
                bestSequence.append(1)       
        longestSequence = []
    return bestSequence[0] 

将最长的Collatz数字序列从1000000降到2大约需要39秒。我想知道我是否可以缓存任何值来加速我的代码,以及如何在不获得无限循环的情况下从代码中删除if longestSequence[-1]==2,以及任何其他可以改进代码的方法

为正整数集定义以下迭代序列:

n→n/2(n为偶数)n→3n 1(n为奇数)

使用上述规则,从13开始,我们生成以下序列:

13→ 40→ 20→ 10→ 5.→ 16→ 8.→ 4.→ 2.→ 1可以看出,该序列(从13开始,到1结束)包含10个术语。虽然这还没有被证明(科拉兹问题),但人们认为所有的起始数字都以1结束。

100万以下的哪个起始数字产生的链条最长?

注:一旦链开始,条款允许超过一百万。

共有1个答案

冯卓
2023-03-14

每次在序列中生成一个项目时,也会生成该项目的项目。例如,对于13,您发现它生成10个项目。但在这个过程中,你还会发现40产生9个项目,20产生8个项目,10产生7个项目,等等。你可以在列表或字典中记住这些信息,这样在做13之后,你就不必再看40、20、10、5、16、4或2。

此外,当您生成以前从未见过的序列时,您可以查看此信息并将其用作快捷方式。对于13,你在看到13之前就已经看到了10,所以你只需计算40,20,10,然后你就知道10产生了7个项目,所以你只需将其添加到你已经看到的3个项目中,而不用计算其余的。

这将使用相当多的内存,但对于您必须考虑的项目数量来说,这是完全可行的。您可以使用某种截止(例如,仅存储100000或以下数字的结果),这仍然可以实现速度的极大提高,但使用的内存更少。

实现这一点的一种简单方法是重写函数,以递归方式而不是迭代方式计算序列,然后应用像这样的记忆修饰符。递归有一些开销,但记忆的好处可能会超过这一点。

 类似资料:
  • 我正在逐个迭代字符串对象列表中的元素: 在这里,每次我调用list上的get()时,列表都会从其一端一直迭代到第i个元素——因此上面循环的复杂性是O(n^2)。 是a.)对于增强型for循环,与上面相同,还是b.)对于循环,将指针保持在最后一个指针所在的位置,因此下面循环的复杂性是O(n)? 如果上面的情况(b)——我想是这样的——在列表上使用迭代器有什么好处吗。这是简单的迭代--没有回头路 蒂亚

  • 本文向大家介绍MySQL 5.7增强版Semisync Replication性能优化,包括了MySQL 5.7增强版Semisync Replication性能优化的使用技巧和注意事项,需要的朋友参考一下 一 前言 前文 介绍了5.5/5.6 版本的MySQL semi sync 基础原理和配置,随着MySQL 5.7 的发布,新版本的MySQL修复了semi sync 的一些bug 并且增强了

  • 关于Java,我非常习惯于将我的所有变量声明为私有的,并生成公共的getters和setters以符合通用的约定。 不过,我觉得很奇怪:对于除了赋值和返回请求值之外没有其他功能的getters和setters,调用以下方法不会影响性能吗: 而不是: 编译器是否在这里做了一些事情来帮助函数调用不增加额外的周期?如果不是的话,那么在更健壮的应用程序中,这一理论不就是雪球吗? 编辑:: 为了澄清,这个问

  • ZGC 或 Z 垃圾收集器是在 Java 11 中引入的,作为一种低延迟垃圾收集机制。ZGC 确保垃圾收集暂停时间不依赖于堆大小。无论堆大小是 2MB 还是 2GB,它都不会超过 10 毫秒。 但是 ZGC 在将未使用的堆内存返回给操作系统方面存在限制,例如 G1 和 Shenandoah 等其他 HotSpot VM GC。以下是使用 Java 13 完成的增强功能: ZGC 默认将未提交的内存

  • 我有一个手风琴,它在我的页面内工作得很好。当你点击标题时,隐藏的div会显示,当你再次点击它时,它会再次隐藏。我想通过增加一个功能来增强手风琴,使手风琴一次只显示一个项目。换句话说,如果我打开了一个项目,并单击另一个标题,则当前打开的项目将自动关闭。 这是HTML 这是我的jQuery代码 如您所见,我有一个main(div class=“cap”)后跟一个(div class=“capitalo

  • 除了agent和环境之外,强化学习的要素还包括策略(Policy)、奖励(reward signal)、值函数(value function)、环境模型(model),下面对这几种要素进行说明: 策略(Policy) ,策略就是一个从当环境状态到行为的映射; 奖励(reward signal) ,奖励是agent执行一次行为获得的反馈,强化学习系统的目标是最大化累积的奖励,在不同状态下执行同一个行