Кучи , также известные как приоритетная очередь, это абстрактный тип данных. Концептуально это двоичное дерево, в котором дочерние элементы каждого узла меньше или равны самому узлу. (Предполагая, что это максимальная куча.) Когда элемент перемещается или выталкивается, куча перестраивается, так что самый большой элемент - следующий. Его легко реализовать в виде дерева или массива.
Ваша задача, если вы решите принять ее, - определить, является ли массив допустимой кучей. Массив находится в форме кучи, если дочерние элементы каждого элемента меньше или равны самому элементу. Возьмите следующий массив в качестве примера:
[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 индексом, если вы указываете, какой формат ожидает ваша программа / функция. Вы можете предположить, что все массивы будут содержать только положительные целые числа. Вы не можете использовать какие-либо кучи. Это включает, но не ограничивается
- Функции, которые определяют, находится ли массив в форме кучи
- Функции, которые преобразуют массив в кучу или в форму кучи
- Функции, которые принимают массив в качестве входных данных и возвращают структуру данных кучи
Вы можете использовать этот скрипт 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]
И все эти входные данные должны возвращать False:
[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]
?