Sebuah tumpukan , juga dikenal sebagai prioritas-antrian, adalah jenis data abstrak. Secara konseptual, itu adalah pohon biner di mana anak-anak dari setiap simpul lebih kecil dari atau sama dengan simpul itu sendiri. (Dengan asumsi itu adalah heap-max.) Ketika sebuah elemen didorong atau muncul, heap mengatur ulang dirinya sendiri sehingga elemen terbesar adalah yang berikutnya muncul. Ini dapat dengan mudah diimplementasikan sebagai pohon atau sebagai array
Tantangan Anda, jika Anda memilih untuk menerimanya, adalah menentukan apakah array adalah tumpukan yang valid. Array dalam bentuk heap jika anak-anak setiap elemen lebih kecil dari atau sama dengan elemen itu sendiri. Ambil array berikut sebagai contoh:
[90, 15, 10, 7, 12, 2]
Sungguh, ini adalah pohon biner yang disusun dalam bentuk array. Ini karena setiap elemen punya anak. 90 memiliki dua anak, 15 dan 10.
15, 10,
[(90), 7, 12, 2]
15 juga memiliki anak, 7 dan 12:
7, 12,
[90, (15), 10, 2]
10 memiliki anak:
2
[90, 15, (10), 7, 12, ]
dan elemen berikutnya juga akan menjadi anak 10, kecuali bahwa tidak ada ruang. 7, 12 dan 2 semuanya juga akan memiliki anak jika array cukup panjang. Berikut ini contoh lain dari heap:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Dan di sini adalah visualisasi pohon yang dibuat oleh array sebelumnya:
Kalau-kalau ini tidak cukup jelas, berikut adalah rumus eksplisit untuk mendapatkan anak-anak dari elemen ke-i
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
Anda harus mengambil array yang tidak kosong sebagai input dan output nilai kebenaran jika array berada di urutan tumpukan, dan nilai yang salah sebaliknya. Ini bisa berupa tumpukan berindeks 0, atau tumpukan berindeks 1 selama Anda menentukan format program / fungsi yang Anda harapkan. Anda dapat mengasumsikan bahwa semua array hanya akan mengandung bilangan bulat positif. Anda tidak boleh menggunakan heap-builtin. Ini termasuk, tetapi tidak terbatas pada
- Fungsi yang menentukan apakah array dalam bentuk heap
- Fungsi yang mengubah array menjadi heap atau menjadi heap-form
- Fungsi yang mengambil array sebagai input dan mengembalikan struktur data tumpukan
Anda dapat menggunakan skrip python ini untuk memverifikasi apakah array dalam bentuk heap atau tidak (0 diindeks):
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
Tes IO:
Semua input ini harus mengembalikan 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]
Dan semua input ini harus mengembalikan 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]
Seperti biasa, ini adalah kode-golf, sehingga celah standar berlaku dan jawaban terpendek dalam byte menang!
[3, 2, 1, 1]
?