Купи , також відомі як пріоритетна чергу, це абстрактний тип даних. Концептуально це двійкове дерево, де діти кожного вузла менші або рівні самій вузлу. (Якщо припустити, що це макс-купа.) Коли елемент висувається або вискакується, купа переставляє себе, щоб найбільшим елементом був наступний, який повинен вискочити. Він може бути легко реалізований у вигляді дерева або як масив.
Якщо ви вирішите її прийняти, ваше завдання полягає в тому, щоб визначити, чи масив є дійсною купою. Масив складається в купі, якщо діти кожного елемента менші або рівні самій елементу. Візьмемо такий приклад:
[90, 15, 10, 7, 12, 2]
Дійсно, це двійкове дерево, розташоване у вигляді масиву. Це тому, що кожен елемент має дітей. У 90 є двоє дітей, 15 та 10 років.
15, 10,
[(90), 7, 12, 2]
15 також мають дітей 7 та 12 років:
7, 12,
[90, (15), 10, 2]
10 дітей:
2
[90, 15, (10), 7, 12, ]
і наступним елементом також буде дитина 10 років, за винятком того, що немає місця. 7, 12 і 2 також мали б дітей, якби масив був досить довгим. Ось ще один приклад купи:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Ось візуалізація дерева, який робить попередній масив:
На випадок, якщо це недостатньо зрозуміло, ось чітка формула, щоб дітям i-го елемента
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Ви повинні взяти не порожній масив як вхідний і вивести триєдне значення, якщо масив знаходиться в наборі, а помилкове значення - в іншому випадку. Це може бути 0-індексована купа або 1-індексована купа, поки ви вкажете, який формат очікує ваша програма / функція. Ви можете припустити, що всі масиви будуть містити лише додатні цілі числа. Ви не можете використовувати будь-які вбудовані купи. Це включає, але не обмежується цим
- Функції, які визначають, чи є масив у heap-формі
- Функції, які перетворюють масив у купу або у форму heap
- Функції, які приймають масив як вхідні дані і повертають структуру даних купи
Ви можете використовувати цей скрипт python, щоб перевірити, чи масив знаходиться у купі-формі чи ні (0 індексовано):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
Тест IO:
Усі ці входи повинні повернути True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
І всі ці входи повинні повертати помилкові:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
Як завжди, це код-гольф, тому застосовуються стандартні лазівки і найкоротша відповідь у байтах виграє!
[3, 2, 1, 1]
?