Sling (tietorakenne)

Sling (köysi, johto) on tietorakenne, jonka avulla voit tehokkaasti tallentaa ja käsitellä pitkiä merkkijonoja, kuten tekstiä. Tarjoaa pitkän merkkijonon tallennuksen puuna, joka koostuu pienistä osamerkkijonoista. Se on kätevä tekstitiedostojen tallentamiseen ja käsittelyyn ja tarjoaa tehokkaan suorituksen tekstieditorille tyypillisistä toiminnoista: lisäys, poistaminen, peruuttaminen (satunnaiskäyttö) [1] .

Kuvaus

Sling on binääripuu, jossa jokainen lehti (solmu ilman lapsia) sisältää merkkijonon (tekstin osamerkkijono) ja pituuden (paino) ja jokainen ei-lehtipuusolmu sisältää vasemman alipuunsa lehtien pituuden. . Solmu, jossa on kaksi lasta, jakaa koko merkkijonon kahteen osaan, joista ensimmäinen osa on tallennettu vasemmalle alipuulle, toinen - oikealle, itse solmun paino on yhtä suuri kuin ensimmäisen osan pituus. Perustoimintojen osalta oletetaan, että merkkijonoja ei muokata tuhoamattomalla tavalla, mikä mahdollistaa kopioinnin kirjoittamisen yhteydessä. Lehtisolmut toteutetaan yleensä vakiopituisina merkkijonoina viitemäärällä, kun se nollataan, muisti vapautuu. Myös kehittyneitä jätteenkeräystekniikoita voidaan käyttää.

Toiminnot

Seuraavissa määritelmissä N on hihnan pituus.

Lisää

Määritelmä: Insert(i, S’) : lisää kohdasta i alkavan merkkijonon S' merkkijonoon s , jolloin saadaan uusi merkkijono C 1 , …, C i , S' , C i + 1 , …, C m . Monimutkaisuus: O(log N) .

Tämä toiminto voidaan suorittaa käyttämällä Split()ja kahta toimintoa Concat().

Valitus

Määritelmä: Index(i) : palauttaa merkin kohdassa i Monimutkaisuus: O(log N)

Katsoaksemme i :ntä merkkiä aloitamme rekursiivisen haun juuresta alkaen:

funktioindeksi ( RopeNode node , kokonaisluku i ) jos solmu . _ paino <= i ja olemassa ( solmu . oikea ) sitten palauttaa indeksi ( solmu . oikea , i - solmu . paino ) loppu jos olemassa ( solmu . vasen ) niin palauta indeksi ( solmu . vasen , i ) end paluusolmu . _ merkkijonon [ i ] loppu

Katso esimerkiksi kuvaa 2.1 löytääksesi merkin sijainnista i=10, aloitamme juuresta (A), meillä on, että sen paino 22 on suurempi kuin 10, joten menemme alas vasemmalle (B). Tässä on, että 9 on pienempi kuin 10, vähennä 9 10:stä (saa i=1) ja siirry oikeaan lapsisolmuun (D). Meillä on 6 suurempi kuin 1 ja siirrytään vasemmalle lapselle (G). Tässä 2 on suurempi kuin 1, menemme alas vasemmalle (J). Ja lopuksi, 2 on suurempi kuin 1, mutta koska tämä on lehtisolmu, sillä ei ole lapsia ja viittaamme yksinkertaisesti merkkijonon "na" (eli "a") solmuun tallennettuun indeksiin 1, joka olla vastaus.

Hitch

Määritelmä: Concat(S1, S2) Yhdistää kaksi linjaa, S 1 ja S 2 , yhdeksi kokonaisuudeksi. Monimutkaisuus: O(1) (tai O(log N) juuren painoa laskettaessa)

Ketjutus tehdään luomalla uusi juuri, jossa lapset vasen = S1 ja oikea = S2 , vakioajassa. Pääsolmun painoksi asetetaan vasemman lapsen S 1 pituus , joka voi kestää O(log N) , jos puu on tasapainossa.

Useimmat nostotoimenpiteet edellyttävät puun tasapainottamista, kiinnityksen jälkeen puu saattaa olla tarpeen tasapainottaa.

Erittely

Määritelmä: Split (i, S) : jakaa merkkijonon S kahdeksi uudeksi S 1 ja S 2 , missä S 1 = C 1 , …, C i ja S 2 = C i + 1 , …, C m . Monimutkaisuus: O(log N)

Kaksi tapausta on mahdollista:

  1. Katkokohta on rivin lopussa (eli lehtisolmun viimeisen merkin jälkeen)
  2. Katkokohta on rivin keskellä.

Toinen tapaus pelkistetään ensimmäiseksi katkaisemalla merkkijono katkaisupisteessä ja luomalla kaksi uutta lehtisolmua ja luomalla niille sitten uusi pääsolmu.

Esimerkiksi kuvan 2.3 22-merkkisen hihnan jakamiseksi kahdeksi osaksi, joiden pituus on 11, pyydämme 12. merkkiä määrittämään K -solmun alimmalla tasolla. Poista linkki K :n ja G :n välillä . Siirry pääryhmään G ja vähennä K :n paino D :n painosta . Kiipeä puuhun ja poista kaikki oikeat alipuulinkit, jotka sisältävät merkkejä 11. merkin jälkeen vähentämällä paino K niiden pääsolmuista (tässä tapauksessa vain D ja A ). Lopuksi rivistetään äskettäin orvoiksi jääneet solmut K ja H luomalla niille uusi emosolmu P , jonka paino on yhtä suuri kuin vasemman alisolmun K pituus .

Useimmat nostotoimenpiteet edellyttävät puun tasapainottamista, merkinnän jälkeen puu saattaa olla tarpeen tasapainottaa.

Poisto

Määritelmä: Delete(i, j) : poista osamerkkijono C i , …, C i + j − 1 s :stä ja luo uusi merkkijono C 1 , …, C i − 1 , C i + j , …, C m . Monimutkaisuus: O(log N) .

Voidaan tehdä kahdella Split()ja yhdellä Concat(). Aluksi jaamme merkkijonon kolmella erotettuna i -: nnellä ja i + j -merkillä, vastaavasti, poistettava rivi allokoidaan erilliselle (keskimmäiselle) solmulle. Sitten yhdistämme kaksi muuta solmua.

Pyydä

Määritelmä: Report(i, j) : palauttaa merkkijonon C i , …, C i + j − 1 . Monimutkaisuus: O(j + log N)

Jos haluat kysyä merkkijonoa C i , …, C i + j − 1 , etsi solmu u , joka sisältää C i c :n , ja vieraile sitten T :ssä solmusta u alkaen . Johdetaan C i , …, C i + j − 1 vierailevat T :stä järjestyksessä alkaen solmusta u . weight(u) >= j

Vertailu tiheisiin taulukoihin

Esitys
Operaatio Rintareppu joukko
Valitus [1] O(log n) O(1)
Erittely [1] O(log n) O(1)
Kiinnitä (tuhoa) O(log n) epätasapainoinen / O(n) pahin tapaus Päällä)
Kytkentä (tuhoamaton) Päällä) Päällä)
Hahmopassi [1] Päällä) Päällä)
Lisää [2] O(log n) epätasapainoinen / O(n) pahin tapaus Päällä)
Liite [2] O(log n) epätasapainoinen / O(n) pahin tapaus O(1) pehmustettu, O(n) epätasapainoinen
Poistaminen O(log n) Päällä)
Pyyntö O(j + log n) O(j)
Luominen Päällä) Päällä)

Edut:

  • Slingit mahdollistavat nopeamman tekstin lisäämisen ja poistamisen (verrattuna tiheisiin merkkijonoihin, joiden aika monimutkaisuus on O(n).
  • Slingit eivät vaadi O(n) lisämuistia toimintojen suorittamiseen (matriisit tarvitsevat sitä kopioitaessa).
  • Hihnat eivät vaadi suuria tiheitä muistitiloja.
  • Kun käytetään vain ei-tuhoisia versioita operaatioista, sling on pysyvä tietorakenne . Tämä helpottaa useiden muokkaustasojen (kuten kumoamistoimintojen) järjestämistä tekstieditorissa.

Virheet:

  • Enemmän kokonaistilaa, jota tarvitaan vain operaatioita suoritettaessa (yläsolmujen tallentamiseen). Meidän on löydettävä kompromissi sen välillä, kuinka paljon ylimääräistä muistia tallennamme ja kuinka pitkiä solmujen alijonot voivat olla. Yllä olevien esimerkkien rivit olivat selvästi liian lyhyitä. Ylimääräinen monimutkaisuus on aina O(n), mutta vakiota voidaan pienentää.
  • Pidentynyt työskentelyaika lisämuistilla
  • Lisääntynyt koodin monimutkaisuus; todennäköisemmin virheitä

Tässä taulukossa verrataan merkkijono- ja slingtoteutusten algoritmisia ominaisuuksia, ei niiden raakanopeutta . Taulukon merkkijonot ovat vähemmän ylimääräisiä, joten esimerkiksi ketjuttaminen ja jakaminen on paljon nopeampaa pienille merkkijonoille. Kuitenkin käytettäessä taulukoita pitkille merkkijonoille, aika monimutkaisuus ja muistikustannukset ovat jo liian suuria (koska kopioiden määrä kasvaa huomattavasti). Sen sijaan suorituskyky on riippumaton tiedon pituudesta. Lisäksi muistin monimutkaisuuden molemmissa esityksissä arvioidaan O(n). Yhteenvetona voidaan todeta, että silmukat ovat suositeltavia, kun linjat ovat hyvin pitkiä ja ne vaihtuvat usein.

Myös

  • Cedar ohjelmistoympäristö, joka on käyttänyt silmukoita "melkein niiden perustamisesta lähtien" [1]
  • Malli T enfilade , samanlainen tietorakenne 70-luvun alusta.
  • Puskuriikkuna , tekstieditoreissa käytetty tietorakenne, joka mahdollistaa lähekkäin olevien tietojen tehokkaan lisäämisen ja poistamisen.
  • Piecewise table , toinen tekstieditoreissa käytetty tietorakenne.

Muistiinpanot

  1. 1 2 3 4 5 Boehm, Hans-J; Atkinson, Russ; Plass, Michael (joulukuu 1995). Köydet: vaihtoehto jousille . Ohjelmisto – Käytäntö ja kokemus . New York, NY, USA: John Wiley & Sons, Inc. 25 (12): 1315-1330. DOI : 10.1002/spe.4380251203 . Arkistoitu alkuperäisestä ( PDF ) 2020-03-08. Käytöstä poistettu parametri |url-status=( ohje )
  2. ↑ 1 2 Köyden toteutuksen yleiskatsaus . www.sgi.com . Haettu 1. maaliskuuta 2017. Arkistoitu alkuperäisestä 19. joulukuuta 2017.

Linkit