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]
?Jawaban:
Jeli,
1195 byte4 byte dihapus berkat Dennis!
Coba di sini.
Penjelasan
sumber
JavaScript (ES6),
3430 byteSunting: Memperbaiki kode saya untuk biaya klarifikasi spesifikasi 1 byte, jadi terima kasih kepada @ edc65 karena menghemat 4 byte.
sumber
[93, 15, 87, 7, 15, 5]
dan 6[5, 5, 5, 5, 5, 5, 5, 5]
a=>!a.some((e,i)=>e>a[i-1>>1])
Haskell, 33 byte
atau
sumber
J, 24 byte
Penjelasan
sumber
MATL ,
1312 byteCobalah online! Atau verifikasi semua kasus uji .
Array benar jika tidak kosong dan semua entri adalah nol. Kalau tidak, itu palsu. Berikut ini beberapa contohnya .
Penjelasan
sumber
Python 2, 45 byte
Output 0 untuk Falsy, bukan nol untuk Truthy.
Periksa bahwa elemen terakhir kurang dari atau sama dengan induknya di indeks
len(l)/2-1
. Kemudian, berulang untuk memeriksa bahwa hal yang sama adalah Benar dengan elemen terakhir dari daftar dihapus, dan seterusnya hingga daftar kosong.48 byte:
Cek di setiap indeks
i
, elemen paling banyak adalah induknya di indeks(i-1)/2
. Divisi lantai menghasilkan 0 jika ini bukan masalahnya.Melakukan casing dasar karena
i/len(l)or
memberikan panjang yang sama. Saya telah mencoba zip pada awalnya, tetapi mendapat kode yang lebih panjang (57 byte).sumber
R,
97 8882 byteSemoga saya mengerti ini dengan benar. Sekarang untuk melihat apakah saya bisa menghilangkan beberapa byte lagi. Membuang rbind dan memasukkan sapply dan menangani vektor berbasis 1 dengan benar.
Diimplementasikan sebagai fungsi yang tidak disebutkan namanya
Dengan beberapa kasus uji
sumber
seq(Y)
bukan1:length(Y)
.CJam,
19161312 byteGolf 3 byte berkat Dennis.
Coba di sini.
sumber
Pyth, 8 byte
Cobalah online
sumber
Retina , 51 byte
Cobalah online!
Mengambil daftar angka yang dipisahkan ruang sebagai input. Keluaran
1
/0
untuk kebenaran / salahsumber
C ++ 14,
134105 bytePerlu
c
menjadi wadah pendukung.operator[](int)
dan.size()
, sepertistd::vector<int>
.Tidak Disatukan:
Bisa lebih kecil jika truthy =
0
dan falsy =1
diizinkan.sumber
R, 72 byte
Pendekatan yang sedikit berbeda dari jawaban R lainnya .
Membaca input dari stdin, membuat vektor semua pasangan pembanding, menguranginya satu sama lain, dan memeriksa bahwa hasilnya adalah angka negatif atau nol.
Penjelasan
Baca input dari stdin:
Buat pasangan kami. Kami membuat indeks
1...N
(di manaN
panjangnyax
) untuk node induk. Kami mengambil ini dua kali karena setiap orang tua memiliki (maksimal) dua anak. Kami juga membawa anak-anak,(1...N)*2
dan(1...N)*2+1
. Untuk indeks yang melebihi panjangx
, R mengembalikanNA
, 'tidak tersedia'. Untuk input90 15 10 7 12 2
, kode ini memberi kita90 15 10 7 12 2 90 15 10 7 12 2 15 7 2 NA NA NA 10 12 NA NA NA NA
.Dalam vektor pasangan ini, setiap elemen memiliki pasangannya pada jarak yang
N*2
jauh. Misalnya, mitra item 1 terletak di posisi 12 (6 * 2). Kami menggunakandiff
untuk menghitung perbedaan antara pasangan ini, menentukanlag=N*2
untuk membandingkan item dengan mitra yang benar. Operasi apa pun padaNA
elemen cukup kembaliNA
.Akhirnya, kami memeriksa bahwa semua nilai yang dikembalikan ini kurang dari
1
(yaitu bahwa angka pertama, orang tua, lebih besar dari angka kedua, anak), tidak termasukNA
nilai dari pertimbangan.sumber
Sebenarnya , 16 byte
Jawaban ini sebagian besar didasarkan pada jawaban Jelly jimmy23013 . Selamat datang saran bermain golf! Cobalah online!
Tidak melakukanolf
sumber