Кіріспе

Есептеу геометриясындағы проблемалар отбасы

Нүкте орналасу мәселесі есептеу геометриясының негізгі тақырыбы болып табылады. Ол геометриялық деректерді өңдеумен айналысатын салаларда қолданылады: компьютерлік графика, географиялық ақпараттық жүйелер (ГИС), қозғалыс жоспарлау және компьютерлік көмекпен жобалау (CAD). Ең жалпы түрінде мәселе мынадай: кеңістік бөлінген аймақтарға бөлінген кезде, сұраныс нүктесі қай аймақта орналасқанын анықтау. Мысалы, графикалық пайдаланушы интерфейсінің қай терезесінде берілген тышқанның басуы бар екенін анықтау мәселесі, нүкте орналасу мәселесінің бір мысалы ретінде қарастырылуы мүмкін, бұл жағдайда әр терезенің көрінетін бөліктерінен құрылған бөлініс пайдаланылады. Дегенмен, осы қолданба үшін арнайы дерек құрылымдары жалпы мақсаттағы нүкте орналасу дерек құрылымдарынан тиімдірек болуы мүмкін. Тағы бір ерекше жағдай – көпбұрыш ішіндегі нүкте мәселесі, онда нүкте бір көпбұрыштың ішінде, сыртында немесе шекарасында екені анықталуы керек. Көптеген қолданбаларда кеңістіктің бір бөлігіне қатысты бірнеше түрлі нүктенің орналасуын анықтау қажет. Бұл мәселені тиімді шешу үшін, сұраныс нүктесі берілгенде, сұраныс нүктесі орналасқан аймақты жылдам анықтайтын дерек құрылымын құру пайдалы (мысалы, Вороной диаграммасы).

Жазық корпус

Жазық жағдайда бізге беттер деп аталатын көпбұрыштардан тұратын S жазық бөлінісі беріледі және сұраныс нүктесі қай бетке тиесілі екенін анықтау қажет. Көпбұрыш ішіндегі нүктені табу алгоритмін қолданып, әрбір бетті күшпен іздеуге болады, бірақ бұл күрделілігі жоғары бөліністер үшін көбінесе тиімсіз. Әр түрлі тәсілдер оңтайлы дерек құрылымдарына алып келеді, олардың сақтау кеңістігі O(n) және сұраныс уақыты O(log n) құрайды, мұнда n – S-дегі барлық төбелердің саны. Айтарлықтай жеңілдету үшін, жазық бөлініс тіктөртбұрышты шектеудің ішінде орналасқан деп есептейміз.

Сабақтардың ыдырауы

Добкин мен Липтон 1976 жылы O(log n) уақытты қамтамасыз ететін ең қарапайым және ерте дерек құрылымын тапты. Ол S-тің әр төбесінен өтетін тік сызықтар арқылы S-ті бөлуге негізделген. Екі тік сызық арасындағы аймақ қабырға деп аталады. Әр қабырға солдан оңға қарай толықтай кесіп өтетін қиылыспайтын сызық сегменттерімен бөлінеді. Қабырға ішіндегі екі тікелей сегмент арасындағы аймақ S-тің бірегей жағына сәйкес келеді. Сондықтан біз нүкте табу мәселесін екі қарапайым мәселеге келтіреміз:

Тік қабырғаларға бөлінген жазықтықты ескере отырып, берілген нүкте қай қабырғада орналасқанын анықтаңыз. Солдан оңға қарай толықтай кесіп өтетін қиылыспайтын сегменттермен аймақтарға бөлінген қабырғаны ескере отырып, берілген нүкте қай аймақта орналасқанын анықтаңыз. Бірінші мәселені тік сызықтардың x координатасы бойынша O(log n) уақытында бинарлық іздеу арқылы шешуге болады. Екінші мәселені де бинарлық іздеу арқылы O(log n) уақытында шешуге болады. Сегменттер қиылыспайды және қабырғаны толықтай кесіп өтеді, сондықтан сегменттерді әр қабырғаның ішінде тік бағытта реттеуге болады. Бұл алгоритм нүктені логарифмдік уақытта табуға мүмкіндік береді және оны жүзеге асыру оңай болса да, қабырғаларды және олардың ішіндегі аймақтарды құру үшін қажетті жад O(n²) дейін жете алады, өйткені әр қабырға сегменттердің маңызды бөлігін кесіп өтуі мүмкін. Бірнеше автор екі жақын қабырғаны кесіп өтетін сегменттердің көбінесе бірдей екенін байқады. Сондықтан дерек құрылымының мөлшерін айтарлықтай азайтуға болады. Нақтырақ айтқанда, Сарнак пен Таржан тік сызықты l-ді солдан оңға қарай жазықтық бойынша жылжытады, сонымен бірге l-ді қиылыстыратын сегменттерді сақтайды. Бұл оларға жадты O(n) дейін азайтуға мүмкіндік береді, сонымен бірге O(log n) сұраныс уақытын сақтайды.

Монотонды бөліністер

Монотонды (вертикальді) тізбек – жол бойымен y координатасы ешқашан өспейтін жол. Қарапайым көпбұрыш (вертикальді) монотонды болады, егер ол екі монотонды тізбектен тұрса, ал бірінші және соңғы төбелері ортақ болса. Жазық бөліністің барлық беттерін монотонды ету үшін, оған кейбір қабырғаларды қосуға болады, нәтижесінде монотонды бөлініс пайда болады. Бұл процесс бөлініске ешқандай төбе қоспайды (демек, көлемі O(n) болып қалады) және жазықтықтан өткізу арқылы O(n log n) уақытында орындалуы мүмкін (көпбұрышты үшбұрыштауды қолдану арқылы сызықтық уақытта да орындауға болады). Сондықтан, осы бөлімде көрсетілгендей, деректер құрылымын монотонды бөліністермен шектеуде жалпылық жоғалтылмайды. Тақтаның ыдырауының кемшілігі – тік сызықтар ыдырауда қосымша сегменттер жасайды, бұл O(n) сақтау кеңістігіне қол жеткізуді қиындатады. Герберт Эдельсбруннер, Леонидас Дж. Гибас және Хорхе Столфи монотонды бөліністе тек қабырғаларды пайдаланатын оптималды деректер құрылымын тапты. Идея – тік сызықтарды пайдаланудың орнына тік монотонды тізбектерді пайдалану. Бұл жалпы идеяны нақты тиімді деректер құрылымына айналдыру оңай емес. Біріншіден, бөліністі шамамен бірдей өлшемдегі екі бөлікке бөлетін монотонды тізбекті есептеуге білуіміз керек. Екіншіден, кейбір қабырғалар бірнеше монотонды тізбектерге кіре алатындықтан, сақтау кеңістігі O(n) болатынын қамтамасыз етуге көңіл болуы керек. Үшіншіден, нүкте монотонды бөліністің сол немесе оң жағында екенін тексеру, егер наив түрде орындалса, O(n) уақыт алады. Алғашқы екі мәселені қалай шешу керектігі туралы толық мәліметтер осы мақалада қарастырылмайды. Біз үшінші мәселені қалай шешуге болатынын қысқаша айтамыз. Екілік іздеуді пайдаланып, нүкте монотонды тізбектің сол немесе оң жағында екенін O(log n) уақытында тексеруге болады. Нүкте орнын анықтау үшін O(log n) тізбектер арқылы ішкі екілік іздеуді орындау қажет болғандықтан, сұраныс уақыты O(log² n) болады. O(log n) сұраныс уақытына жету үшін бөлшекті каскадтауды қолдану керек, әртүрлі монотонды тізбектердің қабырғалары арасында көрсеткіштерді сақтау керек.

Үшбұрышты өңдеу

m төбесі бар көпбұрыш m–2 үшбұрышқа бөлінеді. Бұл үшбұрыштан басталатын индукция арқылы көрсетілуі мүмкін. Көпбұрышты тиімді үшбұрыштау үшін көптеген алгоритмдер бар, ең жылдамдары ең нашар жағдайда O(n) уақытты қажет етеді. Сондықтан, біз әрбір көпбұрышты үшбұрыштарға бөліп, дерек құрылымымызды тек үшбұрыштардан ғана тұратын бөліністермен шектей аламыз. Киркпатрик O(n) сақтау кеңістігі және O(log n) сұраныс уақыты бар үшбұрышты бөліністердегі нүктені табуға арналған дерек құрылымын ұсынады. Басты идея – үшбұрыштардың иерархиясын құру. Сұрауды орындау үшін біз сұраныс нүктесін қамтитын жоғарғы деңгейдегі үшбұрышты табамыз. Жоғарғы деңгейдегі үшбұрыштардың саны тұрақтымен шектелгендіктен, бұл операция O(1) уақытында орындалуы мүмкін. Әрбір үшбұрыш иерархияның келесі деңгейіндегі қиылысатын үшбұрыштарға сілтемелерге ие, және сілтемелердің саны да тұрақтымен шектелген. Біз сұраныс нүктесін қамтитын үшбұрышты деңгей бойынша анықтап, сұрауды жалғастырамыз. Дерек құрылымы кері тәртіппен, яғни төменнен жоғарыға қарай салынады. Біз үшбұрышты бөліністен бастаймыз және алынып тасталатын төбелердің тәуелсіз жиынтығын таңдаймыз. Төбелерді алып тастағаннан кейін, біз бөліністі қайтадан үшбұрыштауды жүзеге асырамыз. Бөлініс үшбұрыштардан тұрғандықтан, ашкөз алгоритм төбелердің тұрақты үлесін қамтитын тәуелсіз жиынтықты таба алады. Сондықтан, алып тастау қадамдарының саны O(log n) құрайды.

Трапециялы ыдырау

Бұл мәселеге кездейсоқ тәсіл трапециялық ыдырау немесе трапециялық картаға негізделген. Трапециялық ыдырау бастапқы бөліністегі әр төбеден жоғары және төмен қарай тік сәулелер жіберу арқылы алынады. Сәулелер жиекке соғысқанда тоқтап, бөліністе жаңа жиекті құрайды. Осылайша, біз O(n) жиектері мен төбелері бар плиталық ыдыраудың ішкі жиынтығын аламыз, себебі бастапқы бөліністегі әр төбе үшін біз тек екі жаңа төбе қосамыз және жиектер санын төртке арттырамыз. Трапециялық ыдырау бастапқы бөліністен сегменттерді біріктіру арқылы, кездейсоқ ретпен жасалуы мүмкін. Бастапқыда (ең бірде-бір сегмент қосылмас бұрын) трапециялық ыдырау бір трапециядан тұрады, ол бөліністің шектеу тіктөртбұрышы. Әр келесі қадамда, келесі сызық сегментінің бір ұшын ағымдағы трапециялық ыдырау ішінде табу үшін нүкте орналасу сұранысы қолданылады, содан кейін нәтижесіндегі трапециядан сол сегментті қамтитын көрші трапецияларға өтіледі, оларды бөліп, қайта біріктіріп, жақсартылған ыдырау құралады. Артқа қарай талдау, осы типтегі кездейсоқ инкрементті геометриялық алгоритмдерде жиі қолданылатын талдау түрі, әрбір енгізу үшін жасалатын трапециялардың күтілетін санын тұрақтымен шектейтінін көрсетеді, сондықтан осы алгоритмнің нүкте орналасудан басқа қадамдарының жалпы саны сызықтық. Осы алгоритм шеңберіндегі ағымдағы бөліністегі нүктелерді табу, алгоритм соңында соңғы трапециялық ыдырауда нүкте орналасу сұраныстары үшін қолданылатын бірдей құрылымды пайдалана отырып жүзеге асырылуы мүмкін. Бұл нүкте орналасу деректерінің құрылымы бағытталған ациклді граф түрінде болады, онда төбелер тазарту процесінің белгілі бір кезеңінде болған трапецияларды құрайды, ал бағытталған жиектер енді тазартуда жоқ трапецияларды оларды алмастырған трапециялармен байланыстырады. Нүкте орналасу сұранысы осы граф бойынша жолмен жүзеге асырылады, бастапқы трапециядан бастап, әр қадамда сұраныс нүктесін қамтитын алмастыру трапециясын таңдап, алмастырылмаған трапецияға жеткенге дейін. Кез келген сұраныс нүктесінен басталатын осы графтың іздеу тереңдігі күтілуде O(log n) құрайды. Деректер құрылымына қажет орын осы тазарту процесінде құрылған трапециялардың санына пропорционалды, бұл күтілуде O(n).

Жоғары өлшемдер

2 өлшемнен үлкен өлшемдер үшін сызықтық кеңістік және логарифмдік сұраныс уақыты бар жалпы нүкте орналасу деректері құрылымы белгілі емес. Сондықтан, біз сұраныс уақытын немесе сақтау кеңістігін құрбан етуіміз керек, немесе өзімізді кем жалпы түрдегі бөлініске шектеуіміз керек. Үш өлшемді кеңістікте O(n log n) кеңістікті пайдалана отырып, нүкте орналасу сұрақтарына O(log² n) уақыт ішінде жауап беруге болады. Жалпы идея – әрбір бөлініс нүктесін қамтитын n параллель жазықтықпен бөліністің қиылысына сәйкес келетін бірнеше жазықтық нүкте орналасу деректері құрылымдарын сақтау. Бұл идеяны тікелей қолдану сақтау кеңістігін O(n²) дейін арттырады. Слайдтық ыдыраудағыдай, бірізді деректер құрылымдарының ұқсастығын пайдалану арқылы сақтау кеңістігін O(n log n) дейін азайтуға болады, бірақ сұраныс уақыты O(log² n) дейін ұзарады. d өлшемді кеңістікте нүкте орналасу мәселесін беттерді рекурсивті түрде (d-1) өлшемді кеңістікке проекциялау арқылы шешуге болады. Сұраныс уақыты O(log n) болса, сақтау кеңістігі өте үлкен болуы мүмкін. d өлшемді деректер құрылымдарының жоғары күрделілігі арнайы бөліністерді зерттеуге әкелді. Мұның маңызды мысалы – гипержазықтықтардың орналасуы. n гипержазықтықтың орналасуы O(nd) ұяшықты анықтайды, бірақ нүкте орналасуын Chazelle-дің иерархиялық кесінділерін пайдалану арқылы O(log n) уақыт ішінде O(nd) кеңістікте орындауға болады. Бөліністердің тағы бір ерекше түрі – тікбұрышты (немесе ортогоналды) бөлініс. Тікбұрышты бөліністе барлық қабырғалары d ортогоналды осьтерінің біріне параллель болады. Бұл жағдайда нүкте орналасуына O(logᵈ⁻¹ n) уақыт ішінде O(n) кеңістікте жауап беруге болады.