微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 关于滑动窗口和memoization的计算

我正在研究Project Euler Problem 50,它指出:

The prime 41,can be written as the sum of six consecutive primes:

41 = 2 + 3 + 5 + 7 + 11 + 13
This is the longest sum of consecutive primes that adds to a prime below one-hundred.

The longest sum of consecutive primes below one-thousand that adds to a prime,contains 21 terms,and is equal to 953.

Which prime,below one-million,can be written as the sum of the most consecutive primes?

为了确定素数P中的项(如果它可以写成素数的总和),我使用所有素数的滑动窗口(按递增顺序)直到(但不包括)P,并计算所有的总和这些窗口,如果总和等于考虑的素数,我算一下窗口的长度……

这适用于1000以下的所有素数,但是对于高达10 ** 6的素数来说它非常慢,所以我希望备忘录会有所帮助;在计算滑动窗口的总和时,做了很多双重工作……(对吧?)

所以我在网上找到了标准的memoizaton实现,并将其粘贴在我的代码中,这是正确的吗? (我不知道应该怎么在这里工作……)

primes = tuple(n for n in range(1,10**6) if is_prime(n)==True)

count_best = 0


##http://docs.python.org/release/2.3.5/lib/itertools-example.html:
## Slightly modified (first for loop)
from itertools import islice
    def window(seq):
    for n in range(2,len(seq) + 1):

        it = iter(seq)
        result = tuple(islice(it,n))
        if len(result) == n:
            yield result    
        for elem in it:
            result = result[1:] + (elem,)
            yield result   

def memoize(function):
    cache = {}
    def decorated_function(*args):
        if args in cache:
            return cache[args]
        else:
            val = function(*args)
            cache[args] = val
            return val
    return decorated_function


@memoize 


def find_lin_comb(prime):
    global count_best

    for windows in window(primes[0 : primes.index(prime)]):
        if sum(windows) == prime and len(windows) > count_best:
            count_best = len(windows)
            print('Prime: ',prime,'Terms: ',count_best)


##Find them:
for x in primes[::-1]: find_lin_comb(x)

(顺便说一句,素数的元组是“正常”快速生成的)

所有的输入都很受欢迎,我只是一个业余爱好程序员,所以请不要对我有所了解.

谢谢!

编辑:这是一个没有破坏缩进的工作代码粘贴:
http://pastebin.com/R1NpMqgb

最佳答案

This works fine for all primes up to 1000,but for primes up to 10**6 it is very slow,so I was hoping memozation would help; when calculating the sum of sliding windows,a lot of double work is done…(right?)

是的,对.当然,对于高达106的素数而言,它的速度很慢.

假设您有n个素数到N,按递增顺序编号,p_1 = 2,p_2 = 3,….当考虑是否素数没有. k是连续素数的总和,你考虑所有窗口[p_i,…,p_j],对于对(i,j),其中i <1. j< ķ.它们有(k-1)*(k-2)/ 2.通过所有k到n,你总共检查了n³/ 6个窗口(计算多重性,你在总共n-j次检查w(i.j)).即使忽略创建窗口并对其进行求和的成本,您也可以看到它如何严重缩放:
>对于N = 1000,要检查n = 168个素数和约790000个窗口(计算多重性).
>对于N = 10 ** 6,有n = 78498个素数和大约8.3 * 10 ** 13个窗口需要检查.

现在考虑创建和求和窗口的工作,估计它在ji 1低,用于求和w(i,j)中的ji 1素数,p_k的工作约为k³/ 6,总工作量大约为k * * 4/24中. N = 1000,花生等3300万步,但N = 1000000,接近1.6 * 10 ** 18.

一年包含大约3.1 * 10 ** 7秒,具有~3GHz的cpu,大约1017个时钟周期.所以我们谈论的是需要100个cpu年的操作(可能是10个左右的因素).

你想,你不愿意等那么久;)

现在,通过记忆,你仍然可以多次查看每个窗口,但是你只对每个窗口进行一次计算.这意味着您需要大约n³/ 6的工作来计算窗口,并在任何窗口看一下n³/ 6次.

>问题1:您仍需要查看大约8.3 * 10 ** 13次的窗口,即使只花费一个周期,也需要几个小时.
>问题2:有大约8.3 * 10 ** 13个窗口要记忆.你没有那么多的记忆,除非你可以使用一个非常大的高清.

您可以通过丢弃不再需要的数据来规避内存问题,并且只在需要时计算窗口的数据,但是一旦您知道可能会丢弃哪些数据,您应该能够看到更好的方法.

The longest sum of consecutive primes below one-thousand that adds to a prime,and is equal to 953.

这告诉你关于产生这笔金额的窗口是什么?哪里可以开始,哪里可以停止?如何使用该信息创建一个有效的算法来解决问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open