如何在Python中使用非常长的字符串?

时间:2008-12-09 15:35:59

标签: python

我正在处理项目euler的problem 220(看起来比较简单 其他人 - 以为我会尝试更高编号的一个进行更改!)

到目前为止,我有:

D = "Fa"

def iterate(D,num):
    for i in range (0,num):
        D = D.replace("a","A")
        D = D.replace("b","B")
        D = D.replace("A","aRbFR")
        D = D.replace("B","LFaLb")
    return D

instructions = iterate("Fa",50)

print instructions

现在,这适用于低值,但是当你把它重复更高时,你就会得到一个“内存错误”。任何人都可以提出一种方法来克服这个问我真的想要一个包含下一步说明的字符串/文件。

6 个答案:

答案 0 :(得分:3)

诀窍在于注意在每次迭代中运行字符串时会出现哪些模式。尝试将iterate(D,n)评估为1到10之间的n,看看是否可以发现它们。还可以通过计算结束位置和步数的函数来提供字符串,并在那里查找模式。

然后,您可以使用此知识将算法简化为根本不使用这些字符串的内容。

答案 1 :(得分:2)

如果你考虑D(0),D(1)等中有多少“a”和“b”字符,你会发现字符串很快变长。计算D(50)中有多少个字符,然后再考虑一下你将存储那么多数据的位置。我将它设为4.5 * 10 ^ 15个字符,即每个字符一个字节为4500 TB。

想一想,你不必计算 - 问题告诉你至少有10 ^ 12个步骤,这是每个字符一个字节的TB级数据,如果你使用技巧则是四分之一每个字符降低到2位。我认为这会导致我可以访问的任何类型存储介质的一分钟时间限制出现问题: - )

答案 2 :(得分:2)

Python字符串不会是这个字符串的答案。字符串存储为不可变数组,因此每个替换都会在内存中创建一个全新的字符串。更不用说,10 ^ 12步之后的指令集如果你把它们存储为字符,那么它的大小至少为1TB(并且这些指令只有一些小的压缩)。

理想情况下,应该有一种方法可以在数学上(提示,有)动态生成答案,这样您就不需要存储序列。

只需使用字符串作为指南即可确定创建路径的方法。

答案 3 :(得分:1)

由于您无法实现字符串,因此必须生成它。如果您生成单个字符而不是返回整个字符串,则可以使其工作。

def repl220( string ):
    for c in string:
        if c == 'a': yield "aRbFR"
        elif c == 'b': yield "LFaLb"
        else yield c

这样的东西会在不创建新字符串的情况下进行替换。

现在,当然,你需要递归地调用它,并达到适当的深度。因此,每个收益率不仅仅​​是收益率,而是更复杂的东西。

尽量不要为你解决这个问题,所以我会把它留在那里。

答案 4 :(得分:1)

正如使用replace()函数时要小心警告。如果你的字符串非常大(在我的情况下是〜5e6个字符),则replace函数将返回字符串的一个子集(大约~4e6个字符),而不会抛出任何错误。

答案 5 :(得分:0)

您可以将D视为字节流文件。

类似的东西: -

seedfile = open('D1.txt','w'); seedfile.write( “FA”); seedfile.close(); n = 0 而(n

警告完全未经测试