palindromipuu | |||||||
---|---|---|---|---|---|---|---|
Englanti puu | |||||||
| |||||||
Tyyppi | tietorakenne | ||||||
Keksintövuosi | 2015 | ||||||
Tekijä | Mihail Rubinchik [d] | ||||||
Monimutkaisuus O - symboleissa | |||||||
|
|||||||
Mediatiedostot Wikimedia Commonsissa |
Palindromipuu ( eng. palindromipuu , myös overtree [1] , eng. eertree ) on tietorakenne, joka on suunniteltu tallentamaan ja käsittelemään merkkijonon palindromisia osajonoja . Uralin liittovaltion yliopiston tutkijat Mikhail Rubinchik ja Arseny Shur ehdottivat sitä vuonna 2015. Edustaa kahta etuliitepuuta , jotka on koottu parillisen ja parittoman pituisten palindromisten osamerkkijonojen oikeasta "puolikkaasta". Rakenne vie muistia ja voidaan rakentaa ajassa , jossa on merkkijonon pituus ja siinä olevien eri merkkien lukumäärä. Palindromipuun avulla voidaan tehokkaasti ratkaista sellaisia ongelmia, kuten eri palindromisten osajonojen lukumäärän laskeminen, merkkijonon jaon löytäminen pienimmäksi palindromimääräksi, tarkistaminen, onko osamerkkijono palindromi ja muut.
Olkoon jokin merkkijono ja käänteinen merkkijono . Kun kuvataan merkkijonon palindromipuuta , käytetään seuraavaa merkintää [2] :
Yllä olevassa merkinnässä merkkijonon palindromipuu on suunnattu graafi , jonka kukin kärki vastaa jotakin merkkijonon ainutlaatuista alipalindromia ja tunnistetaan siihen. Jos merkkijonossa on osapalindromeja ja jossa on jokin aakkosmerkki , niin palindromipuussa on kaari , joka on merkitty symbolilla , pistettä vastaavasta kärjestä vastaavaan kärkeen . Tällaisessa graafissa missä tahansa kärjessä voi olla vain yksi sisääntuleva kaari. Mukavuuden vuoksi on myös otettu käyttöön kaksi apupistettä, jotka vastaavat pituuspalindromeja ( tyhjä merkkijono ) ja ("kuvitteellinen" merkkijono), vastaavasti. Kaaret tyhjästä merkkijonosta johtavat muodon palindromeja vastaaviin kärkipisteisiin ja "kuvitteellisesta merkkijonosta" muodon (eli yhdestä merkistä koostuvia) palindromeja vastaaviin pisteisiin. Huippua kutsutaan , vaikka sillä olisi parillinen palindromi, ja muuten pariton . Määritelmästä seuraa, että kaaret palindromipuussa kulkevat vain saman pariteetin kärkien välillä. Etuliitepuiden näkökulmasta tätä rakennetta voidaan kuvata seuraavasti [3] :
Palindromipuun kärjet ja kaaret muodostavat kaksi etuliitepuuta, joiden juuret sijaitsevat pisteissä, jotka määrittävät tyhjät ja "imaginaariset" merkkijonot, vastaavasti. Tässä tapauksessa ensimmäinen etuliitepuu koostuu parillisen pituisten osapalindromien oikeasta puoliskosta ja toinen parittomista puoliskoista. |
Palindromipuun kärkien lukumäärä ei ylitä , mikä on suora seuraus seuraavasta lemmasta [4] :
Pituusmerkkijonossa voi olla korkeintaan erillisiä ei-tyhjiä palindromisia osamerkkijonoja . Lisäksi sen jälkeen, kun merkkijonon loppuun on määritetty tietty merkki , tämän merkkijonon eri alipalindromien määrä voi kasvaa enintään . |
Tämä lausunto seuraa seuraavista tosiseikoista:
Viimeinen ominaisuus vastaa olennaisesti lemmaa, koska kaikki uudet osamerkkijonot, jotka ilmestyvät, kun merkkijonoon lisätään seuraava merkki, on oltava sen jälkiliitteitä [5] . ■
Tavallisten kaarien lisäksi, jotka toimivat etuliitepuun siirtymänä, kullekin palindromipuun kärjelle määritellään suffiksilinkki , joka johtaa kärjestä suurinta varsinaista (ei koko merkkijonoa vastaavaa ) kärkeen palindromi . Samanaikaisesti "imaginaarisesta" kärjestä tulevaa suffiksilinkkiä ei ole määritelty, vaan se johtaa määritelmän mukaan tyhjästä kärjestä "imaginaariseen". Suffiksilinkit muodostavat puun, jonka juuret ovat "kuvitteellisessa" kärjessä, ja niillä on tärkeä rooli palindromipuun rakentamisessa [3] .
Kuten monet muutkin merkkijonorakenteet, palindromipuu rakennetaan iteratiivisesti . Aluksi se koostuu vain pisteistä, jotka vastaavat tyhjiä ja kuvitteellisia merkkijonoja. Rakennetta rakennetaan sitten vähitellen uudelleen, kun merkkijono kasvaa merkki kerrallaan. Koska merkkijonoon ilmestyy enintään yksi uusi palindromi, kun lisäät yhden merkin, puun uudelleenrakentaminen vaatii pahimmassa tapauksessa yhden uuden solmun ja liitelinkin lisäämisen siihen. Mahdollisen uuden solmun määrittämiseksi puun rakentamisen aikana ylläpidetään viimeistä osoitinta solmuun, joka vastaa suurinta nykyisistä palindromiliitteistä [3] .
Kaikki merkkijonon suffiksi-palindromit ovat saavutettavissa suffiksilinkeillä viimeisestä , joten uuden suffiksi-palindromin määrittämiseksi (se vastaa uutta kärkeä, jos sellainen on) on seurattava viimeisen suffiksilinkkejä, kunnes havaitaan, että nykyistä suffixi-palindromia edeltävä merkki vastaa merkkijonolle määritettyä merkkiä. Muodollisemmin anna olla merkkijonon suurin palindromiliite , sitten joko , tai , jossa on jokin palindromipääte . Siten iteroitaessa viimeisimmän suffiksilinkkejä , voidaan määrittää, voidaanko se laajentaa vertaamalla merkkejä ja . Kun vastaava palindromiliite on löydetty, kannattaa tarkistaa symbolilla [3] , sisältääkö palindromipuu siirtymän vastaavasta kärjestä .
Jos tällainen siirtymä on olemassa, se on jo tavattu rivillä aiemmin ja se vastaa kärkeä, johon tämä siirtymä johtaa. Muussa tapauksessa sinun on luotava sille uusi kärkipiste ja tehtävä siirtymä osoitteesta . Määritä seuraavaksi suffiksilinkki, joka vastaa toiseksi pisintä palindromipäätettä . Sen löytämiseksi tulee jatkaa viimeisten suffiksilinkkien ohittamista, kunnes löydetään toinen kärki , jolloin ; tämä kärki on suffiksilinkki . Jos merkitsemme siirtymistä ylhäältä symbolilla , koko prosessi voidaan kuvata seuraavalla pseudokoodilla [3] :
Find_link(v) -funktio: while s k -len(v)-1 ≠ s k : assign v = link(v) return v funktio add_letter(c): määritä k = k + 1 määrittele s k = c määrittele q = etsi_linkki(viimeinen) , jos δ(q, c) ei ole määritelty: define p = uusi_vertex() define len(p) = len(q) ) + 2 määrittele linkki(p) = δ(etsi_linkki(link(q)), c) määrittele δ(q, c) = p määritä viimeinen = δ(q, c)Tässä oletetaan, että alun perin puuta kuvaa vain kaksi kärkeä pituuksilla ja vastaavasti suffiksilinkillä ensimmäisestä kärjestä toiseen. Muuttuja viimeiseksi tallentaa nykyisen rivin suurinta suffiksipalindromia vastaavan kärjen, aluksi se osoittaa nollaviivan kärkeen. Oletetaan myös, että alun perin se on yhtä suuri kuin ja siihen kirjoitetaan jokin palvelumerkki, jota ei esiinny merkkijonossa .
Algoritmin monimutkaisuus voi vaihdella riippuen tietorakenteista, jotka tallentavat hyppytaulukon puuhun. Yleisessä tapauksessa assosiatiivista taulukkoa käytettäessä pääsyyn käytetty aika saavuttaa , missä on aakkosten koko, josta merkkijono on rakennettu. On syytä huomata, että jokainen iteraatio ensimmäisen kutsun find_link pituutta lyhentää lastin pituutta ja toisen pituutta link(last) , joka voi kasvaa vain yhdellä peräkkäisten add_letter -kutsujen välillä. Siten Find_linkin kokonaisaika ei ylitä , ja add_letter- kutsujen suorittamiseen tarvittava kokonaisaika voidaan arvioida [3] . Tämän rakenteen muistinkulutus on pahimmassa tapauksessa lineaarinen, mutta jos tarkastellaan rakenteen keskimääräistä kokoa kaikissa tietynpituisissa merkkijonoissa , keskimääräinen muistinkulutus on luokkaa [6] .
Samanaikaisesti tämän tietorakenteen käyttöönoton kanssa Rubinchik ja Shur ehdottivat myös useita muutoksia, jotka mahdollistavat palindromipuun ratkaisemien tehtävien laajentamisen. Erityisesti ehdotettiin menetelmää, jonka avulla voidaan rakentaa yleinen palindromipuu joukolle merkkijonoja, joilla on sama asymptotiikka . Tällaisen muunnelman avulla voimme ratkaista samat ongelmat, joita tarkastellaan merkkijonojoukon yhteydessä - esimerkiksi löytää kaikkien merkkijonojen suurin yhteinen alipalindromi tai kaikkien merkkijonojen eri alipalindromien lukumäärä aggregaatissa. Toinen ehdotettu muunnos oli puurakenteen muunnos, jossa yhden merkin lisääminen vie pahimmassa tapauksessa aikaa (eikä sitä poisteta , kuten tavallisessa rakenteessa tapahtuu) ja muistia. Tämä lähestymistapa mahdollistaa puun osittaisen pysyvyyden , jossa on mahdollista peruuttaa viimeisen merkin lisäys mielivaltaisina aikoina. Lisäksi puusta ehdotettiin täysin pysyvää versiota, jonka avulla voit käyttää ja liittää merkin mihin tahansa aiemmin tallennetuista versioista ajallisesti ja pahimmassa tapauksessa muistissa [7] .
Vuonna 2019 Watanabe ja kollegat kehittivät palindromipuuhun perustuvan tietorakenteen, nimeltään e 2 rtre 2 , työskennelläkseen run-length- koodauksen [4] antamien merkkijonojen alipalindromien kanssa , ja vuonna 2020 sama kirjoittajaryhmä yhdessä Mieno kehitti kaksi algoritmia , jotka mahdollistavat palindromipuun ylläpitämisen kooltaan liukuvalla ikkunalla . Ensimmäinen näistä algoritmeista vaatii aikaa ja muistia ja toinen aikaa ja muistia [8] .
Palindromipuu tarjoaa monia mahdollisia sovelluksia teoreettisesti nopeiden ja käytännössä helposti toteutettavien algoritmien saamiseksi useiden ohjelmoinnin ja matemaattisen kybernetiikan kombinatoristen ongelmien ratkaisemiseen [9] .
Yksi tehtävistä, jota varten tämä rakenne on kehitetty, on laskea eri alipalindromeja merkkijonoon verkossa . Se voidaan asettaa seuraavasti: yksi merkki kerrallaan määritetään yksi merkki kerrallaan alun perin tyhjään merkkijonoon. Jokaisessa vaiheessa sinun on tulostettava tietyn merkkijonon eri alipalindromien määrä. Palindromipuun näkökulmasta tämä vastaa rakenteen ei-triviaalisten kärkien lukumäärän tulostamista jokaisessa vaiheessa. Lineaarinen ratkaisu tämän ongelman offline-versioon esiteltiin vuonna 2010 [10] ja optimaalinen ratkaisu suoritusajalla online-versiolle löydettiin vuonna 2013 [11] . Esitetyssä ratkaisussa käytettiin kuitenkin kahta "raskasta" tietorakennetta - Manaker-algoritmin analogia sekä suffiksipuuta . Palindromipuulla on toisaalta sama asymptotiikka pahimmassa tapauksessa, ja toisaalta se on paljon kevyempi rakenne [3] .
Toinen tämän rakenteen mahdollinen sovellus on palindromirikkaiden binäärijonojen luettelointi [12] . Aikaisemmin on osoitettu, että pitkä sana voi sisältää vain erilaisia palindromeja; sanoja, joilla tämä arvio saavutetaan, kutsutaan palindromirikkaiksi. Amy Glen ja kollegat esittelivät palindromirikkaiden sanojen käsitteen vuonna 2008 [13] . Rubinchik ja Shur osoittivat, että käyttämällä palindromipuuta voidaan havaita kaikki palindromirikkaat sanat, joiden pituus ei ylitä , missä on tällaisten sanojen lukumäärä. Tämä tulos mahdollisti A216264- sekvenssin tunnettujen jäsenten määrän kasvattamisen OEIS :ssä 25:stä 60:een. Saadut tiedot osoittivat, että sekvenssi kasvaa paljon hitaammin kuin aiemmin on ajateltu, eli se on ylhäältä rajoittunut muodossa [14] .
jouset | |
---|---|
Merkkijonojen samankaltaisuusmitat | |
Alimerkkijonohaku | |
palindromit | |
Jakson tasaus | |
Suffiksirakenteet | |
Muut |