Un tas , également appelé file d'attente prioritaire, est un type de données abstrait. Conceptuellement, c'est un arbre binaire où les enfants de chaque nœud sont inférieurs ou égaux au nœud lui-même. (En supposant qu'il s'agit d'un tas max.) Lorsqu'un élément est poussé ou sauté, le tas se réorganise de sorte que le plus grand élément soit le prochain à sauter. Il peut facilement être implémenté sous forme d'arbre ou de tableau.
Votre défi, si vous choisissez de l'accepter, est de déterminer si un tableau est un tas valide. Un tableau est sous forme de tas si les enfants de chaque élément sont inférieurs ou égaux à l'élément lui-même. Prenons l'exemple du tableau suivant:
[90, 15, 10, 7, 12, 2]
En réalité, il s'agit d'un arbre binaire disposé sous la forme d'un tableau. C'est parce que chaque élément a des enfants. 90 a deux enfants, 15 et 10 ans.
15, 10,
[(90), 7, 12, 2]
15 a également des enfants, 7 et 12 ans:
7, 12,
[90, (15), 10, 2]
10 a des enfants:
2
[90, 15, (10), 7, 12, ]
et l'élément suivant serait également un enfant de 10 ans, sauf qu'il n'y a pas de place. 7, 12 et 2 auraient tous aussi des enfants si la matrice était suffisamment longue. Voici un autre exemple de tas:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Et voici une visualisation de l'arbre que fait le tableau précédent:
Juste au cas où ce ne serait pas assez clair, voici la formule explicite pour obtenir les enfants du ième élément
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Vous devez prendre un tableau non vide en entrée et générer une valeur véridique si le tableau est dans l'ordre du segment de mémoire et une valeur fausse dans le cas contraire. Cela peut être un tas indexé 0 ou un tas indexé 1 tant que vous spécifiez le format que votre programme / fonction attend. Vous pouvez supposer que tous les tableaux ne contiendront que des entiers positifs. Vous ne pouvez pas utiliser de commandes intégrées au tas. Cela comprend, mais sans s'y limiter
- Fonctions qui déterminent si un tableau est sous forme de segment de mémoire
- Fonctions qui convertissent un tableau en tas ou en forme de tas
- Fonctions qui prennent un tableau en entrée et retournent une structure de données de tas
Vous pouvez utiliser ce script python pour vérifier si un tableau est en forme de tas ou non (0 indexé):
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
Test IO:
Toutes ces entrées doivent renvoyer 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]
Et toutes ces entrées doivent retourner 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]
Comme d'habitude, il s'agit de code-golf, donc les failles standard s'appliquent et la réponse la plus courte en octets gagne!
[3, 2, 1, 1]
?