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]
?Antworten:
Gelee,
1195 Bytes4 Bytes entfernt dank Dennis!
Probieren Sie es hier aus.
Erläuterung
quelle
JavaScript (ES6),
34-30ByteEdit: Das Korrigieren meines Codes für die Spezifikationsklärung kostet 1 Byte, also danke an @ edc65 für die Einsparung von 4 Byte.
quelle
[93, 15, 87, 7, 15, 5]
und 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 Bytes
oder
quelle
J, 24 Bytes
Erläuterung
quelle
MATL ,
13 -12 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Ein Array ist wahr, wenn es nicht leer ist und alle seine Einträge ungleich Null sind. Sonst ist es falsch. Hier sind einige Beispiele .
Erläuterung
quelle
Python 2, 45 Bytes
Gibt 0 für Falsy und ungleich 0 für Truthy aus.
Überprüft, ob das letzte Element am Index kleiner oder gleich dem übergeordneten Element ist
len(l)/2-1
. Überprüfen Sie anschließend erneut, ob der Wert True ist, und entfernen Sie das letzte Element der Liste usw., bis die Liste leer ist.48 Bytes:
Überprüft, ob
i
das Element an jedem Index höchstens das übergeordnete Element am Index ist(i-1)/2
. Ist dies nicht der Fall, erzeugt die Flächenteilung 0.Tun Sie das Basisgehäuse wie
i/len(l)or
ergibt die gleiche Länge. Ich hatte zuerst versucht zu zippen, bekam aber einen längeren Code (57 Bytes).quelle
R
97 8882 BytesHoffentlich habe ich das richtig verstanden. Nun, um zu sehen, ob ich noch ein paar Bytes loswerden kann. Hat die Bindung aufgegeben und einen sapply eingefügt und 1-basierten Vektor richtig behandelt.
Als unbenannte Funktion implementiert
Mit einigen Testfällen
quelle
seq(Y)
anstelle von verwenden1:length(Y)
.CJam,
19161312 BytesAb 3 Bytes dank Dennis golfen.
Probieren Sie es hier aus.
quelle
Pyth, 8 Bytes
Probieren Sie es online aus
quelle
Netzhaut , 51 Bytes
Probieren Sie es online!
Nimmt eine durch Leerzeichen getrennte Liste von Zahlen als Eingabe. Ausgänge
1
/0
für wahr / falschquelle
C ++ 14,
134105 BytesMuss
c
ein Container sein, der.operator[](int)
und.size()
dergleichen stütztstd::vector<int>
.Ungolfed:
Könnte kleiner sein, wenn truthy =
0
und falsy =1
erlaubt wären.quelle
R, 72 Bytes
Ein etwas anderer Ansatz als die andere R-Antwort .
Liest die Eingabe von stdin, erstellt einen Vektor aller Vergleichspaare, subtrahiert sie voneinander und prüft, ob das Ergebnis eine negative Zahl oder Null ist.
Erläuterung
Eingaben von stdin lesen:
Kreieren Sie unsere Paare. Wir erstellen Indizes von
1...N
(wobeiN
die Länge von istx
) für die übergeordneten Knoten. Wir nehmen dies zweimal, da jeder Elternteil (maximal) zwei Kinder hat. Wir nehmen auch die Kinder,(1...N)*2
und(1...N)*2+1
. Für Indizes, die länger als sindx
, gibt RNA
"nicht verfügbar" zurück. Zur Eingabe90 15 10 7 12 2
gibt uns dieser Code90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.In diesem Vektor von Paaren hat jedes Element seinen Partner in einem Abstand von
N*2
Entfernung. Zum Beispiel befindet sich der Partner von Punkt 1 auf Position 12 (6 * 2). Wir verwendendiff
, um die Differenz zwischen diesen Paaren zu berechnen, und gebenlag=N*2
an, um die Artikel mit ihren richtigen Partnern zu vergleichen. Alle Operationen anNA
Elementen kehren einfach zurückNA
.Abschließend prüfen wir, ob alle diese zurückgegebenen Werte kleiner sind als
1
(dh, dass die erste Zahl, das übergeordnete Element, größer war als die zweite Zahl, das untergeordnete Element)NA
Werte von der Berücksichtigung ausgeschlossen werden.quelle
Tatsächlich 16 Bytes
Diese Antwort basiert größtenteils auf der Jelly-Antwort von jimmy23013 . Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle