Öncelik kuyruğu olarak da bilinen bir yığın , soyut bir veri türüdür. Kavramsal olarak, her düğümün çocuklarının düğümün kendisinden daha küçük veya ona eşit olduğu ikili bir ağaçtır. (Bir maks-yığın olduğu varsayılarak.) Bir öğe itildiğinde veya patlatıldığında, yığın kendisini yeniden düzenler, böylece en büyük öğe patlatılacak bir sonraki öğedir. Kolayca ağaç veya dizi olarak uygulanabilir.
Eğer kabul ederseniz, meydan okuma, bir dizinin geçerli bir yığın olup olmadığını belirlemektir. Her öğenin alt öğeleri öğenin kendisinden küçük veya ona eşitse bir dizi yığın biçimindedir. Aşağıdaki diziyi örnek olarak alalım:
[90, 15, 10, 7, 12, 2]
Gerçekten, bu bir dizi şeklinde düzenlenmiş bir ikili ağaçtır. Çünkü her elementin çocukları vardır. 90'ın 15 ve 10 olmak üzere iki çocuğu vardır.
15, 10,
[(90), 7, 12, 2]
15'in ayrıca 7 ve 12 çocukları vardır:
7, 12,
[90, (15), 10, 2]
10 çocuk sahibi:
2
[90, 15, (10), 7, 12, ]
ve bir sonraki eleman da yer olmadığı için 10 kişilik bir çocuk olurdu. Dizi yeterince uzun olsaydı 7, 12 ve 2 de çocuk sahibi olurdu. Yığın başka bir örneği:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Ve işte önceki dizinin yaptığı ağacın bir görselleştirmesi:
Bunun yeterince açık olmaması durumunda, i'th elementinin çocuklarını elde etmek için açık formül
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Boş olmayan bir diziyi girdi olarak almalı ve dizi yığın düzenindeyse bir doğruluk değeri, aksi halde bir yanlış değeri vermelisiniz. Programınızın / işlevinizin hangi biçimi beklediğini belirlediğiniz sürece, 0 dizinli bir yığın veya 1 dizinli bir yığın olabilir. Tüm dizilerin yalnızca pozitif tamsayılar içereceğini varsayabilirsiniz. Sen olabilir değil herhangi yığın-yerleşiklerini kullanın. Bu, bunlarla sınırlı olmamak üzere
- Bir dizinin yığın biçiminde olup olmadığını belirleyen işlevler
- Bir diziyi bir öbeğe veya yığın biçimine dönüştüren işlevler
- Bir diziyi girdi olarak alan ve yığın veri yapısını döndüren işlevler
Bir dizinin yığın biçiminde olup olmadığını doğrulamak için bu python komut dosyasını kullanabilirsiniz (0 dizinli):
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 G / Ç:
Bu girdilerin tümü True döndürmelidir:
[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]
Ve tüm bu girdiler Yanlış döndürmelidir:
[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]
Her zamanki gibi, bu kod golf, bu yüzden standart boşluklar geçerlidir ve bayttaki en kısa cevap kazanır!
[3, 2, 1, 1]
?