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]
?Respostas:
Geléia,
1195 bytes4 bytes removidos graças a Dennis!
Experimente aqui.
Explicação
fonte
JavaScript (ES6),
3430 bytesEdit: A correção do meu código para o esclarecimento das especificações custa 1 byte, por isso, obrigado a @ edc65 por economizar 4 bytes.
fonte
[93, 15, 87, 7, 15, 5]
e 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 bytes
ou
fonte
J, 24 bytes
Explicação
fonte
MATL ,
1312 bytesExperimente online! Ou verifique todos os casos de teste .
Uma matriz é verdadeira se não estiver vazia e todas as suas entradas forem diferentes de zero. Caso contrário, é falso. Aqui estão alguns exemplos .
Explicação
fonte
Python 2, 45 bytes
Saídas 0 para Falsy, diferente de zero para Truthy.
Verifica se o último elemento é menor ou igual ao seu pai no índice
len(l)/2-1
. Em seguida, é repetido para verificar se o mesmo é True com o último elemento da lista removido e assim por diante até que a lista esteja vazia.48 bytes:
Verifica se, em cada índice
i
, o elemento é no máximo seu pai no índice(i-1)/2
. A divisão de piso produz 0 se esse não for o caso.Fazendo o estojo de base,
i/len(l)or
dá o mesmo comprimento. Eu tentei compactar no começo, mas obtive um código mais longo (57 bytes).fonte
R,
97 8882 bytesEspero ter entendido isso corretamente. Agora, para ver se consigo me livrar de mais alguns bytes. Abandonei o rbind e coloquei um sapply e lide adequadamente com o vetor baseado em 1.
Implementado como uma função sem nome
Com alguns dos casos de teste
fonte
seq(Y)
vez de1:length(Y)
.CJam,
19161312 bytesGolpeou 3 bytes graças a Dennis.
Experimente aqui.
fonte
Pitão, 8 bytes
Experimente online
fonte
Retina , 51 bytes
Experimente online!
Leva uma lista de números separados por espaço como entrada. Saídas
1
/0
para verdade / falsefonte
C ++ 14,
134105 bytesRequer
c
ser um contêiner suportando.operator[](int)
e.size()
, comostd::vector<int>
.Ungolfed:
Pode ser menor se truthy =
0
e falsy =1
forem permitidos.fonte
R, 72 bytes
Uma abordagem ligeiramente diferente da outro resposta R .
Lê a entrada do stdin, cria um vetor de todos os pares de comparação, subtrai-os um do outro e verifica se o resultado é um número negativo ou zero.
Explicação
Leia a entrada do stdin:
Crie nossos pares. Criamos índices de
1...N
(ondeN
é o comprimento dex
) para os nós principais. Tomamos isso duas vezes, pois cada pai ou mãe tem (no máximo) dois filhos. Também levamos as crianças(1...N)*2
e(1...N)*2+1
. Para índices além do comprimento dex
, R retornaNA
, 'não disponível'. Para entrada90 15 10 7 12 2
, esse código nos fornece90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.Neste vetor de pares, cada elemento tem seu parceiro a uma distância
N*2
distante. Por exemplo, o parceiro do item 1 está localizado na posição 12 (6 * 2). Usamosdiff
para calcular a diferença entre esses pares, especificandolag=N*2
para comparar os itens com seus parceiros corretos. Quaisquer operações nosNA
elementos simplesmente retornamNA
.Por fim, verificamos que todos esses valores retornados são menores que
1
(ou seja, que o primeiro número, o pai, seja maior que o segundo número, o filho), excluindoNA
valores da consideração.fonte
Na realidade , 16 bytes
Esta resposta é baseada principalmente na resposta de jimmy23013 Jelly . Sugestões de golfe são bem-vindas! Experimente online!
Ungolfing
fonte