2008-12-09 24 views
5

我解決項目歐拉problem 220(看起來容易,相較於一些 別人的 - 想我會嘗試更高編號一個改變!)如何在Python中使用很長的字符串?

到目前爲止,我有:

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 

現在,這適用於低值,但是當你把它重複得更高時,你就會得到一個「內存錯誤」。任何人都可以提出一種解決方法嗎?我真的想要一個包含下一步操作說明的字符串/文件。

+0

+1來抵消完全不需要的(IMHO)downvote。 – 2008-12-09 15:49:24

回答

2

Python字符串都不會是這個問題的答案之一。字符串存儲爲不可變的陣列,因此這些替換中的每一個創建一個全新的字符串在內存中,更重要的是,如果你將它們存儲爲字符(並且有一些小的壓縮),10^12步之後的指令集將至少爲1TB。

理想情況下,應該有一種數學方式(提示,存在)即時生成答案,以便您永遠不需要存儲序列。

只需使用字符串作爲指導,以確定創建您的路徑的方法。

2

如果你考慮D(0),D(1)等有多少個「a」和「b」字符,你會發現這個字符串很快就會變得很長。計算D(50)中有多少個字符,然後再想一想你會在哪裏存儲那麼多的數據。我做了4.5 * 10^15個字符,每個字符一個字節爲4500 TB。

想想吧,您不必計算 - 問題告訴您至少有10^12個步驟,這是每個字符一個字節的TB數據量,或者如果您使用該數據的四分之一技巧來降低每個字符2位。我認爲這會導致我有權訪問的任何種類的存儲介質上的一分鐘時間限制出現問題:-)

1

由於您無法實現字符串,因此必須生成該字符串。如果您生成單個字符而不是返回整個字符串,則可能會使其起作用。

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

類似的東西會做替換而不創建一個新的字符串。

現在,當然,你需要遞歸地調用它,並適當的深度。所以,每個收益率不僅僅​​是收益率,而是更復雜一些。

試着不要爲你解決這個問題,所以我會留下來。

3

訣竅是注意在每次迭代中運行字符串時出現哪些模式。嘗試評估iterate(D,n) n爲1和10之間,看看你是否可以發現它們。還要通過計算結束位置和步數的函數來提供字符串,並在那裏查找模式。

然後,您可以使用這些知識來簡化算法,使其完全不使用這些字符串。

0

你可以把D當成一個字節流文件。

是這樣的: -

seedfile =開放( 'D1.txt', 'W'); seedfile.write(「Fa」); seedfile.close(); n = 0的 而(正

警告完全未測試

1

就像在使用replace()函數時要小心警告一樣。如果你的字符串非常大(在我的情況下~5e6字符),替換函數會返回字符串的一個子集(約4e6字符),而不會引發任何錯誤。

相關問題