palindromfa | |||||||
---|---|---|---|---|---|---|---|
angol fa | |||||||
| |||||||
Típusú | adatszerkezet | ||||||
Feltalálás éve | 2015 | ||||||
Szerző | Mihail Rubincsik [d] | ||||||
Bonyolultság az O-szimbólumokban | |||||||
|
|||||||
Médiafájlok a Wikimedia Commons oldalon |
A palindrom fa ( eng. palindrom fa , szintén overtree [1] , eng. eertree ) egy olyan adatstruktúra , amely egy karakterlánc palindrom részstringjeinek tárolására és feldolgozására szolgál . Az Uráli Szövetségi Egyetem tudósai, Mikhail Rubinchik és Arseny Shur javasolták 2015-ben. Két előtagfát jelöl, amelyek páros, illetve páratlan hosszúságú palindrom részstringek jobb "feleiből" vannak összeállítva. A struktúra memóriát foglal és időben felépíthető , ahol a karakterlánc hossza és a benne lévő különböző karakterek száma. A palindromfa segítségével hatékonyan megoldható olyan problémák, mint a különböző palindrom részkarakterláncok számának megszámlálása, egy karakterlánc felosztásának megtalálása a legkisebb számú palindromra, annak ellenőrzése, hogy egy részkarakterlánc palindrom-e, stb.
Legyen valamilyen karakterlánc és legyen a fordított karakterlánc . Egy karakterlánc palindróma fájának leírásakor a következő jelölést használjuk [2] :
A fenti jelölésben egy karakterlánc palindromfája egy irányított gráf , amelynek minden csúcsa megfelel a karakterlánc valamilyen egyedi alpalindromjának, és azzal azonosítható. Ha a karakterlánc alpalindromokat tartalmaz , és ahol valamilyen alfabetikus karakter van , akkor a palindromfának van egy szimbólummal jelölt íve a -nak megfelelő csúcstól a -nek megfelelő csúcsig . Egy ilyen gráfban bármely csúcsnak csak egy bejövő íve lehet. A kényelem kedvéért két segédcsúcsot is bevezetünk, amelyek megfelelnek a hosszúságú palindromoknak ( üres karakterlánc ), illetve ("képzetes" string). Az üres karakterláncból az ívek a forma palindromjainak megfelelő csúcsokhoz vezetnek, a „képzetes karakterlánctól” pedig a forma palindromjainak megfelelő (vagyis egyetlen karakterből álló) csúcsokhoz. A csúcsot akkor is nevezzük , ha páros hosszúságú palindromja van, egyébként pedig páratlan . A definícióból következik, hogy a palindromfában az ívek csak azonos paritású csúcsok között haladnak át. Az előtagfák szempontjából ez a struktúra a következőképpen írható le [3] :
A palindromfa csúcsai és ívei két előtagfát alkotnak, amelyek gyökerei az üres, illetve a "képzetes" karakterláncokat meghatározó csúcsokban helyezkednek el. Ebben az esetben az első előtag fa a páros hosszúságú alpalindromok jobb feléből, a második pedig a páratlanokból áll. |
A palindromfában a csúcsok száma nem haladja meg a -t, ami a következő lemma [4] egyenes következménye :
Egy hosszúságú karakterláncnak legfeljebb különálló, nem üres palindrom részkarakterláncai lehetnek. Ezenkívül, miután egy karaktert egy karakterlánc végéhez rendelünk, a karakterlánc különböző alpalindromjainak száma legfeljebb . |
Ez az állítás a következő tényekből következik:
Az utolsó tulajdonság lényegében ekvivalens a lemmával, mivel minden új részstringnek, amely a következő karakter hozzáadásakor jelenik meg, a karakterlánc utótagjának kell lennie [5] . ■
A szokásos íveken kívül, amelyek az előtagfa átmeneteiként szolgálnak, a palindromfa minden csúcsához egy utótag hivatkozás van definiálva, amely a csúcstól a legnagyobb (nem egyenlő a teljes karakterlánccal ) utótagnak megfelelő csúcshoz vezet. palindrom . Ugyanakkor az utótag hivatkozás a „képzeletbeli” csúcsból nincs definiálva, hanem definíció szerint egy üres csúcsból a „képzetes” csúcsba vezet. Az utótag hivatkozások egy "képzetes" csúcsban gyökerező fát alkotnak, és fontos szerepet játszanak a palindromfa felépítésében [3] .
Sok más húrszerkezethez hasonlóan a palindromfa is iteratív módon épül fel . Kezdetben csak az üres és képzeletbeli karakterláncoknak megfelelő csúcsokból áll. A struktúra ezután fokozatosan újjáépül, ahogy a karakterlánc egyenként növekszik. Mivel egy karakter hozzáadásakor legfeljebb egy új palindrom jelenik meg egy karakterláncban, a fa újraépítéséhez a legrosszabb esetben egy új csomópont és egy utótag hivatkozás hozzáadása szükséges. Egy lehetséges új csomópont meghatározásához a fa építése során egy utolsó mutató a jelenlegi palindrom utótagok közül a legnagyobbnak megfelelő csomópontra [3] megmarad .
A karakterlánc összes utótag-palindromja elérhető a last utótag hivatkozásaival , ezért egy új utótag-palindrom meghatározásához (az új csúcsnak felel meg, ha van ilyen) addig kell követni az utolsó utótag hivatkozásait, amíg meg nem találjuk, hogy az aktuális utótag-palindrom előtti karakter megegyezik a karakterlánchoz rendelt karakterrel. Formálisabban legyen a karakterlánc maximális palindrom utótagja , majd vagy , vagy , ahol valamilyen palindrom utótag . Így a last utótag hivatkozásai között iterálva megállapítható, hogy a karakterek és a karakterek összehasonlításával kibővíthető-e . Ha megtalálta a megfelelő palindrom utótagot , ellenőrizze, hogy a palindromfa tartalmaz-e átmenetet a megfelelő csúcstól a [3] szimbólummal .
Ha van ilyen átmenet, akkor már korábban találkoztunk a sorban, és megfelel annak a csúcsnak, ahová ez az átmenet vezet. Ellenkező esetben létre kell hoznia egy új csúcsot, és át kell lépnie a -ból . Ezután adjon meg egy utótag hivatkozást, amely megfelel a második leghosszabb palindrom utótagnak . Annak érdekében, hogy megtaláljuk, folytatni kell az utolsó utótag hivatkozások megkerülését, amíg a második csúcsot meg nem találjuk , így ; ez a csúcs lesz az utótag hivatkozás . Ha a felülről való átmenetet szimbólummal jelöljük , akkor az egész folyamat a következő pszeudokóddal leírható [3] :
link(v) függvény: while s k -len(v)-1 ≠ s k : v hozzárendelés = link(v) return v függvény add_betű(c): hozzárendel k = k + 1 define s k = c define q = find_link(last) if δ(q, c) nincs definiálva: define p = new_vertex() define len(p) = len(q ) + 2 link (p) = δ(link(q) keresése), c) δ(q, c) = p hozzárendelés utolsó = δ(q, c) meghatározásaItt feltételezzük, hogy a fát kezdetben csak két csúcs írja le hosszúsággal , és ennek megfelelően egy utótag hivatkozással az első csúcsból a másodikba. Az utolsó változó az aktuális egyenes legnagyobb utótag palindromának megfelelő csúcsot tárolja, kezdetben a nulladik egyenes csúcsára mutat. Azt is feltételezzük, hogy kezdetben egyenlő és valamilyen szolgáltatás karaktert írunk be, ami nem fordul elő a karakterláncban .
Az algoritmus összetettsége az ugrótáblát a fában tároló adatstruktúráktól függően változhat. Általános esetben asszociatív tömb használatakor a hozzáférésre fordított idő eléri a -t , ahol az ábécé mérete, amelyből a karakterlánc épül. Érdemes megjegyezni, hogy az első find_link hívás minden iterációja csökkenti a last hosszát , a másodiké pedig a link(last) hosszát, amely csak eggyel nőhet az add_letter egymást követő hívásai között . Így a find_link teljes ideje nem haladja meg a -t , és az add_letter hívások végrehajtásához szükséges teljes idő [3] -ra becsülhető . Ennek a struktúrának a memóriafogyasztása a legrosszabb esetben lineáris, azonban ha figyelembe vesszük a struktúra átlagos méretét egy adott hosszúságú összes sztringen , akkor az átlagos memóriafogyasztás [6] nagyságrendű lesz .
Az adatstruktúra bevezetésével egyidejűleg Rubinchik és Shur számos olyan módosítást is javasolt, amelyek lehetővé teszik a palindromfa által megoldott feladatok körének bővítését. Konkrétan egy olyan módszert javasoltak, amely lehetővé teszi egy általános palindróma fa létrehozását azonos aszimptotikus karakterláncok halmazához . Egy ilyen módosítás lehetővé teszi, hogy ugyanazokat a problémákat oldjuk meg, amelyeket egy karakterlánchalmaz kontextusában vizsgálunk – például, hogy megtaláljuk az összes karakterlánc legnagyobb közös alpalindromát vagy az összes karakterlánc különböző alpalindromjainak számát az aggregátumban. Egy másik javasolt módosítás a faszerkezet egy változata volt, amelyben egy karakter hozzáadása a legrosszabb esetben időt vesz igénybe (és nem amortizálódik , mint a szabványos konstrukcióban) és memóriát vesz igénybe. Ez a megközelítés lehetővé teszi a fa részleges perzisztenciájának biztosítását, amelyben lehetséges az utolsó karakter hozzáadását tetszőleges időpontokban visszagörgetni. Ezenkívül javasolták a fa egy teljesen perzisztens verzióját, amely lehetővé teszi, hogy a legrosszabb esetben időben és memóriában bármelyik korábban elmentett verzióhoz hozzáférjen és karaktert fűzjön hozzá [7] .
2019-ben Watanabe és munkatársai kifejlesztettek egy e 2 rtre 2 nevű palindrómfán alapuló adatstruktúrát , amely a futáshosszúságú kódolás által adott karakterláncok alpalindromjaival dolgozott [4] , 2020-ban pedig ugyanez a szerzőcsoport, valamint A Mieno két algoritmust fejlesztett ki, amelyek lehetővé teszik egy palindromfa fenntartását egy méretű tolóablakon . Ezen algoritmusok közül az első idő és memória, a második pedig időt és memóriát igényel [8] .
A palindromfa számos alkalmazási lehetőséget kínál elméletileg gyors és gyakorlatilag könnyen megvalósítható algoritmusok előállítására számos kombinatorikus probléma megoldására a programozásban és a matematikai kibernetikában [9] .
Az egyik feladat, amelyre ezt a struktúrát kifejlesztették, hogy megszámolja a különböző alpalindromokat egy karakterláncban online . A következőképpen állítható be: a kezdetben üres karakterlánchoz egyszerre egy-egy karakter hozzárendelődik. Minden lépésnél ki kell nyomtatni az adott karakterláncban lévő különböző alpalindromok számát. A palindromfa szempontjából ez egyenértékű azzal, hogy minden lépésben kinyomtatjuk a szerkezet nem triviális csúcsainak számát. A probléma offline verziójára 2010-ben egy lineáris megoldást mutattak be [10] , az online verzióhoz pedig 2013-ban találták meg az optimális megoldást a végrehajtási idővel [11] . A jelzett megoldás azonban két "nehézsúlyú" adatstruktúrát használt - a Manaker algoritmus analógját , valamint egy utótagfát . A palindromfa egyrészt a legrosszabb esetben is ugyanolyan aszimptotikával rendelkezik, másrészt sokkal könnyebb szerkezet [3] .
Ennek a szerkezetnek egy másik lehetséges alkalmazása a palindromban gazdag bináris karakterláncok felsorolása [12] . Korábban kimutatták, hogy egy hosszúságú szó legfeljebb különböző palindromokat tartalmazhat; azokat a szavakat, amelyeken ez a becslés elérhető, palindromban gazdagnak nevezik. A palindromikus szavakban gazdag szavak fogalmát Amy Glen és munkatársai vezették be 2008-ban [13] . Rubinchik és Shur megmutatta, hogy egy palindromfa segítségével minden olyan palindromban gazdag szó kimutatható, amelynek hossza nem haladja meg a -t , ahol az ilyen szavak száma. Ez az eredmény lehetővé tette az A216264 szekvencia ismert tagjainak számának növelését OEIS- ben 25-ről 60-ra. A kapott adatok azt mutatták, hogy a szekvencia sokkal lassabban nő, mint azt korábban gondolták, vagyis felülről a [14] -hez kötődik .
Húrok | |
---|---|
Karakterlánc hasonlósági mértékek | |
Substring keresés | |
palindromák | |
Sorozat-igazítás | |
Utótag szerkezetek | |
Egyéb |