Кіріспе
Интервалдарды сақтауға арналған ағаш құрылымы. Компьютер ғылымында интервал ағашы – интервалдарды сақтауға арналған ағаш құрылымы. Нақтырақ айтқанда, ол кез келген берілген интервалмен немесе нүктемен қабысатын барлық интервалдарды тиімді табуға мүмкіндік береді. Ол көбінесе терезелік сұраныстар үшін қолданылады, мысалы, тіктөртбұрышты көрістің ішінде компьютерлік картадағы барлық жолдарды табуға немесе үш өлшемді көріністің ішіндегі барлық көрінетін элементтерді табуға. Осыған ұқсас дерек құрылымы – сегмент ағашы. Тривиальды шешім – әрбір интервалды қарап, берілген нүктемен немесе интервалмен қиылысатындығын тексеру, бұл уақытты қажет етеді, мұндағы – жинақтағы интервалдардың саны. Сұрау барлық интервалдарды қайтара алатындықтан, мысалы, егер сұрау жиынтықтағы барлық интервалдарды қиып өтетін үлкен интервал болса, бұл асимптотикалық тұрғыдан оңтайлы; алайда, шығысқа сезімтал алгоритмдерді қарастыра отырып, жақсырақ нәтижеге қол жеткізуге болады, онда орындалу уақыты , сұрау арқылы алынған интервалдардың санымен өрнектеледі. Интервал ағаштарының сұраныс уақыты – , ал бастапқы құру уақыты – , жадты тұтынуды шектей отырып. Интервал ағаштары динамикалық болуы мүмкін, бұл интервалды тиімді қосуға және жоюға мүмкіндік береді, бұл уақытты қажет етеді. Егер интервалдардың соңғы нүктелері кішкентай бүтін сандар диапазонында болса (мысалы, диапазонында), жылдамырақ және іс жүзінде оңтайлы дерек құрылымдары бар, олардың алдын ала өңдеу уақыты – , ал сұраныс уақыты – берілген сұраныс нүктесін қамтитын интервалдарды есептеу үшін (өте қарапайым мысалы қараңыз).
In computer science, an interval tree is a tree data structure to hold intervals. Specifically, it allows one to efficiently find all intervals that overlap with any given interval or point. It is often used for windowing queries, for instance, to find all roads on a computerized map inside a rectangular viewport, or to find all visible elements inside a three dimensional scene. A similar data structure is the segment tree. The trivial solution is to visit each interval and test whether it intersects the given point or interval, which requires time, where is the number of intervals in the collection. Since a query may return all intervals, for example if the query is a large interval intersecting all intervals in the collection, this is asymptotically optimal; however, we can do better by considering output sensitive algorithms, where the runtime is expressed in terms of , the number of intervals produced by the query. Interval trees have a query time of and an initial creation time of , while limiting memory consumption to After creation, interval trees may be dynamic, allowing efficient insertion and deletion of an interval in time. If the endpoints of intervals are within a small integer range (e. g., in the range ), faster and in fact optimal data structures exist with preprocessing time and query time for reporting intervals containing a given query point (see for a very simple one).
Наивті тәсіл
Қарапайым жағдайда интервалдар бір-бірімен қабаттаспайды және оларды қарапайым екілік іздеу ағашына енгізіп, уақыт ішінде сұрауға болады. Дегенмен, кез келген түрде қабаттасқан интервалдар болғанда, ағашқа енгізу үшін екі интервалды салыстырудың жолы болмайды, себебі басталу немесе аяқталу нүктелері бойынша реттелген тізбектер әртүрлі болуы мүмкін. Бір қарағандағы тәсіл – басталу нүктесі бойынша реттелген және әрбір интервалдың аяқталу нүктесі бойынша реттелген екі параллель ағаш құру болар еді. Бұл әрбір ағаштың жартысын уақыт ішінде жоюға мүмкіндік береді, бірақ нәтижелерді біріктіру қажет, ол уақыт алады. Бұл сұрауларды уақыт ішінде орындауға мүмкіндік береді, бұл күш қолданудан жақсырақ емес. Интервалдық ағаштар осы мәселені шешеді. Бұл мақалада интервалдық ағаштың екі альтернативті дизайны сипатталған: орталық интервалдық ағаш және толықтырылған ағаш.
Ортаға қойылған аралықтағы ағаш
Сұраулар уақытты қажет етеді, мұнда – интервалдардың жалпы саны, ал – хабарланған нәтижелердің саны. Құрастыру уақытты, ал сақтау орынды қажет етеді.
Қиылысу
Жоғарыда құрылған дерек құрылымын пайдалана отырып, біз диапазон немесе нүкте түріндегі сұрауларды қабылдаймыз және кіріспен қиылысатын бастапқы жиынтақтағы барлық диапазонды қайтарамыз.
Нысанмен
Тапсырма – ағашта берілген нүктемен қиылысатын барлық аралықтарды табу. Ағаш дәстүрлі екілік ағашты басып өтуге қолданылатын рекурсивті алгоритммен ұқсас жолмен қарастырылады, бірақ әр түйінде "орталық" нүктемен қиылысатын аралықтарды іздеуді қолдайтын қосымша логикамен. Әр ағаш түйіні үшін, жоғарыда түйін құрылымында қолданылған орта нүктесімен салыстырылады. Егер нүкте орта нүктеден кіші болса, сол жақ аралықтар жиыны қарастырылады. Егер нүкте орта нүктеден үлкен болса, оң жақ аралықтар жиыны қарастырылады. Ағашты тамырдан жапыраққа дейін басып өтетін кезде әр түйін өңделеді, оның аралықтары өңделеді. Егер нүкте орта нүктеден кем болса, онда барлық аралықтар нүктеден кейін аяқталады, немесе олар нүктемен де қиылыса алмайды. Сондықтан, біз тек нүктеден бұрын басталатын аралықтарды табуымыз керек. Біз тек осы жағдайда аралықтардың басталуына назар аударамыз, сондықтан басталуы бойынша сұрыпталған тізімді пайдалана аламыз. Егер біз осы тізімде нүктеден үлкен емес ең жақын санды тапсақ, тізімнің басынан осы табылған нүктеге дейінгі барлық аралықтар қиылысады, өйткені олар нүктеден бұрын басталады және орта нүктеден кейін аяқталады (біз білетінімдей, олар орта нүктемен қиылысады, ал ол үлкенірек). Осылайша, біз тізімдегі аралықтарды бастапқы нүктенің мәнінен асып түсетінше санап шыға аламыз. Сол сияқты, егер нүкте орта нүктеден үлкен болса, барлық аралықтар нүктеден бұрын басталуы керек екенін білеміз, сондықтан аралықтардың аяқталуы бойынша сұрыпталған тізімді пайдаланып, нүктеден кейін аяқталатын аралықтарды табамыз. Егер нүкте орта нүктемен дәл сәйкес келсе, барлық аралықтарды қосымша өңдеусіз нәтижелерге қосуға болады және ағашты басып өтуді тоқтатуға болады.
Likewise, if is greater than , we know that all intervals in must begin before , so we find those intervals that end after using the list sorted by interval endings. If exactly matches , all intervals in can be added to the results without further processing and tree traversal can be stopped.
Жоғары өлшемдер
Интервалдық ағаш деректерінің құрылымы сұраныс пен құрылыс уақыты мен кеңістігі бірдей жоғары өлшемге жалпылана алады. Біріншіден, сұраныс аймағында бастау және аяқталу нүктелері бар барлық аралықтарды тиімді түрде алуға мүмкіндік беретін өлшемдердегі диапазон ағашы құрылады. Тиісті диапазондар табылғаннан кейін, аймақты қандай да бір өлшеммен қоршайтын диапазондар ғана қалады. Осы бір-бірімен ауыспалы жерлерді табу үшін аралық ағаштар құрылады және әрқайсысы үшін қиылысатын бір ось сұралады. Мысалы, екі өлшемде квадраттың төменгі жағы (немесе кез келген басқа көлденең сызық) көлденең ось үшін жасалған аралық ағашына қарсы сұратылады. Сол сияқты сол жақ (немесе кез келген басқа тік сызық қиылысатын) тік осінде жасалған аралық ағашына қарсы сұранысқа ие болады. Әрбір аралық ағашына жоғары өлшемдер үшін қосымша қажет. Біз ағаштағы әрбір торапты салыстыра отырып, олардың бір-бірімен ауыспалы екенін табамыз. Бір өлшемді жағдайда қолданылған нүктелердің екі реттелген тізімі орнына диапазон ағашы құрылады. Бұл осы аймақтағы барлық нүктелерді тиімді іздеуге мүмкіндік береді .
Жою
Егер аралық ағашты өшіргеннен кейін, сол аралықты қамтитын түйінде бұдан былай аралықтар болмаса, онда сол түйін ағаштан өшірілуі мүмкін. Бұл қалыпты бинарлық ағаштан өшіру операциясынан күрделірек. Интервал ағаштағы бірнеше түйіннің орта нүктесін жауып тұруы мүмкін. Әрбір түйін оны жапсыратын аралықтарды сақтайтын болғандықтан, сол жақ субағаштағы барлық аралықтар оның орталық нүктесінен сол жақта, сол сияқты оң жақ субағашта, әрбір аралық түйіндердің жиынтығынан түбірге ең жақын түйінде сақталады. Бинарлық ағаштағы қалыпты өшіру операциялары (өшірілетін түйіннің екі баласы бар жағдайда) түйінді жапырақтан өшірілетін түйіннің орнына (әдетте оң жақ кіші ағаштың сол жақ кіші баласы немесе сол жақ кіші ағаштың оң жақ кіші баласы) жылжытуды қамтиды. Бұл көтермелеудің нәтижесінде, көтермеленген түйіннен жоғары тұрған кейбір түйіндер оның ұрпақтары болады; бұл түйіндерді көтермеленген түйінмен қатар келетін аралықтарды іздеу керек және осы аралықтарды көтермеленген түйінге жылжыту керек. Нәтижесінде жаңа бос түйіндер пайда болуы мүмкін, оларды қайтадан сол алгоритм бойынша жою керек.
Теңгерімдеу
Өшіруге әсер ететін бірдей мәселелер айналым операцияларына да әсер етеді; айналым түйіндердің мүмкіндігінше тамырға жақын сақталатынын сақтауы керек.
Өңделген ағаш
Интервалдарды көрсетудің тағы бір тәсілі мына жерде сипатталған. Кірістіру және жою операцияларына уақыт қажет, мұнда – ағаштағы интервалдардың жалпы саны, кірістіру немесе жою операциясынан бұрын. Көбейтілген ағаш қарапайым реттелген ағаштан, мысалы, бинарлық іздеу ағашы немесе өзін-өзі теңгертетін бинарлық іздеу ағашынан құрылуы мүмкін, олар интервалдардың 'төмен' мәндері бойынша реттелген. Әрбір түйінге қосымша белгі қосылады, ол осы түйінден бастап төменгі жатқан барлық интервалдардың ең жоғарғы мәнін тіркейді. Бұл атрибутты сақтау үшін түйін қосылған немесе жойылған кезде түйіннің барлық ата-бабаларын төменнен жоғары қарай жаңарту қажет. Бұл түйін қосылған немесе алынған кезде тек O(h) қадамды қажет етеді, мұнда h – ағашта қосылған немесе алынған түйіннің биіктігі. Егер кірістіру және жою кезінде ағаш бұрылыстары болса, әсер еткен түйіндерді де жаңарту қажет болуы мүмкін. Екі интервал және тек егер және болса ғана қабаттасады. Ағаштарда белгілі бір интервалмен қабаттасатын түйіндерді іздегенде, бірден былайғыларды жіберіп жіберуге болады: берілген интервалдың соңынан өткен төменгі мәні бар түйіндердің оң жағындағы барлық түйіндерді; берілген интервалдың басынан төмен ең жоғарғы мәні бар барлық түйіндерді.
Both insertion and deletion require time, with being the total number of intervals in the tree prior to the insertion or deletion operation. An augmented tree can be built from a simple ordered tree, for example a binary search tree or self balancing binary search tree, ordered by the 'low' values of the intervals. An extra annotation is then added to every node, recording the maximum upper value among all the intervals from this node down. Maintaining this attribute involves updating all ancestors of the node from the bottom up whenever a node is added or deleted. This takes only O(h) steps per node addition or removal, where h is the height of the node added or removed in the tree. If there are any tree rotations during insertion and deletion, the affected nodes may need updating as well. Now, it is known that two intervals and overlap only when both and When searching the trees for nodes overlapping with a given interval, you can immediately skip:
all nodes to the right of nodes whose low value is past the end of the given interval. all nodes that have their maximum high value below the start of the given interval.
Мүшелік сұраныстары
Егер ағаш қажетсіз іздеулерден аулақ болса, өнімділік артуы мүмкін. Мұндай жағдай интервалдарды қосу кезінде олардың бұрыннан бар екенін немесе жоқ интервалдарды жою кезінде туындауы мүмкін. Интервалдарды алдымен төменгі шектері бойынша, содан кейін жоғарғы шектері бойынша реттеу арқылы олар үшін толық тәртіп белгіленеді. Осылайша, мүшелікті тексеру уақытында орындалуы мүмкін, енгізілетін немесе жойылатын интервалмен қабаттасқан интервалдардың қайталануын табуға кеткен уақыттан гөрі. Бұл шешімнің артықшылығы – қосымша құрылымдар қажет емес. Өзгеріс тек алгоритмдік сипатта. Кемшілігі – мүшелік сұрауларына уақыт керек. Балама ретінде, жадтың жылдамдығы есебінен, күтілетін тұрақты уақытта мүшелік сұрауларын жүзеге асыру үшін интервал ағашымен синхронды жаңартылатын хэш-кесте қолданылуы мүмкін. Егер интервалдар мәні бойынша емес, сілтеме бойынша сақталса, бұл жалпы жад талабын екі есеге арттырмауы мүмкін.
Жоғары өлшемдер
Күшейтілген ағаштар ағаштың әр деңгейінде өлшемдерді ауыстыру арқылы жоғары өлшемдерге кеңейтілуі мүмкін. Мысалы, екі өлшем үшін ағаштың тақ деңгейлері x координатасының диапазондыларын қамтуы мүмкін, ал жұп деңгейлер y координатасының диапазондыларын қамтуы мүмкін. Бұл тәсіл деректер құрылымын күшейтілген екілік ағаштан күшейтілген kd-ағашқа тиімді түрде түрлендіреді, соның салдарынан енгізулер мен жоюлар үшін теңгерімдеу алгоритмдерін күрделендіреді. Одан қарапайым шешім – ұялы интервалдық ағаштарды қолдану. Біріншіден, y координатасының диапазондыларын пайдаланып ағаш құрыңыз. Енді, ағаштағы әрбір түйін үшін, y диапазоны сол түйіннің y диапазонымен сәйкес келетін барлық элементтер үшін x диапазондылары бойынша тағы бір интервалдық ағаш қосыңыз. Бұл шешімнің артықшылығы – оны бірдей кодтық базаны пайдаланып, кез келген саны өлшемдерге кеңейтуге болады. Алғашқыда, ұялы ағаштардың қосымша құны тым жоғары болып көрінуі мүмкін, бірақ көбінесе олай болмайды. Бұрынғы ұяланбаған шешімдегідей, әрбір x координатасына бір түйін қажет, бұл екі шешім үшін де түйіндердің санының бірдей болуын қамтамасыз етеді. Қосымша шығын – тек тік интервал үшін бір ұялы ағаш құрылымы. Бұл құрылым әдетте мардымсыз көлемде болады, тек түбір түйініне сілтеме, және мүмкін түйіндер саны мен ағаштың тереңдігін қамтиды.
Орташа немесе ұзындыққа бағдарланған ағаш
Медиалдық немесе ұзындыққа бағытталған ағаш кеңейтілген ағашқа ұқсас, бірақ симметриялы, және екілік іздеу ағашы интервалдардың медианалық нүктелері бойынша реттелген. Әрбір түйінде интервал ұзындығы (немесе ұзындығының жартысы) бойынша реттелген максималды бағытталған екілік үйінді болады. Сондай-ақ, әрбір түйінде субағаштың ең кішкентай және ең үлкен мүмкін мәндері сақталады (осылайша симметрия қамтамасыз етіледі).
Интервалды қосу
Ағашқа жаңа интервалдарды қосу, медианалық мәнді кілт ретінде пайдалана отырып, екілік іздеу ағашындағыдай. Біз осы түйінге байланысты екілік үйіндіге қосамыз және жоғарыдағы барлық түйіндерге байланысты ең кішкентай және ең үлкен мүмкін мәндерді жаңартамыз.