Mortonin käyrä

Laskennassa ja tietojenkäsittelytieteessä Mortonin käyrä , Z-sekvenssi , Z-järjestys , Lebesgue-käyrä , Mortonin järjestys tai Morton- koodi  on funktio , joka kartoittaa moniulotteisen tiedon yksiulotteiseksi dataksi säilyttäen samalla tietopisteiden sijainnin. Guy MacDonald Morton esitteli toiminnon vuonna 1966 [1] . Moniulotteisen avaruuden pisteen Z-arvo on helppo laskea vuorotellen sen koordinaattiarvojen binäärilukuja . Kun tiedot tallennetaan tässä järjestyksessä, voidaan käyttää mitä tahansa yksiulotteisia rakenteita, kuten binäärihakupuita , B-puita , ohituslistoja tai hash-taulukoita (jossa pienet bitit hylätään). Näin luotua järjestystä voidaan vastaavasti kuvata järjestykseksi, joka voidaan saada nelipuun syvyys -ensimmäisellä läpikulkulla .

Koordinaatit

Alla oleva kuva näyttää Z-arvot 2D-tapaukselle kokonaislukukoordinaateilla 0 ⩽  x  ⩽ 7, 0 ⩽  y  ⩽ 7 (sekä desimaali- että binääriarvot on esitetty). Koordinaattien binäärilukujen vuorottelu tuottaa binääriset z -arvot, kuten kuvassa näkyy. Yhdistämällä z - arvot niiden tavanomaiseen numeeriseen järjestykseen saadaan rekursiivinen Z-käyrä. Kaksiulotteisia Z-arvoja kutsutaan myös kvadranttiavaimiksi.

Z-arvot x - akselilla kuvataan binäärilukuina Moser-de Bruijn-sekvenssistä , joissa on nollasta poikkeavia bittejä vain niiden parillisissa paikoissa:

x[] = {0b000000, 0b000001, 0b000100, 0b000101, 0b010000, 0b010001, 0b010100, 0b010101}

Kahden arvon summa ja ero suhteessa x -koordinaattiin lasketaan bittikohtaisilla operaatioilla :

x[i+j] = ((x[i] | 0b10101010) + x[j]) & 0b01010101 x[ij] = ((x[i] & 0b01010101) - x[j]) & 0b01010101, jos i >= j

Tehokas quadtree-rakennus

Z-järjestystä voidaan käyttää rakentamaan tehokkaasti nelipuu pistejoukolle [2] . Perusideana on lajitella syötepisteiden joukko Z-järjestyksen mukaan. Kun pisteet on lajiteltu, ne voidaan tallentaa binäärihakupuuksi ja käyttää suoraan, jota kutsutaan lineaariseksi nelipuuksi [3] , tai niitä voidaan käyttää osoitinpohjaisen nelipuun muodostamiseen.

Syöttöpisteet skaalataan tyypillisesti kutakin ulottuvuutta pitkin positiivisten kokonaislukujen tuottamiseksi joko kiinteän pisteen numeroina välillä [0, 1] tai konesanaa vastaavassa välissä. Molemmat esitykset ovat vastaavia ja mahdollistavat merkittävimmän nollasta poikkeavan bitin löytämisen vakioajassa. Minkä tahansa neliön neliön sivun pituus on potenssi kaksi, ja kulmakoordinaatit ovat sivun pituuden kerrannaisia. Jos annetaan kaksi pistettä, näiden kahden pisteen johdettu neliö on pienin neliö, joka peittää molemmat pisteet. Vuorottelevia bittejä kunkin pisteen x- ja y-koordinaateista kutsutaan x- ja y- sekoitukseksi , ja ne voidaan laajentaa suurempiin ulottuvuuksiin [2] .

Pisteet voidaan lajitella niiden sekoituksen mukaan ilman nimenomaista bittikiertoa. Tätä varten jokaisessa mittauksessa tarkistetaan kyseisen mittauksen kahden pisteen koordinaattien korkean kertaluvun XOR - bitti . Dimensiota, jonka merkitsevin bitti on suurempi, käytetään sitten kahden pisteen vertaamiseen niiden sekoitusjärjestyksen määrittämiseksi.

XOR-operaatio poistaa samat korkeat bitit, jotka ovat samat molemmille koordinaateille. Koordinaatin löytäminen merkitsevimmän bitin kanssa määrittää ensimmäisen bitin, joka poikkeaa sekoitusjärjestyksessä, ja tätä koordinaattia voidaan käyttää kahden pisteen vertailuun [4] . Tämä näkyy seuraavassa Python-koodissa:

def cmp_zorder ( a , b ): j = 0 k = 0 x = 0 k :lle alueella ( dim ) : y = a [ k ] ^ b [ k ] jos vähemmän_msb ( x , y ): j = k x = y palauttaa a [ j ] - b [ j ]

Yksi tapa määrittää, onko merkittävin bitti pienempi, on verrata kunkin pisteen pyöristettyä binaarilogaritmia. Osoittautuu, että seuraava operaatio on ekvivalentti ja vaatii vain XOR-operaation [4] :

def less_msb ( x , y ): palauttaa x < y ja x < ( x ^ y )

Liukulukuja on mahdollista verrata samalla tekniikalla. less_msb -funktiota muutetaan vertaamaan eksponenteja ensin. Vain jos ne täsmäävät, vakiofunktio less_msb suoritetaan mantissoilla [5] .

Kun pisteet on lajiteltu, kaksi ominaisuutta helpottaa nelipuun rakentamista. Ensimmäinen ominaisuus on, että nelipuun neliön sisältämät pisteet muodostavat lajittelussa yhtenäisen välin. Toinen ominaisuus on, että jos useampi kuin yksi nelikulmainen lapsi sisältää syötepisteen, neliö on lajittelun kahden vierekkäisen pisteen johdettu neliö .

Jokaiselle vierekkäiselle pisteparille lasketaan johdettu neliö ja sen sivun pituus. Jokaisen johdetun neliön kohdalla sen sisältävä väli rajataan lajittelun oikealla ja vasemmalla ensimmäisellä suurimmalla neliöllä [2] . Jokainen tällainen intervalli vastaa neliötä neliössä. Tuloksena on pakattu nelipuu, jossa on vain sisääntulopisteitä sisältävät solmut tai kaksi tai useampia jälkeläisiä. Pakkaamaton quadtree voidaan rakentaa palauttamalla puuttuvat solmut tarvittaessa.

Pistepohjaisen nelipuun rakentamisen sijaan pisteitä voidaan käsitellä lajiteltuun järjestykseen käyttämällä tietorakenteita, kuten binaarihakupuuta. Tämä mahdollistaa pisteiden lisäämisen ja poistamisen O(log n) -ajassa. Kaksi nelipuuta voidaan yhdistää yhdistämällä kaksi lajiteltua pistejoukkoa ja poistamalla kaksoiskappaleet. Pisteen sijainti voidaan määrittää tarkastelemalla kyselyn pistettä edeltäviä ja seuraavia pisteitä lajittelujärjestyksessä. Jos nelipuu on pakattu, edellinen löydetty solmu voi olla mielivaltainen lehti kiinnostavan pakatun solmun sisällä. Tässä tapauksessa on tarpeen löytää kyselystä ja löydetystä taulukosta edellinen yhteinen pistesolmu [6] .

Yksiulotteisten tietorakenteiden käyttö aluehakuun

Tehokas aluehaku vaatii algoritmin seuraavan Z-arvon laskemiseksi, jonka on oltava moniulotteisen hakualueen sisällä:

Tässä esimerkissä hakualue ( x  = 2, …, 3, y  = 2, …, 6) on korostettu pisteviivalla. Suurin Z-arvo (MAX) tällä alueella on 45. Tässä esimerkissä arvo F  = 19 esiintyy, kun tarkastellaan tietoja nousevassa Z-arvojärjestyksessä, joten meidän on etsittävä F:n ja MAX:n välillä (varjostettu alue). . Haun nopeuttamiseksi on toivottavaa laskea seuraava hakualueeseen kuuluva Z-arvo nimeltä BIGMIN (esimerkissämme 36) ja sitten etsiä vain BIGMIN ja MAX väliltä (näkyy lihavoituna), jolloin hävittää suurimman osan varjostetusta alueesta. Alaspäin suuntautuva haku on samanlainen, tässä LITMAX on kyselyn suurin Z-arvo alueella, joka on pienempi kuin F. BIGMIN-hakutehtävä muotoiltiin ensin ja ratkaisu ongelmaan esitettiin Tropfin ja Herzogin työssä [7] . Tätä ratkaisua käytetään UB-puissa ("GetNextZ-osoite"). Koska lähestymistapa ei riipu valitusta yksiulotteisesta tietorakenteesta, sen valinnassa on vapaus, jolloin voidaan käyttää hyvin tunnettuja menetelmiä, kuten balansoituja puita, työskennellä muuttuvan datan kanssa (toisin kuin esim. o R-puut ). , joissa tarvitaan erityissopimuksia). Lisäksi tämä riippumattomuus helpottaa menetelmän käyttöä olemassa olevissa tietokannoissa.

Hierarkkisesti käytettynä (kyseisen tietorakenteen mukaan) menetelmä tarjoaa erittäin tehokkaan etäisyyshaun molempiin suuntiin (laskeva tai nouseva), mikä on tärkeää sekä kaupallisissa että teollisissa sovelluksissa, esimerkiksi proseduurin muodossa. jonka perusteella etsitään lähin naapuri. Z-order on yksi harvoista menetelmistä päästä käsiksi moniulotteiseen dataan, joka on löytänyt tiensä kaupallisiin tietokantoihin ( Oracle Database 1995 ( Gaede, Guenther 1998 ), Transbase 2000 ( Ramsak, Markl, Fenk, Zirkel, Elhardt, Bayer 2000 ).).

Vuonna 1966 G. M. Morton ehdotti Z-järjestystä tiedostojen järjestämiseksi staattiseen kaksiulotteiseen maantieteelliseen tietokantaan. Pintatietoyksiköt sisältyvät yhteen useista neliölaatikoista, joita edustavat laatikon koko ja oikean alakulman Z-arvo. Suurella todennäköisyydellä siirtyminen viereiseen kehykseen suoritetaan yhdellä tai useammalla suhteellisen pienellä haulla.

Aiheeseen liittyvät rakenteet

Vaihtoehtona suositellaan Hilbertin käyrän käyttöä , koska se säilyttää järjestyksen paremmin, mutta laskelmat ovat tässä tapauksessa huomattavasti monimutkaisempia, mikä johtaa raskaaseen suorittimen käyttöön. BIGMIN-lähdekoodit sekä Z- että Hilbert-käyrälle on kuvattu H. Tropfin patentissa. [kahdeksan]

Yleiskatsauksen monimuuttujatietojen käsittelystä, mukaan lukien lähimmän naapurin hausta, katso Hanan Samet [9] .

Sovellukset

Lineaarinen algebra

Strassenin matriisin kertolaskualgoritmi perustuu matriisien osiointiin neljään lohkoon ja kunkin lohkon jakamiseen rekursiivisesti neljään pienempään lohkoon, kunnes lohkosta tulee identiteettielementti (tai käytännöllisemmin, kunnes tuloksena olevat matriisit ovat niin pieniä, että on triviaalia, että algoritmi toimii niissä nopeammin). Matriisin elementtien järjestäminen Z-järjestykseen parantaa lokaliteettia ja sillä on lisäetu (verrattuna rivi- tai sarakejärjestykseen), että kahden lohkon kertomisaliohjelman ei tarvitse tietää matriisin täyttä kokoa, riittää kun tietää lohkon koko ja sijainti muistissa. Tehokas Z-järjestyksen Strassen-algoritmi on esitetty Valsalamin ja Skjellumin vuoden 2002 artikkelissa [10] .

Buluk et ai. ehdottivat harvaa matriisiesitysrakennetta vektori-matriisikertolaskun rinnastamiseksi . Tässä esityksessä nollasta poikkeavat elementit on järjestetty Z-järjestykseen [11] .

Tekstuurikartoitus

Jotkut grafiikkasuorittimet tallentavat pintakuvioita Z-järjestyksessä lisätäkseen spatiaalisen viitepaikan pintakuvioiden rasteroinnin . Tämän ansiosta välimuistirivit voivat edustaa neliömäisiä ruutuja, mikä lisää todennäköisyyttä, että suljetut kyselyt päätyvät välimuistiin. Tämä on merkittävää, koska renderöinti 3D-tilassa sisältää mielivaltaisia ​​muunnoksia (pintojen kierto, skaalaus, perspektiivi ja kaarevuus). Myös muita mosaiikkiformaatteja voidaan käyttää.

Katso myös

Muistiinpanot

  1. Morton, 1966 .
  2. 1 2 3 Bern, Eppstein, Teng, 1999 , s. 517–532.
  3. Gargantini, 1982 , s. 905–910.
  4. 12 Chan , 2002 .
  5. Connor, Kumar, 2009 .
  6. Har-Peled, 2010 .
  7. Tropf, Herzog, 1981 , s. 71–77.
  8. US-patentti nro 7 321 890, 22. tammikuuta 2008. Tietokantajärjestelmä ja menetelmä tietoelementtien järjestämiseksi Hilbert-käyrän mukaan . Patentin kuvaus Yhdysvaltain patentti- ja tavaramerkkiviraston verkkosivuilla .
  9. Samet, 2006 .
  10. Valsalam, Skjellum, 2002 , s. 805-839.
  11. Buluç, Aydın; Fineman, Jeremy T.; Frigo, Matteo; Gilbert, John R.; Leiserson, Charles E. Rinnakkainen harva matriisi-vektori ja matriisi-transposoi-vektori kertolasku käyttäen kompressoituja harvalukuja (PDF) . ACM Symp. Parallelismista algoritmeissa ja arkkitehtuureissa. CiteSeerX  10.1.1.211.5256 . Arkistoitu alkuperäisestä (PDF) 20.10.2016 . Haettu 2017-01-05 . Tuntematon parametri |год=( ohje );Käytöstä poistettu parametri |deadlink=( ohje )

Kirjallisuus

  • GM Morton. Tietokonesuuntautunut geodeettinen tietokanta; ja uusi tekniikka tiedostojen sekvensoinnissa. - Ottawa, Kanada: IBM Ltd., 1966. - (Tekninen raportti).
  • H. Samet. Moniulotteisten ja metristen tietorakenteiden perusteet. - San Francisco: Morgan-Kaufmann, 2006. - ISBN 978-0123694461 .
  • M. Bern, D. Eppstein, S.-H. Teng. Nelipuiden ja laatukolmioiden rinnakkaisrakentaminen // Int. J. Comp. Geom. & Appl.. - 1999. - Vol. 9 , no. 6 . — S. 517–532 . - doi : 10.1142/S0218195999000303 .
  • I. Gargantini. Tehokas tapa esittää nelipuita // ACM:n viestintä. - 1982. - T. 25 , no. 12 . — S. 905–910 . - doi : 10.1145/358728.358741 .
  • M. Connor, P. Kumar. IEEE Transactions on visualisointi ja tietokonegrafiikka. – 2009.
  • S. Har-peled. Tietorakenteet geometrista approksimaatiota varten. – 2010.
  • Volker Gaede, Oliver Guenther. Moniulotteiset käyttötavat // ACM Computing Surveys. - 1998. - T. 30 , no. 2 . — S. 170–231 . - doi : 10.1145/280277.280279 .
  • Frank Ramsak, Volker Markl, Robert Fenk, Martin Zirkel, Klaus Elhardt, Rudolf Bayer. Int. Conf. erittäin suurilla tietokantoilla (VLDB). - 2000. - S. 263-272.
  • US-patentti nro 7 321 890, päivätty 22. tammikuuta 2008. Tietokantajärjestelmä ja menetelmä tietoelementtien järjestämiseksi Hilbertin käyrän mukaan . Patentin kuvaus Yhdysvaltain patentti- ja tavaramerkkiviraston verkkosivuilla .
  • Vinod Valsalam, Anthony Skjellum. Viitekehys tehokkaalle matriisin kertomiselle, joka perustuu hierarkkisiin abstraktioihin, algoritmeihin ja optimoituihin matalan tason ytimiin // Concurrency and Computation: Practice and Experience. - 2002. - Ongelma. 14(10) . - S. 805-839 . - doi : 10.1002/cpe.630 .
  • H. Tropf, H. Herzog. Moniulotteinen aluehaku dynaamisesti tasapainotetuissa puissa // Angewandte Informatik. - 1981. - T. 2 . - S. 71-77 .
  • T. Chan. Diskreettejä algoritmeja käsittelevä ACM-SIAM-symposium. – 2002.

Linkit