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]
?Respuestas:
Jalea,
119 95 bytes¡4 bytes eliminados gracias a Dennis!
Pruébalo aquí.
Explicación
fuente
JavaScript (ES6),
3430 bytesEditar: arreglar mi código para la aclaración de especificaciones costó 1 byte, así que gracias a @ edc65 por guardar 4 bytes.
fuente
[93, 15, 87, 7, 15, 5]
y 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 bytes
o
fuente
J, 24 bytes
Explicación
fuente
MATL ,
1312 bytesPruébalo en línea! O verificar todos los casos de prueba .
Una matriz es verdadera si no está vacía y todas sus entradas son distintas de cero. De lo contrario, es falso. Aquí hay algunos ejemplos. .
Explicación
fuente
Python 2, 45 bytes
Salidas 0 para Falsy, distintas de cero para Truthy.
Comprueba que el último elemento es menor o igual que su padre en el índice
len(l)/2-1
. Luego, vuelve a comprobar que lo mismo es Verdadero con el último elemento de la lista eliminado, y así sucesivamente hasta que la lista esté vacía.48 bytes:
Comprueba que en cada índice
i
, el elemento es como máximo su padre en el índice(i-1)/2
. La división de piso produce 0 si este no es el caso.Hacer el caso base como
i/len(l)or
da la misma longitud. Al principio intenté comprimir, pero obtuve un código más largo (57 bytes).fuente
R,
97 8882 bytesEspero haber entendido esto correctamente. Ahora para ver si puedo deshacerme de algunos bytes más. Eliminó el rbind y colocó una muestra y lidió con el vector basado en 1 correctamente.
Implementado como una función sin nombre
Con algunos de los casos de prueba.
fuente
seq(Y)
lugar de1:length(Y)
.CJam,
19dieciséis1312 bytesGolfed 3 bytes gracias a Dennis.
Pruébalo aquí.
fuente
Pyth, 8 bytes
Pruébalo en línea
fuente
Retina , 51 bytes
Pruébalo en línea!
Toma una lista de números separados por espacios como entrada. Salidas
1
/0
para verdad / falsofuente
C ++ 14,
134105 bytesRequiere
c
ser un contenedor de soporte.operator[](int)
y.size()
, comostd::vector<int>
.Sin golf:
Podría ser más pequeño si se permitiera la verdad =
0
y la falsedad =1
.fuente
R, 72 bytes
Un enfoque ligeramente diferente de la otra respuesta R .
Lee la entrada de stdin, crea un vector de todos los pares de comparación, los resta entre sí y verifica que el resultado sea un número negativo o cero.
Explicación
Leer la entrada de stdin:
Crea nuestras parejas. Creamos índices de
1...N
(dondeN
es la longitud dex
) para los nodos principales. Tomamos esto dos veces ya que cada padre tiene (como máximo) dos hijos. También tomamos a los niños,(1...N)*2
y(1...N)*2+1
. Para índices más allá de la longitud dex
, R devuelveNA
, 'no disponible'. Para la entrada90 15 10 7 12 2
, este código nos da90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.En este vector de pares, cada elemento tiene su compañero a una distancia de
N*2
distancia. Por ejemplo, el compañero del elemento 1 se encuentra en la posición 12 (6 * 2). Usamosdiff
para calcular la diferencia entre estos pares, especificandolag=N*2
para comparar los artículos con sus socios correctos. Cualquier operación enNA
elementos simplemente regresaNA
.Finalmente, verificamos que todos estos valores devueltos sean menores que
1
(es decir, que el primer número, el padre, era mayor que el segundo número, el hijo), excluyendo losNA
valores de la consideración.fuente
En realidad , 16 bytes
Esta respuesta se basa en gran medida en la respuesta Jelly de jimmy23013 . Sugerencias de golf bienvenidas! Pruébalo en línea!
No golfista
fuente