Кіріспе

Екі өлшемді аумақты бөлу үшін әрбір ішкі түйінінің дәл төрт баласы бар ағаш деректер құрылымы.

Квадри ағашы – әрбір ішкі түйінінің дәл төрт баласы бар ағаш деректер құрылымы. Квадри ағаштар – октағаштардың екі өлшемді аналогы және көбінесе екі өлшемді кеңістікті төрт квадрантқа немесе аймаққа рекурсивті бөлу арқылы бөлу үшін қолданылады. Жапырақ жасушасымен байланысты деректер қолданысқа қарай әртүрлі болуы мүмкін, бірақ жапырақ жасушасы «қызықты кеңістіктік ақпараттың бірлігін» көрсетеді. Бөлінген аймақтар шаршы немесе тіктөртбұрышты болуы мүмкін, немесе кез келген пішінге ие болуы мүмкін. Бұл деректер құрылымын 1974 жылы Рафаэль Финкель және Дж. Л. Бентли квадри деп атады. Осыған ұқсас бөлініс Q ағашы деп те белгілі. Квадри ағаштардың барлық түрлерінде ортақ ерекшеліктер бар: Олар кеңістікті бейімделетін жасушаларға бөледі. Әрбір жасушаның (немесе бөліктің) максималды сыйымдылығы бар. Максималды сыйымдылыққа жеткенде, бөлік екіге бөлінеді. Ағаш каталогы квадри ағаштың кеңістіктік бөлінуін қадағалайды. Ағаш пирамидасы (T пирамидасы) – «толық» ағаш; T пирамидасының әрбір түйіні, жапырақ түйіндерін қоспағанда, төрт бала түйініне ие; барлық жапырақтар бір деңгейде орналасқан, бұл деңгей суреттегі жеке пиксельдерге сәйкес келеді. Ағаш пирамидасындағы деректерді толық екілік ағашты массивте ықшам түрде сақтау тәсіліне ұқсас, имплицитті деректер құрылымы ретінде массивте ықшам түрде сақтауға болады.

Түрлері

Квадрат ағаштары бейнелейтін деректер түріне қарай жіктелуі мүмкін, оларға аудандар, нүктелер, сызықтар және қисықтар кіреді. Квадрат ағаштары деректерді өңдеу ретіне тәуелді немесе тәуелсіз болуына қарай да жіктелуі мүмкін. Квадрат ағаштарының ең көп кездесетін түрлері төменде келтірілген.

Облыс төрт бұтақты

Облыс төртбұрышы екі өлшемді кеңістікті төрт тең квадрантқа, субквадранттарға және т.с.с. бөлу арқылы көрсетеді, әр жапырақ түйінінде белгілі бір субоблысқа сәйкес келетін деректер болады. Ағаштың әрбір түйінінің дәл төрт баласы болады немесе балалары болмайды (жапырақ түйіні). Осы ыдырау стратегиясын қолданатын төртбұрыш ағаштардың биіктігі (яғни, субоблыстардағы қызықты деректердің болуына байланысты және оған тәуелді, олардың толыққандырақ көрсетілуі қажет болғанда) кеңістіктегі қызықты аймақтардың таралуына сезімтал және одан тәуелді болады. Облыс төртбұрышы – тридің бір түрі. 2n × 2n пикселден тұратын кескінді көрсету үшін n тереңдігі бар облыс төртбұрышын пайдалануға болады, мұнда әрбір пикселдің мәні 0 немесе 1 болады. Түбір түйіні бүкіл кескін облысын білдіреді. Егер кез келген облыстағы пикселдер толығымен 0 немесе 1 болса, ол бөлінеді. Бұл қолданбада әрбір жапырақ түйіні барлық 0 немесе барлық 1 пикселдерден тұратын блокты білдіреді. Осы ағаштарды кескіндерді сақтау үшін пайдаланғандағы кеңістікті үнемдеу мүмкіндігін ескеріңіз; кескіндерде көбінесе бір түстің мәні бірдей болатын үлкен аймақтар болады. Кескіндегі әрбір пикселдің үлкен 2D массивін сақтаудың орнына, төртбұрыш ағаш сол ақпаратты, мүмкін, пикселдік өлшемдегі жасушалардан гөрі жоғарырақ көптеген бөлу деңгейлерінде сақтай алады. Ағаштың ажыратымдылығы мен жалпы көлемі пиксел және кескін өлшемдерімен шектеледі. Облыс төртбұрышы дерек өрісінің өзгермелі ажыратымдылығы ретінде де қолданылуы мүмкін. Мысалы, белгілі бір аймақтағы температура төртбұрыш ретінде сақталуы мүмкін, әр жапырақ түйіні ол білдіретін субоблыстағы орташа температураны сақтайды.

Тоқ төрт бұтақ

Нүктелік төрт бұтақ – екі өлшемді нүктелік деректерді көрсету үшін қолданылатын екілік ағаштың түрі. Ол барлық төрт бұтақ ағаштардың қасиеттерін бөліседі, бірақ бөліністің ортасы әрқашан нүктеде болатындықтан, бұл нағыз ағаш. Ол екі өлшемді, реттелген дерек нүктелерін салыстыруда өте тиімді, көбінесе O(log n) уақытында жұмыс істейді. Нүктелік төрт бұтақтар толықтығы үшін атауға лайық, бірақ олар жалпыланған екілік іздеу құралдары ретінде k d ағаштарынан басымдық алды. Нүктелік төрт бұтақтар келесідей құрылады. Келесі нүктені енгізген кезде, оның орналасқан ұяшығын тауып, оны ағашқа қосамыз. Жаңа нүкте оны қамтитын ұяшықты, нүкте арқылы өтетін тік және көлденең сызықтармен төрт бөлікке бөліп қосады. Сондықтан ұяшықтар тіктөртбұрышты, бірақ міндетті түрде шаршы емес. Бұл ағаштардың әрбір түйінінде бір кіріс нүктесі болады. Жазықтықтың бөлінуі нүктелерді енгізу тәртібімен анықталатындықтан, ағаштың биіктігі енгізу тәртібіне сезімтал және оған тәуелді. "Нашар" тәртіппен енгізу кіріс нүктелерінің санына пропорционал биіктіктегі ағашқа әкелуі мүмкін (сонда ол тізімге айналады). Егер нүктелер жиынтығы өзгермейтін болса, теңгерімді биіктіктегі ағаш құру үшін алдын ала өңдеу жүргізуге болады.

Нысан-аймақ (PR) төрт бұтақ

Пункттік аймақ (PR) төртбұтақтары аймақтық төртбұтақтарға өте ұқсас. Айырмашылық – жасушалар туралы сақталатын мәліметтердің түрінде. Аймақтық төртбұтақта жапырақтың жасушасының бүкіл ауданына қолданылатын бірыңғай мән сақталады. Ал PR төртбұтағының жасушалары жапырақтың жасушасы ішіндегі нүктелердің тізімін сақтайды. Бұрыңғыда айтылғандай, осы ыдырау стратегиясын қолданатын ағаштардың биіктігі нүктелердің кеңістіктегі таралуына байланысты. Нүктелік төртбұтақ сияқты, PR төртбұтағы да "нашар" жиын берілген кезде сызықтық биіктікке ие болуы мүмкін.

Көлденең төрт бұтақ

Шеті бар төрт бұтақтар (PM төрт бұтақтары сияқты) нүктелердің орнына сызықтарды сақтау үшін қолданылады. Сызықтар ұяшықтарды өте ұсақ деңгейге дейін бөлу арқылы жуықтатылады, нақтырақ айтқанда, әрбір ұяшықта бір ғана сызық сегменті қалғанша. Бұрыштар мен төбелердің жанында шеті бар төрт бұтақтар ыдыраудың ең жоғары деңгейіне жеткенше бөлінуді жалғастырады. Бұл индекстеудің мағынасын жоятын өте теңгерімсіз ағаштарға алып келуі мүмкін.

Көпбұрышты карта (PM) төртбұрышты

Көпбұрышты картаның төртбұрышты ағашы (немесе PM Quadtree) – бұл көпбұрыштар жинағын сақтауға қолданылатын төртбұрышты ағаштың бір түрі, олар бұзылған болуы мүмкін (яғни оқшауланған төбелері немесе қабырғалары бар). PM төртбұрышты ағаштары мен қабырғалық төртбұрышты ағаштардың басты айырмашылығы – егер кесінділер ұяшықта түйіскен болса, қарастырылып отырған ұяшық бөлінбейді. PM төртбұрышты ағаштарының үш негізгі класы бар, олар әрбір қара түйінде қандай ақпарат сақталады дегенге байланысты өзгереді. PM3 төртбұрышты ағаштары кез келген қиылыспайтын қабырғаларды және ең көп дегенде бір нүктені сақтай алады. PM2 төртбұрышты ағаштары PM3 төртбұрышты ағаштарымен бірдей, бірақ барлық қабырғалардың ортақ нүктесі болуы керек. Соңында, PM1 төртбұрышты ағаштары PM2-ге ұқсас, бірақ қара түйіндер нүкте мен оның қабырғаларын немесе нүктемен ортақ болатын қабырғалар жиынтығын қамтуы мүмкін, бірақ нүкте болмаған қабырғалар жиынтығы мен нүктенің бірге болуына рұқсат етілмейді.

Сығымдалған төрт бұрышты ағаштар

Бұл бөлімде Сариел Хар Пеледтің кітабынан алынған кіші бөлім қамтылған. Егер әрбір бөлінген жасушаға сәйкес келетін түйінді сақтасақ, көптеген бос түйіндер жиналуы мүмкін. Мұндай сирек ағаштардың мөлшерін тек қызықты деректері бар жапырақтары бар кіші ағаштарды (яғни "маңызды кіші ағаштарды") сақтау арқылы азайтуға болады. Өлшемді одан да қысқартуға болады. Егер біз тек маңызды кіші ағаштарды сақтасақ, кесу процесі ағашта аралық түйіндердің дәрежесі екіге тең (бір ата-ана және бір балаға сілтеме) болатын ұзын тізбектерді қалдыруы мүмкін. Бұл тізбектің басындағы түйінді сақтау жеткілікті (және алынған түйіндерді көрсету үшін кейбір метадеректерді қосу), содан кейін оның соңында тамырланған кіші ағашты қосу керек. Бұл сығылған ағаштар "жаман" кіріс деректері берілген кезде сызықтық биіктікке ие болуы мүмкін. Осы сығылуды орындағанда ағаштың көп бөлігі кесілсе де, Z қисығын пайдаланып іздеу, енгізу және жою операцияларын логарифмдік уақытта орындау мүмкін. Z қисығы толық төртбұрыштың (соның салдарынан сығылған төртбұрыштың да) әрбір жасушасын уақыттың белгілі бір мерзімінде бір өлшемді сызыққа бейнелейді (және кері бейнелеуді де орындайды), элементтердің толық тәртібін құрады. Сондықтан төртбұрышты тізімделген жиынның дерек құрылымында (онда ағаштың түйіндері сақталады) сақтауға болады. Біз одан әрі жалғастырмас бұрын, мақұлдағысы келген бір шартты айтуымыз керек: екі нақты санды екілік түрінде бергенде, олардың ерекшеленетін бірінші битінің индексін уақыттың белгілі бір мерзімінде есептей аламыз деп есептейміз. Сонымен қатар, төртбұрышты ағаштағы екі нүкте/жасушаның ең төменгі ортақ ата-анасын уақыттың белгілі бір мерзімінде есептей аламыз және олардың Z тәртібін анықтай аламыз, сондай-ақ еден функциясын уақыттың белгілі бір мерзімінде есептей аламыз. Осы шарттарға сәйкес, берілген нүктенің орнын табу (яғни нүктені қамтитын жасушаны анықтау), енгізу және жою операцияларын уақыттың белгілі бір мерзімінде орындауға болады (яғни негізгі тізімделген жиынның дерек құрылымында іздеуді орындауға кеткен уақыт). (яғни, сығылған ағаштағы оның жасушасын табу) үшін нүктенің орнын табу үшін: Z тәртібі бойынша нүктеден бұрын келетін сығылған ағаштағы жасушаны табыңыз. Бұл жасушаны If деп атаңыз. Егер If болса, қайтарыңыз. Әйтпесе, сығылмаған төртбұрышты ағашта нүкте мен жасушаның ең төменгі ортақ ата-анасы қандай болар еді, оны анықтаңыз. Бұл аталық жасушаны шақырыңыз. Z тәртібі бойынша нүктеден бұрын келетін сығылған ағаштағы жасушаны табыңыз және оны қайтарыңыз. Енді егжей-тегжейге тоқталмай, енгізу және жою операцияларын орындау үшін біз алдымен енгізу/жою қажетті нәрсенің орнын анықтаймыз, содан кейін оны енгізу/жою операциясын орындаймыз. Ағашты қажеттілікке қарай қайта пішіп, қажет болған жағдайда түйіндерді құру және жою қажет.

Квадри ағаштар арқылы суреттерді өңдеу

Квадриттер, әсіресе аймақтық квадриттер, сурет өңдеуге өте ыңғайлы. Біз талқылауды екілік сурет деректерімен шектейміз, бірақ аймақтық квадриттер және олармен орындалатын сурет өңдеу операциялары түсті суреттерге де жарамды. Екі бинарлық сурет берілгенде, сурет одағы (немесе үстінен жабысу) егер кіріс суреттердің біреуінде бірдей орналасқан пиксель қара болса, сол пиксельді қара түске бояйды. Яғни, шығыс суретіндегі пиксель тек екі кіріс суретіндегі сәйкес пиксель ақ болған жағдайда ғана ақ болады, әйтпесе шығыс пикселі қара болады. Операцияны пиксель бойынша орындаудың орнына, квадриттің бір түйінмен бірнеше пикселді бейнелеу мүмкіндігін пайдаланып, одақты тиімдірек есептеуге болады. Төмендегі талқылау үшін, егер кіші ағашта қара және ақ пиксельдердің екеуі де болса, онда сол кіші ағаштың түбі сұр түсті деп айтамыз. Алгоритм екі кіріс квадритті (және ) аралап, шығыс квадритті құру арқылы жұмыс істейді. Формальды емес түрде алгоритм келесідей: суреттердегі бірдей аймаққа сәйкес келетін түйіндерді қарастырыңыз. Егер немесе түйіні қара болса, сәйкес түйін құрылып, қара түске боялады. Егер олардың біреуі ғана қара болса, ал екіншісі сұр болса, сұр түйіннің астында кіші ағаш болады, оны аралаудың қажеті жоқ. Егер (немесе ) түйіні ақ болса, (немесе ) түйіні және оның астындағы кіші ағаш (бар болса) түйінге көшіріледі. Егер екеуі де сұр болса, онда және түйіндерінің сәйкес балалары қарастырылады. Бұл алгоритм жұмыс істейді, бірақ ол өзі минималды өлшемді квадритті кепілдемейді. Мысалы, егер біз шахмат тақтасын (әрбір тікбұрыш пиксель болатын) оның толықтырғышымен біріктірсек, қандай нәтижеге жететінімізді қарастырайық. Нәтижесінде алып қара шар пайда болады, оны тек қара түсті түбір түйінмен бейнелеу керек, бірақ алгоритм орнына 4-арық тереңдігі бар толық ағаш құрайды. Бұл мәселені шешу үшін, біз құрылған квадриттің төменнен жоғарыға қарай аралап шығамыз, төрт бала түйінінің түсі бірдей болса, олардың ата-анасын сол түстің жапырағымен ауыстырамыз. көрсеткендей, осылайша байланысты компоненттерді квадриттің өлшеміне пропорционал уақытта табуға болады. Біз әрбір бірегей белгіні жеке жиын ретінде бастаймыз. Бірінші қадамдағы әрбір эквиваленттілік қатынасы үшін сәйкес жиындарды біріктіреміз. Содан кейін, әрбір қалған ерекше жиын суреттегі ерекше байланысты компонентке сәйкес келеді. Үшінші қадам тағы бір пост-ордер аралауын жүргізеді. Бұл жолы әрбір қара түйін үшін біз union-find операциясының find функциясын (ескі белгісімен) пайдаланып, оның жаңа белгісін (ол бөлігі болып табылатын байланысты компонентке сәйкес) тауып, тағайындаймыз.

Жалпы сілтемелер

14-тарау: Төртбұрышты ағаштар: 291–306 беттер.