Bu zorluk, aşağıdaki sorunu çözmek için kod yazmakla ilgilidir.
İki dizi A ve B verildiğinde, kodunuz A'nın bir alt dizinin başlangıç ve bitiş indekslerini aşağıdaki özelliklerle vermelidir.
- A'nın alt dizesi, B'nin bazı alt dizileriyle de eşleşmelidir.
- İlk özelliği karşılayan A artık alt dize olmamalıdır.
Örneğin:
A = xxxappleyyyyyyy
B = zapplezzz
Substring apple
indisli 4 8
(1 indeksleme) geçerli bir çıktı olacaktır.
İşlevsellik
Girişin, yerel dizindeki bir dosyada ya da dosyada standart olacağını, yani seçiminizin olduğunu varsayabilirsiniz. Dosya formatı sadece iki satır olacak ve yeni bir satır ile ayrılacaktır. Cevap sadece bir fonksiyon değil, tam bir program olmalıdır.
Sonunda kodunuzu http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/ adresindeki dizelerden alınan iki alt dizgede test etmek istiyorum .
Puan
Bu bir bükülme ile kod golf. Kodunuz , girişin toplam uzunluğu O(n)
nerede n
ise, zamanında çalıştırılmalıdır .
Diller ve kütüphaneler
Serbestçe kullanılabilen bir derleyici / tercüman / etc olan herhangi bir dili kullanabilirsiniz. Linux için. Yalnızca bu görevi çözmek için tasarlanmamış standart açık kaynak kitaplıkları kullanmalısınız. Anlaşmazlık durumunda, bu dili kendi dilinizle standart olarak gelen veya varsayılan bir depodan varsayılan bir ubuntu makinesine kurabileceğiniz herhangi bir kütüphane olarak sayacağım.
Kullanışlı bilgi
Bu problemi doğrusal zamanda çözmenin en az iki yolu vardır. Birincisi, sonek ağacını hesaplamak, ikincisi ise ilk sonek dizisini ve LCP dizisini hesaplamaktır.
- İşte lineer zaman son eki ağaç yapısının tam ve (belki de aşırı) ayrıntılı bir açıklaması (bazı rakamların ne yazık ki berbat olduğu ortaya çıktı). Ayrıca, https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english adresinde lineer zaman eki ağacı yapımı hakkında çok güzel bir SO cevabı vardır . Ayrıca kaynak koduna bir bağlantı içerir. Başka bir ayrıntılı açıklama burada bulunabilir , bu sefer C'de tam bir çözüm sunar.
- Http://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdf Bölüm 2, doğrusal bir zaman eki dizisi yapı algoritması verir ve Ek A, C ++ kaynak koduna sahiptir. Bu cevap size en uzun ortak alt dizgiyi nasıl hesaplayacağınızı gösterir https://cs.stackexchange.com/questions/9555/computing-the-longest-common-substring- of- two-strings-using-suffix- arrays . Bölüm 5 https://courses.csail.mit.edu/6.851/spring12/scribe/lec16.pdf da bir birleşik video konferans sahip https://courses.csail.mit.edu/6.851/spring12/lectures/L16 .html ayrıca 1:16: 00'da başlayan aynı algoritmayı açıklar.
O(n) time
Mümkün olduğuna emin misin?