Aşağıdaki işlemleri gerçekleştirebilecek bir karakter kümesi karakter kümesi üzerine bir dizi dizi depolayan bir veri yapısı arıyorum . Biz göstermektedirler dizi kümesini depolanması veri yapısı olarak .D ( S ) S
Add-Prefix-Set
on : Büyüklüğü bir sabit tarafından sınırlandırılmış ve dize uzunlukları bir sabit ile sınırlandırılmış bazı (muhtemelen boş) dizgilerin değeri verilirse , . Her ikisi de bu sınırlayıcı sabitler globaldir: bunlar tüm girişleri için aynıdır .T D ( { t s | t ∈ T , s ∈ S } ) TGet-Prefixes
ilgili : dönüş . İçeriğini zamanında numaralayabildiğim sürece, bu set için hangi yapının kullanıldığını gerçekten bilmiyorum .{ a | Bir s ∈ S , bir ∈ Σ } O ( | Σ | )Remove-Prefixes
ilgili : geri .D ( { s | a s ∈ S , bir ∈ Σ } )Merge
: verilen ve , .D ( T ) D ( S ∪ T )
Şimdi, tüm bu işlemleri zamanında yapmak isterdim , ancak tüm bu işlemleri zamanında yapan bir yapıya göre iyiyim , burada , en uzun dizenin uzunluğu yapısı. Birleştirme durumunda, bir istiyorum çalışma süresi, olup , ilk ve , ikinci bir yapı için.O ( n ) n, O ( n, 1 + n 2 ) n- 1 , n , n 2 , n
Ek bir gereklilik, yapının değişmez olması veya en azından yukarıdaki işlemlerin, eskilerin işaretçilerinin eskisi gibi işlev göreceği şekilde 'yeni' yapılar döndürmesidir.
İtfa payı ile ilgili bir not: bu iyi, ancak sebat etmek için dikkatli olmalısınız. Eski yapıları her zaman tekrar kullandığımda, aynı yapı üzerinde belirli bir işlem kümesiyle en kötü durumdan birini vurursam başım derde girer (yani yeni oluşturduğu yapıları yok sayarak).
Böyle bir yapıyı üzerinde çalıştığım bir çözümleme algoritmasında kullanmak istiyorum; Yukarıdaki yapı algoritma için ihtiyaç duyduğum bakışı tutacaktır.
Zaten bir trie kullanmayı düşünmüştüm , ancak asıl sorun denemeleri verimli bir şekilde nasıl birleştireceğimi bilmemem. Dizeleri Add-Prefix-Set
yalnızca tek karakterli dizelerden oluşuyorsa, bu kümeleri bir yığında saklayabilirsiniz, bu da ilk üç işlem için size çalışma zamanı verir. Ancak, bu yaklaşım birleştirmek için de işe yaramıyor.
Son olarak, faktörler ile ilgilenmediğime dikkat edin: bu umurumda olan herkes için aynı.
Add-Prefix-Set
)
Add-Prefix-Set
veya rastgele bir dizi dizeyle mi başlıyorsunuz?