Үйме (мәліметтер құрылымы) - Heap (data structure) - Wikipedia

А мысалы екілік 1-ден 100-ге дейінгі бүтін сандардан тұратын түйін кілттері бар max-үйінді

Жылы есептеу техникасы, а үйінді мамандандырылған ағаш - негізделген мәліметтер құрылымы бұл іс жүзінде толық[1] қанағаттандыратын ағаш үйінді мүлік: ішінде максималды үйінді, кез келген үшін түйін C, егер P С-тің ата-аналық түйіні болса, онда кілт ( мәні) P-дің мәні C кілтінен үлкен немесе оған тең үйінді, P кілті C кілтінен кіші немесе оған тең.[2] Үйіндінің «жоғарғы жағындағы» (ата-анасыз) түйін деп аталады тамыр түйін.

Үйме - бұл an-дың максималды тиімді орындалуы деректердің дерексіз түрі а деп аталады кезек кезегі, және іс жүзінде кезектілік кезектері олардың қалай жүзеге асырылатындығына қарамастан «үйінділер» деп аталады. Үймеде ең жоғары (немесе ең төменгі) басым элемент әрқашан түбірде сақталады. Алайда, үйме - бұл сұрыпталған құрылым емес; оны ішінара тапсырыс берілген деп санауға болады. Үйме - бұл ең жоғары (немесе ең төменгі) басымдығы бар нысанды бірнеше рет алып тастау қажет болған кезде пайдалы құрылым құрылымы.

Үйінді жалпы қолдану - бұл екілік үйінді, онда ағаш а екілік ағаш (суретті қараңыз). Үйінді деректер құрылымын, атап айтқанда, екілік үйінді, енгізген Дж. Уильямс 1964 жылы мәліметтер құрылымы ретінде үйіндісі сұрыптау алгоритмі.[3] Үйінділер бірнеше тиімділікте де маңызды графикалық алгоритмдер сияқты Дайкстра алгоритмі. Үйінді толық екілік ағаш болған кезде оның биіктігі ең кіші болады - үйіндісі бар N түйіндер және әр түйін үшін а филиалдарда әрқашан журнал боладыа N биіктігі.

Графикте көрсетілгендей, аға-інілер мен туыстар арасында ешқандай болжамды тапсырыс жоқ және тәртіппен жүру (мысалы, а. болуы мүмкін) екілік іздеу ағашы ). Жоғарыда айтылған үйінді қатынасы тек түйіндер мен олардың ата-аналары, ата-әжелері және т.с.с. үшін қолданылады. Әр түйінде болатын ең көп бала саны үйінді түріне байланысты болады.

Операциялар

Үйінділермен байланысты жалпы операциялар:

Негізгі
  • табу-макс (немесе табу-мин): сәйкесінше мак-үймектің максималды элементін немесе мин-үймектің минималды элементін табыңыз (а.к.) қарау )
  • кірістіру: үйіндіге жаңа кілт қосу (мысалы, Басыңыз[4])
  • сығынды-макс (немесе сығынды-мин): үйіндіден шығарғаннан кейін максималды мән түйінін қайтарады [немесе мин үйіндіден минималды мән] поп[5])
  • жою-макс (немесе жою-мин): сәйкесінше максималды үйінді (немесе мин үйіндісі) түбірлік түйінін алып тастау
  • ауыстыру: түбірді ашып, жаңа пернені басыңыз. Поптан гөрі тиімдірек, итеріп жібереді, өйткені теңгерімді тек екі рет емес, біркелкі етіп қою керек.[6]
Құру
  • үйінді: бос үйінді жасау
  • қыру: берілген элементтер массивінен үйінді құру
  • біріктіру (одақ): бастапқы үйінділерді сақтай отырып, екеуінің де элементтері бар жарамды жаңа үйінді құру үшін екі үйіндіге қосылу.
  • балабақша: бастапқы үйінділерді бұза отырып, екеуінің де элементтерін қамтитын жарамды жаңа үйінді құру үшін екі үйіндіге қосылу.
Тексеру
  • өлшемі: үйіндідегі заттардың санын қайтару.
  • бос: егер үйінді бос болса, true мәнін қайтарыңыз, әйтпесе false.
Ішкі
  • ұлғайту немесе азайту пернесі: сәйкесінше max- немесе min-үйіндідегі кілтті жаңарту
  • жою: ерікті түйінді жою (соңынан соңғы түйінді жылжыту және үйінді ұстау үшін елеу)
  • елеу: қажет болғанша ағашта түйінді жоғары жылжытыңыз; салынғаннан кейін үйінді жағдайын қалпына келтіру үшін қолданылады. «Сүзу» деп аталады, өйткені түйін а. Деңгейіндегідей деңгейге жеткенше ағашты жоғары жылжытады елеуіш.
  • електен өткізу: електен өткізуге ұқсас ағаштағы түйінді төмен жылжытыңыз; жойылғаннан немесе ауыстырғаннан кейін үйінді жағдайын қалпына келтіру үшін қолданылады.

Іске асыру

Үймелер әдетте жасырын үйінді деректер құрылымымен жүзеге асырылады, ол деректердің жасырын құрылымы массивтен тұрады (бекітілген өлшем немесе динамикалық массив ) мұндағы әрбір элемент ата-ана / бала қатынасы олардың индексімен анықталмаған ағаш түйінін білдіреді. Элемент үйіндіге салынғаннан немесе жойылғаннан кейін, үйінді қасиеті бұзылуы мүмкін және үйінді массив ішіндегі элементтерді ауыстыру арқылы теңдестірілуі керек.

1-ден 100-ге дейінгі бүтін сандар болатын түйін кілттері бар толық екілік мак-үйінді мысалы және оның массивте қалай сақталуы.

Үйінді деректер құрылымында бірінші (немесе соңғы) элементте түбір болады. Массивтің келесі екі элементінде оның балалары бар. Келесі төртеуінде екі баланың түйіндерінің төрт баласы және т.с.с. бар, сол себепті түйіннің балалары орналасады n позицияларда болар еді 2n және 2n + 1 бір негізделген массивте немесе 2n + 1 және 2n + 2 нөлге негізделген массивте. (Егер бастапқы элементте 0 индексі болса, онда бар n индексі бар түйіннің алдында орналасқан түйіндер n. Бұлардың әрқайсысында екіден бала бар. Түбір түйінінен басқа, бұл балалар түйін балаларының алдында орналасқан барлық түйіндер n. Олардың саны 2n.) N-ші элементтің ата-аналық түйінінің индексін есептеу де қарапайым. Бір негізді массивтер үшін элементтің ата-анасы n орналасқан жерінде орналасқан n / 2. Сол сияқты нөлге негізделген массивтер үшін де ата-ана позицияда орналасқан (n-1) / 2 (еденмен). Бұл қарапайым индексті есептеу арқылы ағаштан жоғары немесе төмен жылжуға мүмкіндік береді. Үйінді теңдестіру елеу немесе елеу операциялары арқылы жүзеге асырылады (тәртіпсіз элементтерді ауыстыру). Біз массивтен қосымша жадты қажет етпейтін етіп жасай аламыз (мысалы, түйіндер үшін), үйіндісі массивті орнында сұрыптау үшін қолдануға болады.

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

Екілік құрылым (немесе г.-ary) берілген массивтен үйінді классикалық сызықты уақытта орындалуы мүмкін Флойд алгоритмі, ең нашар салыстыру саны 2-ге теңN − 2с2(N) − e2(N) (екілік үйінді үшін), қайда с2(N) - екілік ұсынудың барлық цифрларының қосындысы N және e2(N) жай көбейткіштегі 2-нің дәрежесі болып табылады N.[7] Бұл бастапқыда бос үйіндіге дәйекті кірістіру дәйектілігінен жылдамырақ.[a]

Нұсқалар

Нұсқалардың теориялық шекараларын салыстыру

Мұнда уақыттың күрделілігі[8] үйінділердің әртүрлі құрылымдарының. Функция атаулары максималды үйінді деп есептеледі. Мағынасы үшін «O(f)« және »Θ(f) «қараңыз Үлкен O белгісі.

Пайдаланутабу-максжою-макскірістіруұлғайтубалабақша
Екілік[8]Θ(1)Θ(журналn)O(журналn)O(журналn)Θ(n)
СолшылΘ(1)Θ(журнал n)Θ(журнал n)O(журнал n)Θ(журнал n)
Биномдық[8][9]Θ(1)Θ(журнал n)Θ(1)[b]Θ(журнал n)O(журналn)[c]
Фибоначчи[8][10]Θ(1)O(журналn)[b]Θ(1)Θ(1)[b]Θ(1)
Жұптау[11]Θ(1)O(журнал n)[b]Θ(1)o(журналn)[b][d]Θ(1)
Бродал[14][e]Θ(1)O(журналn)Θ(1)Θ(1)Θ(1)
Дәрежені жұптастыру[16]Θ(1)O(журнал n)[b]Θ(1)Θ(1)[b]Θ(1)
Қатаң Фибоначчи[17]Θ(1)O(журнал n)Θ(1)Θ(1)Θ(1)
2-3 үйінді[18]O(журнал n)O(журнал n)[b]O(журнал n)[b]Θ(1)?
  1. ^ Әр кірістіру O қабылдайды (log (к)) үйіндідегі бар өлшемде, осылайша . Бастап , осы кірістірулердің тұрақты коэффициенті (жартысы) максимумның тұрақты коэффициентінде болады, сондықтан асимптотикалық түрде ; ресми түрде уақыт . Мұны да оңай көруге болады Стирлингтің жуықтауы.
  2. ^ а б c г. e f ж сағ мен Амортизацияланған уақыт.
  3. ^ n үлкен үйіндінің өлшемі.
  4. ^ Төменгі шекара [12] жоғарғы шегі [13]
  5. ^ Бродал мен Окасаки кейінірек а сипаттайды табанды Қолдау көрсетілмейтін, азайту батырмасынан басқа, шектері бірдей вариант n элементтерді төменнен жоғары қарай салуға болады O(n).[15]

Қолданбалар

Үйме деректер құрылымында көптеген қосымшалар бар.

  • Heapsort: Ең жақсы сұрыптау әдістерінің бірі және ең нашар сценарийлер жоқ.
  • Іріктеу алгоритмдері Үйінді мина немесе максимум элементіне тұрақты уақытта қол жеткізуге мүмкіндік береді, ал басқа таңдау (мысалы медиана немесе kth-элемент) үйіндідегі деректер бойынша ішкі сызықтық уақытта жасалуы мүмкін.[19]
  • Графикалық алгоритмдер: Үйінділерді ішкі траверстік құрылым құрылымы ретінде пайдалану арқылы жұмыс уақыты полиномдық тәртіппен қысқарады. Мұндай проблемалардың мысалдары Ағаштың минималды алгоритмі және Дайкстраның ең қысқа алгоритмі.
  • Басым кезек: Басым кезек - бұл «тізім» немесе «карта» сияқты дерексіз ұғым; тізімді байланыстырылған тізіммен немесе массивпен жүзеге асыруға болатыны сияқты, кезек кезекті үйіндімен немесе басқа да түрлі әдістермен жүзеге асыруға болады.
  • K жолын біріктіру Үйінді деректер құрылымы көптеген сұрыпталған кіріс ағындарын бір сұрыпталған шығыс ағынына біріктіру үшін пайдалы. Біріктіру қажеттілігінің мысалдары журналға құрылымдалған біріктіру ағашы сияқты таратылған деректерден алынған сыртқы сұрыптау мен ағындық нәтижелерді қамтиды. Ішкі цикл мин элементін алады, сәйкес кіріс ағынының келесі элементімен алмастырады, содан кейін електен төмен үйінді жұмысын жасайды. (Балама түрде ауыстыру функциясы.) (Extract-max және басымдылық кезегінің кірістіру функцияларын пайдалану әлдеқайда тиімді емес.)
  • Тапсырыстың статистикасы: Heap деректер құрылымын массивтегі k-ші ең кіші (немесе ең үлкен) элементті тиімді табу үшін пайдалануға болады.

Іске асыру

  • The C ++ стандартты кітапханасы қамтамасыз етеді жасау_қап, итеру және pop_heap ерікті кездейсоқ қолмен жұмыс жасайтын үйінділерге арналған алгоритмдер (әдетте екілік үймелер түрінде жүзеге асырылады) итераторлар. Ол итераторларды массивке сілтеме ретінде қарастырады және жиымнан үймеге түрлендіруді қолданады. Ол контейнер адаптерін де қамтамасыз етеді басымдылық_күні, ол осы қондырғыларды контейнер тәрізді сыныпқа орайды. Алайда ауыстыру, елеу / елеу немесе азайту / ұлғайту операцияларына стандартты қолдау жоқ.
  • The C ++ кітапханаларын күшейтіңіз үйінді кітапханасын қосыңыз. STL-ден айырмашылығы, ол азайту және ұлғайту операцияларын қолдайды және үймелердің қосымша түрлерін қолдайды: нақтырақ айтсақ г.-ary, binomial, Fibonacci, жұптастыру және қисайған үйінділер.
  • Бар үйінділерді жалпы енгізу үшін C және C ++ бірге Үйінді және B-үйінді қолдау. Ол STL тәрізді API ұсынады.
  • Стандартты кітапханасы D бағдарламалау тілі кіреді std.container.BinaryHeap, ол D-ге сәйкес жүзеге асырылады диапазондар. Даналарды кез-келгенінен жасауға болады кездейсоқ қол жетімділік ауқымы. BinaryHeap әшкерелейді кіріс интерфейсі бұл D-дің итерациясына мүмкіндік береді әрқайсысы үшін тұжырымдамалар және интерфейстің API негізінде интеграциялау алгоритм пакет.
  • The Java платформа (1.5 нұсқасынан бастап) сыныппен екілік үйінді енгізуді ұсынады java.util.PriorityQueue ішінде Java Collections Framework. Бұл класс әдепкі бойынша мин-үйінділерді орындайды; макс-үйінді енгізу үшін бағдарламалаушы теңшелетін компаратор жазуы керек. Ауыстыру, елеу / елеу немесе азайту / ұлғайту операцияларына қолдау жоқ.
  • Python бар heapq екілік үйінді қолдану арқылы кезек кезегін жүзеге асыратын модуль. Кітапхана k-жолымен бірігуді қолдайтын үйінді ауыстыру функциясын ұсынады.
  • PHP максималды үйіндісі де бар (SplMaxHeap) және мин-үйінді (SplMinHeap) PHP стандартты кітапханасындағы 5.3 нұсқасы бойынша.
  • Перл екілік, биномдық және фибоначчидің үйінділерін жүзеге асырады Үйме тарату қол жетімді CPAN.
  • The Барыңыз тілде а бар үйінді берілген интерфейсті қанағаттандыратын ерікті типте жұмыс істейтін үйінді алгоритмдері бар пакет. Бұл пакет ауыстыру, елеу / елеу немесе азайту / ұлғайту операцияларын қолдамайды.
  • Apple's Негізгі қор кітапхана а CFBinaryHeap құрылым.
  • Фаро жиынтықтар-тізбектелген пакетте үйінділерді тестілік жағдайлар жиынтығымен бірге жүзеге асырады. Үймелер оқиғалар циклін іске асыруда қолданылады.
  • The Тот бағдарламалау тілінің екілік максималды жиынтығы бар, BinaryHeap, ішінде коллекциялар оның стандартты кітапханасының модулі.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ CORMEN, THOMAS H. (2009). АЛГОРИТМДЕРГЕ КІРІСПЕ. Америка Құрама Штаттары: The MIT Press Cambridge, Массачусетс Лондон, Англия. 151–152 бет. ISBN  978-0-262-03384-8.
  2. ^ Қара (ред.), Пол Э. (2004-12-14). Кіру үйінді жылы Алгоритмдер және мәліметтер құрылымы сөздігі. Онлайн нұсқасы. АҚШ Ұлттық стандарттар және технологиялар институты, 14 желтоқсан 2004 жыл. 2017-10-08 аралығында алынды https://xlinux.nist.gov/dads/HTML/heap.html.
  3. ^ Уильямс, Дж. Дж. Дж. (1964), «232-алгоритм - Қапсырыс», ACM байланысы, 7 (6): 347–348, дои:10.1145/512274.512284
  4. ^ Python стандартты кітапханасы, 8.4. heapq - үйінді кезегінің алгоритмі, heapq.heappush
  5. ^ Python стандартты кітапханасы, 8.4. heapq - үйінді кезегінің алгоритмі, heapq.heappop
  6. ^ Python стандартты кітапханасы, 8.4. heapq - үйінді кезегінің алгоритмі, үйінді
  7. ^ Сученек, Марек А. (2012), «Флойдтың үйінді салу бағдарламасының қарапайым, ең нашар және нашар анализі», Fundamenta Informaticae, IOS Press, 120 (1): 75–92, дои:10.3233 / FI-2012-751.
  8. ^ а б c г. Кормен, Томас Х.; Лейзерсон, Чарльз Э.; Ривест, Рональд Л. (1990). Алгоритмдерге кіріспе (1-ші басылым). MIT Press және McGraw-Hill. ISBN  0-262-03141-8.
  9. ^ «Binomial Heap | Brilliant Math & Science Wiki». brilliant.org. Алынған 2019-09-30.
  10. ^ Фредман, Майкл Лоуренс; Тарджан, Роберт Е. (Шілде 1987). «Фибоначчи үйінділері және оларды желіні оңтайландыру алгоритмдерінде қолдану» (PDF). Есептеу техникасы қауымдастығының журналы. 34 (3): 596–615. CiteSeerX  10.1.1.309.8927. дои:10.1145/28869.28874.
  11. ^ Яконо, Джон (2000), «Үймелерді жұптастырудың жоғарғы шектері жақсартылған», Proc. Алгоритм теориясы бойынша 7-ші скандинавиялық семинар (PDF), Информатикадағы дәрістер, 1851, Springer-Verlag, 63–77 б., arXiv:1110.4428, CiteSeerX  10.1.1.748.7812, дои:10.1007 / 3-540-44985-X_5, ISBN  3-540-67690-2
  12. ^ Фредман, Майкл Лоуренс (Шілде 1999). «Үйінділерді және онымен байланысты мәліметтер құрылымын жұптастыру тиімділігі туралы» (PDF). Есептеу техникасы қауымдастығының журналы. 46 (4): 473–501. дои:10.1145/320211.320214.
  13. ^ Pettie, Seth (2005). Үйінділерді жұптастырудың соңғы талдауларына қарай (PDF). FOCS '05 46-шы жыл сайынғы IEEE информатика негіздеріне арналған симпозиум материалдары. 174–183 бб. CiteSeerX  10.1.1.549.471. дои:10.1109 / SFCS.2005.75. ISBN  0-7695-2468-0.
  14. ^ Бродал, Герт С. (1996), «Нашар тиімді кезектер» (PDF), Proc. Дискретті алгоритмдер бойынша 7-ші ACM-SIAM симпозиумы, 52-58 б
  15. ^ Гудрич, Майкл Т.; Тамассия, Роберто (2004). «7.3.6. Төменнен үйінді салу». Java-дағы мәліметтер құрылымы мен алгоритмдері (3-ші басылым). 338-341 беттер. ISBN  0-471-46983-1.
  16. ^ Хауплер, Бернхард; Сен, Сидхартха; Тарджан, Роберт Е. (Қараша 2011). «Дәрежені жұптастыру» (PDF). SIAM J. Есептеу. 40 (6): 1463–1485. дои:10.1137/100785351.
  17. ^ Бродал, Герт Стольтинг; Лагогианнис, Джордж; Тарджан, Роберт Е. (2012). Қатаң Фибоначчи үйінділері (PDF). Есептеу теориясы бойынша 44-ші симпозиум материалдары - STOC '12. 1177–1184 беттер. CiteSeerX  10.1.1.233.1740. дои:10.1145/2213977.2214082. ISBN  978-1-4503-1245-5.
  18. ^ Такаока, Тадао (1999), 2-3 үйінді теориясы (PDF), б. 12
  19. ^ Фредериксон, Грег Н. (1993), «Мин-үйіндіде таңдаудың оңтайлы алгоритмі», Ақпарат және есептеу (PDF), 104, Academic Press, 197–214 б., дои:10.1006 / inco.1993.1030, мұрағатталған түпнұсқа (PDF) 2012-12-03, алынды 2010-10-31

Сыртқы сілтемелер

  • Үйме Wolfram MathWorld-де
  • Түсіндіру үйінді алгоритмдерінің қалай жұмыс істейтіндігі
  • Бентли, Джон Луи (2000). Бағдарламалау маржандары (2-ші басылым). Аддисон Уэсли. 147–162 бет. ISBN  0201657880.