Um heap , também conhecido como fila de prioridade, é um tipo de dados abstrato. Conceitualmente, é uma árvore binária em que os filhos de cada nó são menores ou iguais ao próprio nó. (Supondo que seja um heap máximo.) Quando um elemento é pressionado ou populado, o heap se reorganiza para que o elemento maior seja o próximo a ser popped. Pode ser facilmente implementado como uma árvore ou como uma matriz.
Seu desafio, se você optar por aceitá-lo, é determinar se uma matriz é uma pilha válida. Uma matriz está no formato heap se os filhos de cada elemento forem menores ou iguais ao próprio elemento. Tome a seguinte matriz como exemplo:
[90, 15, 10, 7, 12, 2]
Realmente, essa é uma árvore binária organizada na forma de uma matriz. Isso ocorre porque todo elemento tem filhos. 90 tem dois filhos, 15 e 10.
15, 10,
[(90), 7, 12, 2]
15 também tem filhos, 7 e 12:
7, 12,
[90, (15), 10, 2]
10 tem filhos:
2
[90, 15, (10), 7, 12, ]
e o próximo elemento também seria um filho de 10 anos, exceto que não há espaço. 7, 12 e 2 também teriam filhos se a matriz fosse longa o suficiente. Aqui está outro exemplo de pilha:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
E aqui está uma visualização da árvore que a matriz anterior faz:
Caso isso não esteja claro o suficiente, aqui está a fórmula explícita para obter os filhos do i-ésimo elemento
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Você deve usar uma matriz não vazia como entrada e gerar um valor verdadeiro se a matriz estiver na ordem da pilha e, caso contrário, um valor falso. Pode ser um heap indexado 0 ou um heap indexado 1, desde que você especifique qual formato seu programa / função espera. Você pode assumir que todas as matrizes conterão apenas números inteiros positivos. Você não pode usar nenhum heap-builtins. Isso inclui, mas não está limitado a
- Funções que determinam se uma matriz está no formato heap
- Funções que convertem uma matriz em uma pilha ou em forma de pilha
- Funções que tomam uma matriz como entrada e retornam uma estrutura de dados de heap
Você pode usar este script python para verificar se uma matriz está no formato heap ou não (0 indexado):
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
Teste de E / S:
Todas essas entradas devem retornar 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]
E todas essas entradas devem retornar 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]
Como de costume, isso é código-golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes vence!
[3, 2, 1, 1]
?