Nasıl Python çok uzun dizeleri ile çalışmak?

oy
5

Ben proje Euler mücadele ediyorum sorunu 220 (bazı diğerlerinin karşılaştırıldığında, kolay görünüyordu - Ben bir değişiklik için daha yüksek numaralı deneyin düşündüm!)

Şimdiye kadar var:

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

Şimdi, bu düşük değerler için çalışıyor, ancak daha yüksek tekrarlamak koyduğunuzda sadece bir Bellek hatası olsun o zaman. Herkes bu aşmak için bir yol önerebilir? Gerçekten bir sonraki adım için talimatlar içeren bir dize / dosya istiyorum.

Oluştur 09/12/2008 saat 16:35
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
2

Kaç "a" ve "b", karakterler düşünürsek orada (0), D (1), vs, sen dize çok hızlı çok uzun aldığını göreceksiniz D'de bulunmaktadır. D (50) 'de kaç tane karakter hesaplayın ve sonra belki bu kadar veri depolamak nerede olacağını tekrar düşünün. Char başına bir bayt 4500 TB olan bu 4.5 * 10 ^ 15 karakter olun.

Düşününce gel, hesaplamak gerekmez - Sorun, en az 10 ^ 12 adım aşağı almak için hile kullanıyorsanız veri terabayt Bunun bir karakter başına bayt veya çeyrek olan var söyler karakter başına 2 bit. Ben :-) erişebilir bu depolama ortamı her türlü üzerinde bir dakikalık zaman sınırı sorunlara neden olacağını düşünüyorum

Cevap 09/12/2008 saat 16:51
kaynak kullanıcı

oy
1

dizeyi gerçekleşmek mümkün olmadığından, bunu üretmesi gerekmektedir. bunun yerine tüm dizeyi dönen bireysel karakterleri verim, bunu işe alabilirsiniz.

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

Bunun gibi bir şey, yeni bir dize oluşturmadan değiştirme yapacağız.

Şimdi, tabii ki, özyinelemeli demen gerekiyor ve uygun derinlikte. Yani, her verim biraz daha karmaşık bir şeydir, sadece verim değil.

sizin için bu çözmek için değil çalışılıyor, bu yüzden onları orada bırakacağım.

Cevap 09/12/2008 saat 16:56
kaynak kullanıcı

oy
3

Hüner her yineleme aracılığıyla dize çalıştırmak olarak kalıpların ortaya çıktığını Farkettiğin içindedir. Değerlendirirken deneyin iterate(D,n)1 ile 10 arasında n için ve onları yerinde görmek. Ayrıca son konumu ve adım sayısını hesaplayan bir işlevi yoluyla dize beslemek ve oradan da sonuçlar irdelenecektir.

Daha sonra hiç bu dizeleri kullanmaz şeye algoritma basitleştirmek için bu bilgiyi kullanabilirsiniz.

Cevap 09/12/2008 saat 16:57
kaynak kullanıcı

oy
0

Bir bayt akışı dosyası olarak D tedavi olabilir.

Gibi bir şey:-

seedfile = açık ( 'd1.txt', 'w'); seedfile.write ( "Fa"); seedfile.close (); n = 0 ise (n

Tamamen denenmemiş uyarı

Cevap 09/12/2008 saat 17:40
kaynak kullanıcı

oy
2

Python dizeleri bu bir cevabı olacak değildir. Yaylı değişmez dizileri olarak depolanır, bu nedenle bu değişikliklerin her bir bellekte tamamen yeni bir dize oluşturur. Eğer karakter olarak saklayabilirsiniz (ve bu bazı küçük kompresyon uygulanır bulunuyor) eğer değil söz, 10 ^ 12 adımlardan sonra talimat seti boyutu en az 1TB olacaktır.

Eğer dizisini depolamak için gerek kalmaz böylece İdeal, matematiksel olarak (ipucu, yoktur) anında cevap üretmek için bir yol olmalıdır.

Sadece yolunu oluşturan bir yöntemi belirlemek için bir kılavuz olarak dize kullanabilirsiniz.

Cevap 09/12/2008 saat 18:42
kaynak kullanıcı

oy
1

replace () fonksiyonunu kullanırken uyarı bir kelime dikkatli olmak gibi. Dizeleriniz (benim durumumda ~ 5E6 karakter olarak) çok büyükse yerine işlev herhangi bir hata atma olmadan (4E6 karakter ~ civarında) dize bir alt kümesini dönecekti.

Cevap 08/11/2011 saat 21:02
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more