Ein Heap , auch Prioritätswarteschlange genannt, ist ein abstrakter Datentyp. Konzeptionell handelt es sich um einen Binärbaum, bei dem die untergeordneten Elemente jedes Knotens kleiner oder gleich dem Knoten selbst sind. (Angenommen, es ist ein maximaler Heap.) Wenn ein Element verschoben oder verschoben wird, wird der Heap selbst neu angeordnet, sodass das größte Element das nächste ist, das verschoben wird. Es kann leicht als Baum oder als Array implementiert werden.
Wenn Sie dies akzeptieren möchten, müssen Sie feststellen, ob ein Array ein gültiger Heap ist. Ein Array hat die Form eines Heapspeichers, wenn die untergeordneten Elemente jedes Elements kleiner oder gleich dem Element selbst sind. Nehmen Sie das folgende Array als Beispiel:
[90, 15, 10, 7, 12, 2]
In Wirklichkeit ist dies ein binärer Baum, der in Form eines Arrays angeordnet ist. Dies liegt daran, dass jedes Element Kinder hat. 90 hat zwei Kinder, 15 und 10.
15, 10,
[(90), 7, 12, 2]
15 hat auch Kinder, 7 und 12:
7, 12,
[90, (15), 10, 2]
10 hat Kinder:
2
[90, 15, (10), 7, 12, ]
und das nächste Element wäre auch ein Kind von 10 Jahren, außer dass es keinen Platz gibt. 7, 12 und 2 hätten auch Kinder, wenn das Array lang genug wäre. Hier ist ein weiteres Beispiel für einen Haufen:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Und hier ist eine Visualisierung des Baums, den das vorherige Array erstellt:
Nur für den Fall, dass dies nicht klar genug ist, finden Sie hier die explizite Formel, um die untergeordneten Elemente des i'th-Elements abzurufen
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Sie müssen ein nicht leeres Array als Eingabe verwenden und einen Wahrheitswert ausgeben, wenn sich das Array in der Heap-Reihenfolge befindet, andernfalls einen falschen Wert. Dies kann ein 0-indizierter Heap oder ein 1-indizierter Heap sein, solange Sie angeben, welches Format Ihr Programm / Ihre Funktion erwartet. Sie können davon ausgehen, dass alle Arrays nur positive ganze Zahlen enthalten. Sie können nicht alle heap-builtins verwenden. Dies schließt ein, ist aber nicht darauf beschränkt
- Funktionen, die bestimmen, ob ein Array in Heap-Form vorliegt
- Funktionen, die ein Array in einen Heap oder in eine Heap-Form konvertieren
- Funktionen, die ein Array als Eingabe nehmen und eine Heap-Datenstruktur zurückgeben
Mit diesem Python-Skript können Sie überprüfen, ob ein Array in Heap-Form vorliegt oder nicht (0 indiziert):
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:
Alle diese Eingaben sollten True zurückgeben:
[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]
Und all diese Eingaben sollten False zurückgeben:
[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]
Wie üblich ist dies Codegolf, daher gelten Standardlücken und die kürzeste Antwort in Bytes gewinnt!
[3, 2, 1, 1]
?