Структури даних та алгоритми

Підручник з структури даних кучі

Підручник з структури даних кучі
Дані - це набір значень. Дані можна збирати та розміщувати в ряд, або в стовпець, або в таблицю, або у вигляді дерева. Структура даних - це не тільки розміщення даних у будь-якій із цих форм. Під час обчислень структура даних - це будь-який із цих форматів, плюс зв’язок між значеннями, плюс операції (функції), що виконуються над значеннями. Ви вже повинні мати базові знання про структуру деревних даних перед тим, як приїжджати сюди, оскільки поняття там будуть використовуватися тут з незначним поясненням або зовсім без нього. Якщо у вас немає цих знань, прочитайте підручник "Підручник з структури даних дерева для початківців" за посиланням https: // linuxhint.com / tree_data_structure_tutorial_beginners /. Після цього продовжуйте читати цей підручник.Структура даних купи - це повне або майже повне двійкове дерево, де дочірній елемент кожного вузла за значенням дорівнює або менший за значення його батьківського. Як альтернатива, це таке дерево, де значення батьків дорівнює або менше значення будь-якого з його дочірніх елементів. Значення (дані) дерева також називають ключовим.

Ілюстрація структур даних купи

Існує два типи купи: максимальна куча та мінімальна купа. Структура max-heap - це де максимальним значенням є корінь, а значення стають меншими, коли дерево спускається вниз; будь-який батько або дорівнює, або більший за вартістю, ніж будь-який з його найближчих дітей. Структура min-heap - це де мінімальним значенням є корінь, а значення стають більшими, коли дерево спускається вниз; будь-який батько або дорівнює, або менший за вартістю, ніж будь-який з його найближчих дітей. На наступних діаграмах перша - це max-heap, а друга - min-heap:

Для обох куп зверніть увагу, що для пари дітей неважливо, чи є значення ліворуч більшим. Рядок на рівні дерева, не обов'язково повинен бути заповнений від мінімуму до максимуму зліва; він також не обов'язково заповнюється з максимального до мінімуму, зліва.

Представлення купи в масиві

Щоб програмне забезпечення легко використовувало купу, ця купа повинна бути представлена ​​в масиві. Максимальна купа, представлена ​​в масиві:

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

Це робиться починаючи з кореневого значення як першого значення для масиву. Значення постійно розміщуються, читаючи дерево зліва направо, зверху вниз. Якщо елемент відсутній, його позиція в масиві пропускається. Кожен вузол має двох дітей. Якщо вузол має індекс (позицію) n, його перша дочірня частина в масиві має індекс 2n + 1, а його наступна дочірня дошка має індекс 2n + 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. Формули застосовуються до решти елементів масиву.

Такий масив, де значення елемента та взаємозв'язок між елементами передбачається положенням елемента, називається неявною структурою даних.

Неявна структура даних для вищезазначеного min-heap є:

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

Наведений вище max-heap є повним бінарним деревом, але не повним бінарним деревом. Ось чому деякі місця (позиції) порожні в масиві. Для повного двійкового дерева жодне розташування не буде порожнім у масиві.

Тепер, якби купа була майже повним деревом, наприклад, якщо б значення 82 не було, то масив мав би:

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

У цій ситуації три місця порожні. Однак формули все ще застосовуються.

Операції

Структура даних - це формат даних (наприклад,.g. дерево), плюс зв’язок між значеннями, плюс операції (функції), що виконуються над значеннями. Щодо купи, зв’язок, який проходить через цілу купу, полягає в тому, що батьківський показник повинен бути рівним або більшим за значенням, ніж діти, для максимального купи; і батько повинен бути рівним або меншим за вартістю, ніж діти, для мінімальної купи. Це відношення називається властивістю купи. Операції купи згруповані під заголовками Створення, Основні, Внутрішні та Інспекційні. Короткий зміст операцій з купою наведено нижче:

Підсумок операцій з купою

Існують певні операції з програмним забезпеченням, які є спільними для купи, наступним чином:

Створення купи

create_heap: Створення купи означає формування об'єкта, що представляє купу. Мовою С ви можете створити купу з типом об’єкта struct. Одним з членів структури буде масив купи. Решта членів будуть функціями (операціями) для купи. Create_heap означає створення порожньої купи.

Heapify: масив купи - це частково відсортований (упорядкований) масив. Heapify означає, надайте масив купи з невідсортованого масиву - див. Деталі нижче.

Об'єднання: Це означає, утворити купу об'єднання з двох різних куп - див. Деталі нижче. Обидві купи повинні мати максимум кучі або обидва міні кучі. Нова купа відповідає властивості купи, тоді як оригінальні купи зберігаються (не стираються).

Meld: Це означає, об’єднайте дві купи одного типу, щоб сформувати нову, зберігаючи дублікати - див. Деталі нижче. Нова купа відповідає властивості купи, тоді як початкові купи руйнуються (стираються). Основна відмінність між злиттям та злиттям полягає в тому, що для злиття одне дерево підходить як піддерево до кореня іншого дерева, дозволяючи повторювані значення в новому дереві, тоді як для злиття формується нове дерево купи, видаляючи дублікати. Немає необхідності підтримувати два оригінальні купи з формуванням.

Основні операції з купою

find_max (find_min): знайдіть максимальне значення в масиві max-heap і поверніть копію, або знайдіть мінімальне значення в масиві min-heap і поверніть копію.

Вставити: Додайте новий елемент до масиву купи і переставляйте масив так, щоб властивість купи діаграми зберігалася.

extract_max (extract_min): знайдіть максимальне значення в масиві max-heap, видаліть і поверніть його; або знайдіть мінімальне значення в масиві min-heap, видаліть і поверніть його.

delete_max (delete_min): знайдіть кореневий вузол max-heap, який є першим елементом масиву max-heap, видаліть його, не обов'язково повертаючи; або знайдіть кореневий вузол min-heap, який є першим елементом масиву min-heap, видаліть його, не обов'язково повертаючи;

Замінити: Знайдіть кореневий вузол будь-якої купи, видаліть його та замініть новим. Не має значення, чи буде повернено старий корінь.

Внутрішні операції купи

збільшити_ключ (зменшити_ключ): Збільшити значення будь-якого вузла для max-heap і переставити так, щоб властивість heap зберігалося, або зменшити значення будь-якого вузла для min-heap і переставити так, щоб властивість heap зберігалася.

Видалити: видалити будь-який вузол, потім переставити так, щоб властивість купи зберігалася для max-heap або min-heap.

shift_up: перемістити вузол вгору в max-heap або min-heap стільки часу, скільки потрібно, переставляючи, щоб зберегти властивість купи.

shift_down: перемістити вузол донизу в max-heap або min-heap стільки часу, скільки потрібно, переставляючи, щоб зберегти властивість купи.

Огляд купи

Розмір: Це повертає кількість ключів (значень) у купі; він не включає порожні розташування масиву купи. Купа може бути представлена ​​кодом, як на схемі, або масивом.

пусто: Це повертає логічне значення true, якщо у купі немає вузла, або логічне значення false, якщо в купі є хоча б один вузол.

Просіювання в купу

Існує просіювання та просіювання:

Просіювання: Це означає обмін вузла з його батьківським. Якщо властивість купи не задоволено, поміняйте батьківського на власного батьківського. Продовжуйте цей шлях у шляху, доки не буде задоволено властивість купи. Процедура може дійти до кореня.

Просіяти: Це означає, що вузол великого значення замінюється меншим із двох його дочірніх організацій (або однією дочірньою історією для майже повної купи). Якщо властивість купи не задоволено, поміняйте нижній вузол меншим вузлом своїх двох дочірніх організацій. Продовжуйте цей шлях у шляху, доки не буде задоволено властивість купи. Процедура може дійти до листа.

Обтяжливий

Heapify означає сортування невідсортованого масиву, щоб властивість купи була задоволена для max-heap або min-heap. Це означає, що в новому масиві можуть бути порожні місця. Основний алгоритм для створення максі-кучі або міні-купи такий:

- якщо кореневий вузол є більш екстремальним, ніж будь-який з його дочірніх вузлів, тоді обміняйте корінь з менш екстремальним дочірнім вузлом.

- Повторіть цей крок із дочірніми вузлами у схемі попереднього замовлення дерева.

Остаточне дерево - це дерево купи, що відповідає властивості купи. Купа може бути представлена ​​у вигляді деревної діаграми або масиву. Отримана купа є частково відсортованим деревом, тобто.e. частково відсортований масив.

Подробиці операції з купою

У цьому розділі статті подано подробиці операцій купи.

Створення деталей купи

create_heap

Дивись вище!

посилити

Дивись вище

злиття

Якщо маса масивів,

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 є вакантними. Це означає, що він також не має дітей на новій діаграмі дерева. Оригінальні два купи не слід видаляти, оскільки їх інформація насправді не в новій купі (новий масив). Основний алгоритм об'єднання куп одного типу такий:

- Приєднайте один масив до нижньої частини іншого масиву.

- Heapify усуває дублікати, переконуючись, що вузли, які не мали дітей у вихідних кучах, все ще не мають дітей у новій купі.

злиття

Алгоритм злиття двох куп однакового типу (або двох макс-, або двох хв) такий:

- Порівняйте два кореневі вузли.

- Зробіть менш екстремальний корінь та решту його дерева (піддерева), другу дочірню істоту крайнього кореня.

- Просійте бездомну дитину кореня тепер крайнього піддерева, вниз, у крайнє піддерево.

Отримана купа все ще відповідає властивості купи, тоді як початкові купи руйнуються (стираються). Оригінальні купи можуть бути знищені, оскільки вся інформація, якою вони володіють, все ще знаходиться в новій купі.

Основні операції з купою

find_max (find_min)

Це означає знайти максимальне значення в масиві max-heap і повернути копію, або знайти мінімальне значення в масиві min-heap і повернути копію. Масив купи за визначенням вже задовольняє властивості купи. Отже, просто поверніть копію першого елемента масиву.

вставити

Це означає додати новий елемент до масиву купи і переставити масив так, щоб властивість купи діаграми зберігалася (задоволена). Алгоритм для цього для обох типів куп такий:

- Припустимо повне двійкове дерево. Це означає, що масив повинен бути заповнений в кінці порожніми місцями, якщо це необхідно. Загальна кількість вузлів повної купи становить 1, або 3, або 7, або 15, або 31 тощо.; продовжуйте подвоювати і додавати 1.

- Помістіть вузол у найбільш підходяще порожнє місце за величиною, до кінця купи (до кінця масиву купи). Якщо немає порожнього місця, розпочніть новий рядок знизу ліворуч.

- Просійте, якщо це необхідно, поки властивість купи не буде задоволено.

витяг_макс (витяг_мин)

Знайдіть максимальне значення в масиві max-heap, видаліть і поверніть його; або знайдіть мінімальне значення в масиві min-heap, видаліть і поверніть його. Алгоритм витягування_max (extract_min) такий:

- Видаліть кореневий вузол.

- Візьміть (видаліть) самий нижній вузол (останній вузол у масиві) і розмістіть у корені.

- Просійте за необхідністю, доки не буде задоволено властивість купи.

delete_max (delete_min)

Знайдіть кореневий вузол max-heap, який є першим елементом масиву max-heap, видаліть його, не обов'язково повертаючи; або знайдіть кореневий вузол min-heap, який є першим елементом масиву min-heap, видаліть його, не обов'язково повертаючи. Алгоритм видалення кореневого вузла такий:

- Видаліть кореневий вузол.

- Візьміть (видаліть) самий нижній вузол (останній вузол у масиві) і розмістіть у корені.

- Просійте за необхідністю, поки властивість купи не буде задоволено.

замінити

Знайдіть кореневий вузол будь-якої купи, видаліть його та замініть новим. Не має значення, чи буде повернено старий корінь. Просійте, якщо це доречно, поки не буде задоволено властивість купи.

Внутрішні операції купи

збільшити_ключ (зменшити_ключ)

Збільште значення будь-якого вузла для max-heap і переставляйте так, щоб властивість купи зберігалося, або зменште значення будь-якого вузла для min-heap і переставляйте так, щоб властивість heap зберігалася. Просійте вгору або вниз відповідно, поки властивість купи не буде задоволена.

видалити

Видаліть вузол, що цікавить, а потім переставіть так, щоб властивість купи зберігалася для max-heap або min-heap. Алгоритм видалення вузла такий:

- Видаліть вузол, що цікавить.

- Візьміть (видаліть) крайній правий нижній вузол (останній вузол у масиві) і поставте в індекс видаленого вузла. Якщо вузол, який видалено, знаходиться в останньому рядку, то це може не знадобитися.

- Просійте вгору або вниз відповідно, поки властивість купи не буде задоволена.

shift_up

Перемістіть вузол вгору в max-heap або min-heap стільки часу, скільки потрібно, переставляючи, щоб зберегти властивість купи - просіяти.

shift_down

Перемістіть вузол донизу в max-heap або min-heap скільки завгодно, переставляючи, щоб зберегти властивість купи - просіяти.

Огляд купи

розмір

Дивись вище!

пусто

Дивись вище!

Інші класи купи

Купу, описану в цій статті, можна розглядати як основну (загальну) купу. Існують і інші класи купи. Однак, два, які ви повинні знати, крім цього, - це двійкова куча та денна купа.

Двійкова купа

Бінарна купа схожа на цю основну купу, але має більше обмежень. Зокрема, двійкова купа повинна бути цілим деревом. Не плутайте між цілим деревом і повним деревом.

д-арна Купа

Бінарна купа - це 2-арна купа. Купи, де кожен вузол має по 3 дитини, - це 3-арна купа. Купа, де кожен вузол має 4 дітей, - це 4-арна купа тощо. Куча д-ар має інші обмеження.

Висновок

Купа - це повне або майже повне бінарне дерево, яке задовольняє властивості купи. Властивість купи має 2 альтернативи: для max-heap батько повинен бути рівним або більшим за значенням, ніж безпосередні діти; для мінімальної купи батько повинен бути рівним або меншим за вартістю, ніж безпосередні діти. Купа може бути представлена ​​у вигляді дерева або масиву. При поданні в масиві кореневий вузол є першим вузлом масиву; і якщо вузол має індекс n, його перша дочірня частина в масиві має індекс 2n + 1, а його наступна дочірня частина - індекс 2n + 2. Куча має певні операції, які виконуються над масивом.

Кріс

Підручник Тінь розкрадача гробниць для Linux
Shadow of the Tomb Raider - дванадцяте доповнення до серії Tomb Raider - франшизи екшн-пригодницької гри, створеної Eidos Montreal. Гру сприйняли як к...
Як збільшити FPS в Linux?
FPS означає Кадри в секунду. Завданням FPS є вимірювання частоти кадрів при відтворенні відео або ігрових виставах. Простими словами кількість безпере...
Найкращі лабораторні ігри Oculus App
Якщо ви є власником гарнітури Oculus, то вам потрібно дізнатися про бокове завантаження. Бокове завантаження - це процес встановлення негарнітного вмі...