Düzenlemek (veya Levenshtein) mesafe iki dizeleri arasındaki diğer içine bir dize dönüştürmek için gereken tek karakter yerleştirmeler, silmeler ve değiştirmeler minimal sayıdır. İki dizginin her birinin uzunluğu n ise, bunun dinamik programlama ile O (n ^ 2) zamanında yapılabileceği iyi bilinmektedir. Aşağıdaki Python kodu bu hesaplamayı iki dize s1
ve için yapar s2
.
def edit_distance(s1, s2):
l1 = len(s1)
l2 = len(s2)
matrix = [range(l1 + 1)] * (l2 + 1)
for zz in range(l2 + 1):
matrix[zz] = range(zz,zz + l1 + 1)
for zz in range(0,l2):
for sz in range(0,l1):
if s1[sz] == s2[zz]:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz])
else:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz] + 1)
return matrix[l2][l1]
Bu görevde, düzenleme mesafesini hesaplamak için olabildiğince yakın olmanız gerekir, ancak ciddi bir bellek kısıtlamasıyla. Kodunuzun 1000 32 bit tamsayı içeren bir dizi tanımlamasına izin verilir ve bu, hesaplamanızda kullandığınız tek geçici depolama alanıdır. Tüm değişkenler ve veri yapıları bu dizide bulunmalıdır. Özellikle, en az 1.000.000 sayı depolamanızı gerektireceği için yukarıdaki algoritmayı 1000 uzunluktaki dizeler için uygulayamazsınız. Dilinizin doğal olarak 32 bit tamsayıları (örneğin Python) olmadığı durumlarda, dizide asla 2 ^ 32-1'den büyük bir sayı kaydetmediğinizden emin olmanız yeterlidir.
Verileri, o bölümdeki bellek kısıtlamaları hakkında endişelenmeden, istediğiniz herhangi bir standart kütüphaneyi kullanarak okuyabilirsiniz. Rekabeti kodunuzun ana bölümü için adil hale getirmek için, yalnızca C programlama dilinde olanlara işlevsel olarak eşdeğer olan ve herhangi bir harici kitaplık kullanamayan işlemleri kullanabilirsiniz.
Daha açık olmak gerekirse, giriş verilerini depolamak veya dilinizin tercümanı, JVM vb. Tarafından kullanılan bellek sınırınıza dahil değildir ve diske bir şey yazamazsınız. Hafızadayken giriş verilerinin salt okunur olduğunu varsaymalısınız, böylece daha fazla çalışma alanı kazanmak için yeniden kullanamazsınız.
Ne uygulamam gerekiyor?
Kodunuz aşağıdaki biçimde bir dosyada okunmalıdır. Üç çizgisi olacak. İlk satır gerçek düzenleme mesafesidir. İkincisi dize 1 ve üçüncüsü dize 2'dir . Dizelerin 10.000 uzunluğuna sahip olduğu https://bpaste.net/show/6905001d52e8 adresindeki örnek verilerle test edeceğim, ancak bu veriler için uzman olmamalı. İki dize arasında bulabileceği en küçük düzenleme mesafesini vermelidir.
Ayrıca, düzenleme mesafenizin gerçekten geçerli bir düzenleme kümesinden geldiğini kanıtlamanız gerekir. Kodunuzda, daha fazla bellek (istediğiniz kadar) kullanabilen bir moda dönüştüren ve düzenleme mesafenizi veren düzenleme işlemlerini sağlayan bir anahtar olmalıdır.
Puan
Skorunuz olacak (optimal edit distance/divided by the edit distance you find) * 100
. İşe başlamak için, iki dize arasındaki uyumsuzluk sayısını sayarak bir puan alabileceğinizi unutmayın.
Linux'ta özgürce bulunan ve kurulumu kolay dilediğiniz dilleri kullanabilirsiniz.
Mola, tenis terimi
Bir bağlantı kopması durumunda, kodunuzu Linux makinemde çalıştıracağım ve en hızlı kod kazanacak.
{ uint32_t foo[1000]; for (foo[0] = 0; foo[0] < 5; ++foo[0]) printf("%d ", foo[0]); }
Bu 32 bitlik tamsayılar diziniz çağrılır üstleniyor foo
.
for(int i=0;i<=5;i++)
Verileri depoladığı için izin verilir mii
?