Un montón , también conocido como cola prioritaria, es un tipo de datos abstracto. Conceptualmente, es un árbol binario donde los hijos de cada nodo son más pequeños o iguales al nodo en sí. (Suponiendo que se trata de un montón máximo). Cuando se empuja o hace estallar un elemento, el montón se reorganiza, de modo que el elemento más grande es el siguiente en aparecer. Se puede implementar fácilmente como un árbol o como una matriz.
Su desafío, si elige aceptarlo, es determinar si una matriz es un montón válido. Una matriz está en forma de montón si los elementos secundarios de cada elemento son más pequeños o iguales que el elemento mismo. Tome la siguiente matriz como ejemplo:
[90, 15, 10, 7, 12, 2]
Realmente, este es un árbol binario dispuesto en forma de matriz. Esto se debe a que cada elemento tiene hijos. 90 tiene dos hijos, 15 y 10.
15, 10,
[(90), 7, 12, 2]
15 también tiene hijos, 7 y 12:
7, 12,
[90, (15), 10, 2]
10 tiene hijos:
2
[90, 15, (10), 7, 12, ]
y el siguiente elemento también sería un niño de 10 años, excepto que no hay espacio. 7, 12 y 2 también tendrían hijos si la matriz fuera lo suficientemente larga. Aquí hay otro ejemplo de un montón:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Y aquí hay una visualización del árbol que hace la matriz anterior:
En caso de que esto no sea lo suficientemente claro, aquí está la fórmula explícita para obtener los elementos secundarios del elemento i
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Debe tomar una matriz no vacía como entrada y salida de un valor verdadero si la matriz está en orden de almacenamiento dinámico, y un valor falso de lo contrario. Esto puede ser un montón indexado 0 o un montón indexado 1 siempre que especifique qué formato espera su programa / función. Puede suponer que todas las matrices solo contendrán enteros positivos. Puedes no se utilice ningún heap-órdenes internas. Esto incluye, pero no se limita a
- Funciones que determinan si una matriz está en forma de montón
- Funciones que convierten una matriz en un montón o en forma de montón
- Funciones que toman una matriz como entrada y devuelven una estructura de datos de montón
Puede usar este script de Python para verificar si una matriz está en forma de montón o no (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
Prueba IO:
Todas estas entradas deberían devolver 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]
Y todas estas entradas deberían devolver 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 costumbre, este es el código de golf, por lo que se aplican las lagunas estándar y gana la respuesta más corta en bytes.
[3, 2, 1, 1]
?