Кіріспе

Интервалдарды сақтауға арналған ағаш құрылымы. Компьютер ғылымында интервал ағашы – интервалдарды сақтауға арналған ағаш құрылымы. Нақтырақ айтқанда, ол кез келген берілген интервалмен немесе нүктемен қабысатын барлық интервалдарды тиімді табуға мүмкіндік береді. Ол көбінесе терезелік сұраныстар үшін қолданылады, мысалы, тіктөртбұрышты көрістің ішінде компьютерлік картадағы барлық жолдарды табуға немесе үш өлшемді көріністің ішіндегі барлық көрінетін элементтерді табуға. Осыған ұқсас дерек құрылымы – сегмент ағашы. Тривиальды шешім – әрбір интервалды қарап, берілген нүктемен немесе интервалмен қиылысатындығын тексеру, бұл уақытты қажет етеді, мұндағы – жинақтағы интервалдардың саны. Сұрау барлық интервалдарды қайтара алатындықтан, мысалы, егер сұрау жиынтықтағы барлық интервалдарды қиып өтетін үлкен интервал болса, бұл асимптотикалық тұрғыдан оңтайлы; алайда, шығысқа сезімтал алгоритмдерді қарастыра отырып, жақсырақ нәтижеге қол жеткізуге болады, онда орындалу уақыты , сұрау арқылы алынған интервалдардың санымен өрнектеледі. Интервал ағаштарының сұраныс уақыты – , ал бастапқы құру уақыты – , жадты тұтынуды шектей отырып. Интервал ағаштары динамикалық болуы мүмкін, бұл интервалды тиімді қосуға және жоюға мүмкіндік береді, бұл уақытты қажет етеді. Егер интервалдардың соңғы нүктелері кішкентай бүтін сандар диапазонында болса (мысалы, диапазонында), жылдамырақ және іс жүзінде оңтайлы дерек құрылымдары бар, олардың алдын ала өңдеу уақыты – , ал сұраныс уақыты – берілген сұраныс нүктесін қамтитын интервалдарды есептеу үшін (өте қарапайым мысалы қараңыз).

Наивті тәсіл

Қарапайым жағдайда интервалдар бір-бірімен қабаттаспайды және оларды қарапайым екілік іздеу ағашына енгізіп, уақыт ішінде сұрауға болады. Дегенмен, кез келген түрде қабаттасқан интервалдар болғанда, ағашқа енгізу үшін екі интервалды салыстырудың жолы болмайды, себебі басталу немесе аяқталу нүктелері бойынша реттелген тізбектер әртүрлі болуы мүмкін. Бір қарағандағы тәсіл – басталу нүктесі бойынша реттелген және әрбір интервалдың аяқталу нүктесі бойынша реттелген екі параллель ағаш құру болар еді. Бұл әрбір ағаштың жартысын уақыт ішінде жоюға мүмкіндік береді, бірақ нәтижелерді біріктіру қажет, ол уақыт алады. Бұл сұрауларды уақыт ішінде орындауға мүмкіндік береді, бұл күш қолданудан жақсырақ емес. Интервалдық ағаштар осы мәселені шешеді. Бұл мақалада интервалдық ағаштың екі альтернативті дизайны сипатталған: орталық интервалдық ағаш және толықтырылған ағаш.

Ортаға қойылған аралықтағы ағаш

Сұраулар уақытты қажет етеді, мұнда – интервалдардың жалпы саны, ал – хабарланған нәтижелердің саны. Құрастыру уақытты, ал сақтау орынды қажет етеді.

Қиылысу

Жоғарыда құрылған дерек құрылымын пайдалана отырып, біз диапазон немесе нүкте түріндегі сұрауларды қабылдаймыз және кіріспен қиылысатын бастапқы жиынтақтағы барлық диапазонды қайтарамыз.

Нысанмен

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

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

Интервалдық ағаш деректерінің құрылымы сұраныс пен құрылыс уақыты мен кеңістігі бірдей жоғары өлшемге жалпылана алады. Біріншіден, сұраныс аймағында бастау және аяқталу нүктелері бар барлық аралықтарды тиімді түрде алуға мүмкіндік беретін өлшемдердегі диапазон ағашы құрылады. Тиісті диапазондар табылғаннан кейін, аймақты қандай да бір өлшеммен қоршайтын диапазондар ғана қалады. Осы бір-бірімен ауыспалы жерлерді табу үшін аралық ағаштар құрылады және әрқайсысы үшін қиылысатын бір ось сұралады. Мысалы, екі өлшемде квадраттың төменгі жағы (немесе кез келген басқа көлденең сызық) көлденең ось үшін жасалған аралық ағашына қарсы сұратылады. Сол сияқты сол жақ (немесе кез келген басқа тік сызық қиылысатын) тік осінде жасалған аралық ағашына қарсы сұранысқа ие болады. Әрбір аралық ағашына жоғары өлшемдер үшін қосымша қажет. Біз ағаштағы әрбір торапты салыстыра отырып, олардың бір-бірімен ауыспалы екенін табамыз. Бір өлшемді жағдайда қолданылған нүктелердің екі реттелген тізімі орнына диапазон ағашы құрылады. Бұл осы аймақтағы барлық нүктелерді тиімді іздеуге мүмкіндік береді .

Жою

Егер аралық ағашты өшіргеннен кейін, сол аралықты қамтитын түйінде бұдан былай аралықтар болмаса, онда сол түйін ағаштан өшірілуі мүмкін. Бұл қалыпты бинарлық ағаштан өшіру операциясынан күрделірек. Интервал ағаштағы бірнеше түйіннің орта нүктесін жауып тұруы мүмкін. Әрбір түйін оны жапсыратын аралықтарды сақтайтын болғандықтан, сол жақ субағаштағы барлық аралықтар оның орталық нүктесінен сол жақта, сол сияқты оң жақ субағашта, әрбір аралық түйіндердің жиынтығынан түбірге ең жақын түйінде сақталады. Бинарлық ағаштағы қалыпты өшіру операциялары (өшірілетін түйіннің екі баласы бар жағдайда) түйінді жапырақтан өшірілетін түйіннің орнына (әдетте оң жақ кіші ағаштың сол жақ кіші баласы немесе сол жақ кіші ағаштың оң жақ кіші баласы) жылжытуды қамтиды. Бұл көтермелеудің нәтижесінде, көтермеленген түйіннен жоғары тұрған кейбір түйіндер оның ұрпақтары болады; бұл түйіндерді көтермеленген түйінмен қатар келетін аралықтарды іздеу керек және осы аралықтарды көтермеленген түйінге жылжыту керек. Нәтижесінде жаңа бос түйіндер пайда болуы мүмкін, оларды қайтадан сол алгоритм бойынша жою керек.

Теңгерімдеу

Өшіруге әсер ететін бірдей мәселелер айналым операцияларына да әсер етеді; айналым түйіндердің мүмкіндігінше тамырға жақын сақталатынын сақтауы керек.

Өңделген ағаш

Интервалдарды көрсетудің тағы бір тәсілі мына жерде сипатталған. Кірістіру және жою операцияларына уақыт қажет, мұнда – ағаштағы интервалдардың жалпы саны, кірістіру немесе жою операциясынан бұрын. Көбейтілген ағаш қарапайым реттелген ағаштан, мысалы, бинарлық іздеу ағашы немесе өзін-өзі теңгертетін бинарлық іздеу ағашынан құрылуы мүмкін, олар интервалдардың 'төмен' мәндері бойынша реттелген. Әрбір түйінге қосымша белгі қосылады, ол осы түйінден бастап төменгі жатқан барлық интервалдардың ең жоғарғы мәнін тіркейді. Бұл атрибутты сақтау үшін түйін қосылған немесе жойылған кезде түйіннің барлық ата-бабаларын төменнен жоғары қарай жаңарту қажет. Бұл түйін қосылған немесе алынған кезде тек O(h) қадамды қажет етеді, мұнда h – ағашта қосылған немесе алынған түйіннің биіктігі. Егер кірістіру және жою кезінде ағаш бұрылыстары болса, әсер еткен түйіндерді де жаңарту қажет болуы мүмкін. Екі интервал және тек егер және болса ғана қабаттасады. Ағаштарда белгілі бір интервалмен қабаттасатын түйіндерді іздегенде, бірден былайғыларды жіберіп жіберуге болады: берілген интервалдың соңынан өткен төменгі мәні бар түйіндердің оң жағындағы барлық түйіндерді; берілген интервалдың басынан төмен ең жоғарғы мәні бар барлық түйіндерді.

Мүшелік сұраныстары

Егер ағаш қажетсіз іздеулерден аулақ болса, өнімділік артуы мүмкін. Мұндай жағдай интервалдарды қосу кезінде олардың бұрыннан бар екенін немесе жоқ интервалдарды жою кезінде туындауы мүмкін. Интервалдарды алдымен төменгі шектері бойынша, содан кейін жоғарғы шектері бойынша реттеу арқылы олар үшін толық тәртіп белгіленеді. Осылайша, мүшелікті тексеру уақытында орындалуы мүмкін, енгізілетін немесе жойылатын интервалмен қабаттасқан интервалдардың қайталануын табуға кеткен уақыттан гөрі. Бұл шешімнің артықшылығы – қосымша құрылымдар қажет емес. Өзгеріс тек алгоритмдік сипатта. Кемшілігі – мүшелік сұрауларына уақыт керек. Балама ретінде, жадтың жылдамдығы есебінен, күтілетін тұрақты уақытта мүшелік сұрауларын жүзеге асыру үшін интервал ағашымен синхронды жаңартылатын хэш-кесте қолданылуы мүмкін. Егер интервалдар мәні бойынша емес, сілтеме бойынша сақталса, бұл жалпы жад талабын екі есеге арттырмауы мүмкін.

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

Күшейтілген ағаштар ағаштың әр деңгейінде өлшемдерді ауыстыру арқылы жоғары өлшемдерге кеңейтілуі мүмкін. Мысалы, екі өлшем үшін ағаштың тақ деңгейлері x координатасының диапазондыларын қамтуы мүмкін, ал жұп деңгейлер y координатасының диапазондыларын қамтуы мүмкін. Бұл тәсіл деректер құрылымын күшейтілген екілік ағаштан күшейтілген kd-ағашқа тиімді түрде түрлендіреді, соның салдарынан енгізулер мен жоюлар үшін теңгерімдеу алгоритмдерін күрделендіреді. Одан қарапайым шешім – ұялы интервалдық ағаштарды қолдану. Біріншіден, y координатасының диапазондыларын пайдаланып ағаш құрыңыз. Енді, ағаштағы әрбір түйін үшін, y диапазоны сол түйіннің y диапазонымен сәйкес келетін барлық элементтер үшін x диапазондылары бойынша тағы бір интервалдық ағаш қосыңыз. Бұл шешімнің артықшылығы – оны бірдей кодтық базаны пайдаланып, кез келген саны өлшемдерге кеңейтуге болады. Алғашқыда, ұялы ағаштардың қосымша құны тым жоғары болып көрінуі мүмкін, бірақ көбінесе олай болмайды. Бұрынғы ұяланбаған шешімдегідей, әрбір x координатасына бір түйін қажет, бұл екі шешім үшін де түйіндердің санының бірдей болуын қамтамасыз етеді. Қосымша шығын – тек тік интервал үшін бір ұялы ағаш құрылымы. Бұл құрылым әдетте мардымсыз көлемде болады, тек түбір түйініне сілтеме, және мүмкін түйіндер саны мен ағаштың тереңдігін қамтиды.

Орташа немесе ұзындыққа бағдарланған ағаш

Медиалдық немесе ұзындыққа бағытталған ағаш кеңейтілген ағашқа ұқсас, бірақ симметриялы, және екілік іздеу ағашы интервалдардың медианалық нүктелері бойынша реттелген. Әрбір түйінде интервал ұзындығы (немесе ұзындығының жартысы) бойынша реттелген максималды бағытталған екілік үйінді болады. Сондай-ақ, әрбір түйінде субағаштың ең кішкентай және ең үлкен мүмкін мәндері сақталады (осылайша симметрия қамтамасыз етіледі).

Интервалды қосу

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