Sterty , znany również jako priorytetów kolejce, to abstrakcyjny typ danych. Koncepcyjnie jest to drzewo binarne, w którym dzieci każdego węzła są mniejsze lub równe samemu węzłowi. (Zakładając, że jest to maksymalny stos.) Kiedy element jest popychany lub pękany, sterty układają się ponownie, tak aby największy element był następny. Można go łatwo wdrożyć jako drzewo lub tablicę.
Wyzwaniem, jeśli zdecydujesz się je zaakceptować, jest ustalenie, czy tablica jest prawidłową stertą. Tablica ma postać sterty, jeśli elementy potomne każdego elementu są mniejsze lub równe samemu elementowi. Weź jako przykład następującą tablicę:
[90, 15, 10, 7, 12, 2]
Naprawdę jest to drzewo binarne ułożone w formie tablicy. Jest tak, ponieważ każdy element ma dzieci. 90 ma dwoje dzieci, 15 i 10 lat.
15, 10,
[(90), 7, 12, 2]
15 ma również dzieci, 7 i 12:
7, 12,
[90, (15), 10, 2]
10 ma dzieci:
2
[90, 15, (10), 7, 12, ]
a następnym elementem będzie również dziecko w wieku 10 lat, z tym wyjątkiem, że nie ma miejsca. 7, 12 i 2 również miałyby dzieci, jeśli tablica była wystarczająco długa. Oto inny przykład sterty:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
A oto wizualizacja drzewa, którą tworzy poprzednia tablica:
Na wypadek, gdyby nie było to wystarczająco jasne, oto wyraźna formuła, aby uzyskać dzieci z i-tego elementu
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Musisz przyjąć niepustą tablicę jako dane wejściowe i wyprowadzić prawdziwą wartość, jeśli tablica jest w kolejności stosu, a w przeciwnym razie wartość fałsz. Może to być sterta o indeksie 0 lub sterta o indeksie 1, o ile określisz, jakiego formatu oczekuje Twój program / funkcja. Możesz założyć, że wszystkie tablice będą zawierać tylko dodatnie liczby całkowite. Być może nie stosować żadnych sterty pomocy poleceń wbudowanych. Obejmuje to między innymi
- Funkcje określające, czy tablica ma postać sterty
- Funkcje przekształcające tablicę w stertę lub w formę sterty
- Funkcje, które przyjmują tablicę jako dane wejściowe i zwracają strukturę danych sterty
Możesz użyć tego skryptu python, aby sprawdzić, czy tablica jest w formie stosu, czy nie (0 indeksowanych):
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:
Wszystkie te dane wejściowe powinny zwracać wartość 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]
Wszystkie te dane wejściowe powinny zwracać wartość 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]
Jak zwykle jest to gra w golfa, więc obowiązują standardowe luki i wygrywa najkrótsza odpowiedź w bajtach!
[3, 2, 1, 1]
?