Структуре података и алгоритми

Водич за структуру података о гомили

Водич за структуру података о гомили
Подаци су скуп вредности. Подаци се могу сакупљати и стављати у ред, у колону, у табелу или у облику стабла. Структура података није само смештање података у било који од ових облика. У рачунарству, структура података је било који од ових формата, плус однос између вредности, плус операције (функције) које се извршавају на вредностима. Требали бисте већ имати основно знање о структури података стабла пре доласка овде, јер ће се тамошњи концепти овде користити са мало или нимало објашњења. Ако немате то знање, прочитајте туториал под називом Водич за структуру података о дрвету за почетнике на линку хттпс: // линукхинт.цом / трее_дата_струцтуре_туториал_бегиннерс /. Након тога, наставите да читате овај водич.Структура података гомиле је комплетно или готово потпуно бинарно стабло, где је подређено вредност сваког чвора по вредности или мања од вредности његовог родитеља. Алтернативно, то је такво стабло где је вредност родитеља једнака или мања од вредности било ког његовог детета. Вредност (датум) дрвета се такође назива кључем.

Илустрација структура података гомиле

Постоје две врсте гомила: мак-хеап и мин-хеап. Структура мак-хеап је где је максимална вредност корен, а вредности постају све мање како се стабло спушта; било који родитељ је или једнак или већи по вредности од било ког од непосредног детета. Мин-хеап структура је тамо где је минимална вредност корен, а вредности постају веће како се стабло спушта; било који родитељ је или једнак или мањи по вредности од било ког од његових непосредних деце. На следећим дијаграмима, прва је мак-хеап, а друга мин-хеап:

За оба гомила, имајте на уму да за пар деце није важно да ли је оно лево већа вредност. Ред у нивоу на дрвету, не мора нужно бити попуњен од минимума до максимума, слева; такође није нужно попуњен од максимума до минимума, слева.

Представљање хрпе у низу

Да би софтвер могао лако да користи гомилу, гомила мора бити представљена у низу. Горња гомила, представљена у низу, је:

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

То се ради почевши од коренске вредности као прве вредности низа. Вредности се непрекидно постављају читањем стабла слева надесно, од врха до дна. Ако је елемент одсутан, његова позиција у низу се прескаче. Сваки чвор има двоје деце. Ако је чвор на индексу (положају) н, његово прво дете у низу је на индексу 2н + 1, а његово следеће дете на индексу 2н + 2. 89 је на индексу 0; прво дете 85 има индекс 2 (0) + 1 = 1, док је друго дете индекс 2 (0) + 2 = 2. 85 је на индексу 1; његово прво дете, 84, има индекс 2 (1) + 1 = 3, док је његово друго дете, 82, индекс 2 (1) + 2 = 4. 79 је на индексу 5; његово прво дете, 65 има индекс 2 (5) + 1 = 11, док је његово друго дете индекс 2 (5) + 2 = 12. Формуле се примењују на остале елементе низа.

Такав низ, где се значење елемента и однос између елемената подразумева положајем елемента, назива се Имплицитна структура података.

Имплицитна структура података за горњу хрпу мин:

65, 68, 70, 73, 71, 83, 84,,, 79, 80,,, 85, 89

Горе наведени мак-хеап је комплетно бинарно стабло, али не и потпуно бинарно стабло. Због тога су неке локације (позиције) празне у низу. За потпуно бинарно стабло, ниједна локација неће бити празна у пољу.

Сада, ако је гомила готово цело дрво, на пример, ако недостаје вредност 82, онда би низ био:

89, 85, 87, 84,, 79, 73, 80, 81,,, 65, 69

У овој ситуацији три локације су празне. Међутим, формуле су и даље применљиве.

Операције

Структура података је формат података (нпр.г. стабло), плус однос између вредности, плус операције (функције) које се извршавају на вредностима. За гомилу, однос који се протеже кроз целу гомилу је да родитељ мора бити једнак или већи у вредности од деце, за мак гомилу; а родитељ мора бити једнак или мањи у вредности од деце, за минималну гомилу. Овај однос се назива својство гомиле. Операције хрпе груписане су под насловима Стварање, Основно, Интерно и Инспекција. Слиједи резиме операција гомиле:

Резиме операција гомиле

Постоје одређене софтверске операције које су уобичајене за гомиле, као што следи:

Стварање гомиле

цреате_хеап: Стварање гомиле значи формирање објекта који представља гомилу. У језику Ц, можете створити хрпу са типом објекта струцт. Један од чланова структуре биће низ гомиле. Остатак чланова биће функције (операције) за гомилу. Цреате_хеап значи стварање празне хрпе.

Хеапифи: Низ гомиле је делимично сортиран (уређен) низ. Хеапифи значи, пружите низ гомиле из неразврстаног низа - погледајте детаље испод.

Спајање: То значи, формирајте гомилу сједињења из две различите гомиле - погледајте детаље испод. Те две гомиле треба да буду мак-хеап или обе мин-хеап. Нова гомила је у складу са својством гомиле, док су оригиналне гомиле сачуване (не бришу се).

Мелд: То значи, спојите две гомиле истог типа да бисте формирали нову, задржавајући дупликате - погледајте детаље испод. Нова гомила је у складу са својством гомиле, док су оригиналне гомиле уништене (избрисане). Главна разлика између спајања и спајања је у томе што се за стапање једно стабло уклапа као подстабло у корен другог стабла, омогућавајући дуплиране вредности у новом стаблу, док се за спајање формира ново стабло хрпе уклањајући дупликате. Нема потребе да се две оригиналне гомиле одржавају спајањем.

Основне операције гомиле

финд_мак (финд_мин): Пронађите максималну вредност у пољу мак-хеап и вратите копију, или пронађите минималну вредност у пољу мин-хеап и вратите копију.

Уметни: додајте нови елемент у низ гомиле и преуредите низ тако да се задржи својство гомиле дијаграма.

ектрацт_мак (ектрацт_мин): Пронађите максималну вредност у пољу мак-хеап, уклоните је и вратите; или пронађите минималну вредност у низу мин-хеап, уклоните је и вратите.

делете_мак (делете_мин): Пронађите коријенски чвор мак-хеап-а, који је први елемент низа мак-хеап-а, уклоните га без нужног враћања; или лоцирајте коријенски чвор мин-хеап-а, који је први елемент низа мин-хеап-а, уклоните га без нужног враћања;

Замена: Пронађите коријенски чвор било које гомиле, уклоните га и замените новим. Није важно да ли се враћа стари роот.

Интерне операције гомиле

повећање_кључа (смањење_кључа): Повећајте вредност било ког чвора за мак-хеап и преуредите тако да се задржи својство хеап-а или смањите вредност било којег чвора за мин-хеап и преуредите тако да се задржи својство хеап-а.

Делете: избришите било који чвор, а затим преуредите, тако да се својство гомиле одржава за мак-хеап или мин-хеап.

схифт_уп: померите чвор нагоре у мак-хеап или мин-хеап колико год је потребно, преуређујући тако да задржи својство гомиле.

схифт_довн: преместите чвор надоле у ​​мак-хеап или мин-хеап колико год је потребно, преуређујући да задржи својство гомиле.

Преглед гомиле

Величина: Ово враћа број кључева (вредности) у гомили; не укључује празне локације низа гомиле. Гомила може бити представљена кодом, као на дијаграму, или низом.

Празно: Ово враћа логичку вредност труе ако у чвору нема чвора или логичку вредност фалсе ако гомила има најмање један чвор.

Просијање на гомилу

Постоји просејавање и просејавање:

Просијање: То значи заменити чвор са родитељем. Ако својство хрпе није задовољено, замените родитеља са сопственим родитељем. Наставите овим путем у стази док се не задовољи својство гомиле. Поступак може доћи до корена.

Сифт-Довн: То значи заменити чвор велике вредности са мањим од његово двоје деце (или једним дететом за готово комплетну гомилу). Ако својство гомиле није задовољено, замените доњи чвор са мањим чвором сопственог двоје деце. Наставите овим путем у стази док се не задовољи својство гомиле. Поступак може доћи до листа.

Хеафифиинг

Хеапифи значи сортирање неразврстаног низа како би се својство гомиле задовољило за мак-хеап или мин-хеап. То значи да у новом низу могу бити неке празне локације. Основни алгоритам за гомилање мак-хеап или мин-хеап је следећи:

- ако је коренски чвор екстремнији од било ког чвора свог детета, тада размените корен са мање екстремним чвором детета.

- Поновите овај корак са подређеним чворовима у Шеми преласка стабла преднаруџбе.

Коначно стабло је дрво гомиле које задовољава својство гомиле. Гомила се може представити као дијаграм стабла или у низу. Добијена гомила је делимично сортирано стабло, тј.е. делимично сортирани низ.

Детаљи операције гомиле

Овај одељак чланка даје детаље операција гомиле.

Стварање детаља гомиле

цреате_хеап

Види горе!

отежати

Види горе

спојити

Ако се гомила низа,

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

и

89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71

се споје, резултат без дупликата може бити,

89, 85, 87, 84, 82, 83, 81, 80, 79, 73, 68, 65, 69, 70, 71

После неког просејавања. Приметите да у првом низу 82 нема деце. У резултујућем низу налази се на индексу 4; а његове локације под индексом 2 (4) + 1 = 9 и 2 (4) + 2 = 10 су упражњене. То значи да такође нема деце у новом дијаграму стабла. Оригиналне две гомиле не би требало брисати, јер њихове информације заправо нису у новој гомили (нови низ). Основни алгоритам за спајање гомила истог типа је следећи:

- Спојите један низ са дном другог низа.

- Хеапифи уклања дупликате, осигуравајући да чворови који нису имали деце у оригиналним гомилама, још увек немају децу у новој гомили.

мелд

Алгоритам за спајање две гомиле истог типа (било две максималне или две мин-) је следећи:

- Упоредите два коренска чвора.

- Направите мање екстремни корен и остатак његовог дрвета (подстабло), друго дете крајњег корена.

- Просијте залутало дете корена сада екстремног подстабла, надоле у ​​крајње подстабло.

Добијена гомила је и даље у складу са својством гомиле, док су оригиналне гомиле уништене (избрисане). Оригиналне гомиле могу бити уништене, јер су све информације које су поседовали и даље на новој гомили.

Основне операције гомиле

финд_мак (финд_мин)

То значи лоцирати максималну вредност у пољу мак-хеап и вратити копију или лоцирати минималну вредност у пољу мин-хеап и вратити копију. Низ хеап по дефиницији већ задовољава својство хеап. Дакле, само вратите копију првог елемента низа.

уметак

То значи да додајте нови елемент у низ гомиле и преуредите низ тако да се задржи својство хеап дијаграма (задовољено). Алгоритам за то за обе врсте гомила је следећи:

- Претпоставимо пуно бинарно стабло. То значи да низ на крају треба попунити празним локацијама ако је потребно. Укупан број чворова пуне гомиле је 1, или 3 или 7 или 15 или 31 итд.; настави да удвостручујеш и сабираш 1.

- Ставите чвор на најпогодније празно место по величини, према крају хрпе (према крају низа гомиле). Ако нема празне локације, започните нови ред доле лево.

- Пресејте ако је потребно, док се не задовољи својство гомиле.

ектрацт_мак (ектрацт_мин)

Пронађите максималну вредност у пољу мак-хеап, уклоните је и вратите; или пронађите минималну вредност у низу мин-хеап, уклоните је и вратите. Алгоритам за екстракцију_макса (екстракт_мин) је следећи:

- Уклоните коријенски чвор.

- Узмите (уклоните) крајњи доњи чвор (последњи чвор у низу) и поставите га у корен.

- Просијте према потреби, док не буде задовољено својство гомиле.

делете_мак (делете_мин)

Пронађите коријенски чвор мак-хеап, који је први елемент низа мак-хеап, уклоните га без нужног враћања; или лоцирајте коријенски чвор мин-хеап-а, који је први елемент низа мин-хеап-а, уклоните га без нужног враћања. Алгоритам за брисање основног чвора је следећи:

- Уклоните коријенски чвор.

- Узмите (уклоните) крајњи десни чвор (последњи чвор у низу) и поставите га у корен.

- Просијте према потреби, док не буде задовољено својство гомиле.

заменити

Пронађите коренски чвор било које хрпе, уклоните га и замените новим. Није важно да ли се враћа стари корен. Просијте према потреби, док не буде задовољено својство гомиле.

Интерне операције гомиле

типка_већања (типка_мања)

Повећајте вредност било којег чвора за максималну гомилу и преуредите тако да се задржи својство гомиле, или смањите вредност било ког чвора за мин хрпу и преуредите тако да се задржи својство гомиле. Просијте горе или доле по потреби, све док не буде задовољено својство гомиле.

избрисати

Уклоните чвор од интереса, а затим га преуредите, тако да се својство гомиле одржава за мак-хеап или мин-хеап. Алгоритам за брисање чвора је следећи:

- Уклоните чвор од интереса.

- Узмите (уклоните) крајњи десни чвор (последњи чвор у низу) и ставите га на индекс уклоњеног чвора. Ако је чвор избрисан у последњем реду, то можда неће бити потребно.

- Просијте горе или доле по потреби, све док не буде задовољено својство гомиле.

променити брзину навише

Преместите чвор нагоре у мак-хеап или мин-хеап колико год је потребно, преуређујући тако да задржи својство гомиле - просијте.

схифт_довн

Преместите чвор надоле у ​​мак-хеап или мин-хеап колико год је потребно, преуређујући да бисте одржали својство гомиле - просијте доле.

Преглед гомиле

величина

Види горе!

Празно

Види горе!

Остале класе гомила

Гомила описана у овом чланку може се сматрати главном (генералном) гомилом. Постоје и друге класе гомила. Међутим, двоје које бисте требали знати и даље од овога су Бинарна гомила и дневна гомила.

Бинарна гомила

Бинарна гомила је слична овој главној гомили, али са више ограничења. Конкретно, бинарна гомила мора бити комплетно стабло. Не бркајте између целог и пуног стабла.

д-арна гомила

Бинарна гомила је 2-арна гомила. Гомила где сваки чвор има по 3 деце је тројна гомила. Гомила где сваки чвор има по 4 детета је четворострука гомила и тако даље. Д-арна гомила има и друга ограничења.

Закључак

Хрпа је комплетно или готово комплетно бинарно стабло, које задовољава својство хрпе. Својство гомиле има 2 алтернативе: за максималан гомилу родитељ мора бити једнак или већи по вредности од непосредне деце; за минималну хрпу, родитељ мора бити једнак или мањи по вредности од непосредне деце. Гомила може бити представљена као стабло или у низу. Када је представљен у низу, коријенски чвор је први чвор низа; а ако је чвор индекс н, његово прво дете у низу је индекс 2н + 1, а његово следеће дете индекс 2н + 2. Гомила има одређене операције које се изводе над низом.

Цхрис

Како преузети и играти Сид Меиер'с Цивилизатион ВИ на Линук-у
Увод у игру Цивилизатион 6 је модерни поглед на класични концепт представљен у серији игара Аге оф Емпирес. Идеја је била прилично једноставна; започе...
Како инсталирати и играти Доом на Линук-у
Увод у Доом Доом серија настала је 90-их година након објављивања оригиналног Доом-а. То је био тренутни хит и од тог времена надаље серија игара је д...
Вулкан за кориснике Линука
Са сваком новом генерацијом графичких картица видимо да програмери игара помичу границе графичке верности и долазе на корак од фотореализма. Али упрко...