heap
(Binary) Heap
• Binary tree yang menyimpan pasangan
prioritas (atau prioritas elemen) pada node
• Property Heap :
– Struktural
– Semua level kecuali yang terakhir berisi penuh, level terakhir boleh tidak penuh (berisi 1 anak) tetapi harus terisi.
– Heap
(Binary) Heap
1 1 1 7 1 3 1 8 2 1 1 9 1 7 4 3 2 3 2 6 2 9 3 1Bukan Heap
•
Heap Violated
1 1 1 9 1 3 1 8 2 1 1 9 1 7 4 2 2 2 3Bukan Heap
• Level terakhir
• Ada yang kosong
1 1 1 7 1 3 1 8 2 1 1 9 1 7 4 3 2 6 2 9 3 1
Menemukan elemen Terkecil
• Elemen dengan prioritas
terkecil
selalu
berada pada posisi
root
dalam
heap
• Hal ini karena jika tidak maka prioritas
tersebut akan menjadi
parent
dengan
prioritas
lebih kecil
dan hal ini
melanggar
heap property
Menemukan elemen Terkecil
Findmin(a[])
Height dari Heap
• Diberikan heap dengan n Node dan
ketinggian (height) h
• Recall: Complete Binary Tree dengan
Height h memiliki 2h+1-1 node
• Dengan demikian 2h-1<=2h+1-1
• n=
log2 h
Implementasi Heap
• Parent (i){return
i/2
}
• Left(i){return 2i}
• Right(i){rreturn 2i+1}
1 1 1 7 1 3 1 8 2 1 1 9 1 7 4 3 2 3 2 6 A 1 1 1 1 2 1 1 4 2 2 1 2 3 4 5 6 7 8 9 10 Parent(5) 2 (17) Left(3) 6 (19) Right(3) 7 17)Implementasi Heap
• Secara implisit tree dalam link, dengan
anak node i adalah 2i dan 2i+1
• Kenapa hal ini bermanfaat ?
– Dalam representasi binary , perkalian atau
pembagian dengan 2 merupakan pergeseran
ke kanan atau ke kiri (a** == shl(a) atau
a//==shr(a))
Penyisipan dalam Heap
• Sisipkan 12
1 1 1 7 1 3 1 8 2 1 1 7 4 3 2 3 2 6 2 9 3 1 Secara struktur maka kita akan tambahkan node12
Secara struktur sudah benar 19
Penyisipan dalam Heap
• Sisipkan 12
1 1 1 7 1 8 2 1 1 7 4 3 2 3 2 6 2 9 3 1 Secara struktur maka kita akan tambahkan node19
Secara struktur sudah benar 12
Penyisipan dalam Heap
• Sisipkan 12
• Sisipkan 8
1 1 1 7 1 8 2 1 4 3 2 3 2 6 2 9 3 1 19 12 13 8 17Penyisipan dalam Heap
• Sisipkan 12
• Sisipkan 8
1 1 1 7 1 8 2 1 4 2 2 2 3 19 12 13 17 8Penyisipan dalam Heap
• Sisipkan 12
• Sisipkan 8
1 7 1 8 2 1 4 3 2 3 2 6 2 9 3 1 19 12 8 17 13 11Penyisipan dalam Heap
• Sisipkan 12
• Sisipkan 8
1 7 1 8 2 1 4 2 2 2 3 19 12 11 17 13 8Cara menyisipkan lainnya
• Perbesar heap
1 1 1 7 1 3 1 8 2 1 1 7 4 3 2 3 2 6 2 9 3 1 19 12 Memakai jalur dari rootCara menyisipkan lainnya
• Perbesar heap
1 1 1 7 1 8 2 1 1 7 4 3 2 3 2 6 2 9 3 1 19 12 Memakai jalur dari rootUtk menyisipkan node Temukan elemen dengan prioritas tertinggi yang
lebih besar dari Elemen yang Akan di sisipkan
Cara menyisipkan lainnya
1 1 1 7 1 2 1 8 2 1 1 7 4 3 2 3 2 6 2 9 3 1 19 13Kebenaran Insertion
• Node yang isinya berubah berada pada
path
1 1 1 7 1 3 1 8 2 1 1 7 19 12
Kebenaran Insertion
• Node yang isinya berubah berada pada
path
• Heap property terlanggar hanya pada node
anak-nya
1 1 1 7 1 3 1 8 2 1 1 7 19 12Kebenaran Insertion
• Node yang isinya berubah berada pada
path
• Heap property terlanggar hanya pada node
anak-nya
• Isi yang baru berprioritas lebih kecil
dari sebelumnya
1 1 1 7 1 3 1 8 2 1 1 7 19 12Kebenaran Insertion
• Node yang isinya berubah berada pada
path
• Heap property terlanggar hanya pada node
anak-nya
• Isi yang baru berprioritas lebih kecil
dari sebelumnya
1 1 1 7 1 8 2 1 1 7 19 12 13Kebenaran Insertion
• Node yang isinya berubah berada pada
path
• Heap property terlanggar hanya pada node
anak-nya
• Isi yang baru berprioritas lebih kecil
dari sebelumnya
• Shg heap property aman
1 1 1 7 1 8 2 1 1 7 13 12
Heapify(i)
• i adalah index array A
• Binary tree yang berakar di Left(i) dan
Right(i) adalah
heap
• Tetapi, A[i] harus lebih besar dari
anaknya, sehingga terjadi violated pada
heap property
• Fungsi
Heapify
membuat binary tree
berakar di
i
pd heap dengan
Heapify
• Ini bukan heap
1 7 1 0 1 1 1 6 2 1 1 2 4 2 2 2 3 13
Heap property violated pada node dg index 1 tetapi Subtree pada akar 2 dan 3 adlaah heap
Cara kerja Heapify
• Heapify akan melihat dua anak dari root yang violated
• Memilih prioritas pada kedua
anak tersebut yang
terkecil
, lalu
menukar
dengan
rootnya
1 1 1 6 2 1 1 2 13 10 17Cara kerja Heapify
• Heapify akan melihat dua anak dari root yang violated
• Memilih prioritas pada kedua
anak tersebut yang
terkecil
, lalu
menukar
dengan
rootnya
1 1 2 1 1 2 13 17 10 16Cara kerja Heapify
• Heapify akan melihat dua anak dari root yang violated
• Memilih prioritas pada kedua
anak tersebut yang
terkecil
, lalu
menukar
dengan
rootnya
1 1 2 1 1 2 13 16 10 17Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke
bawah
1 7 1 0 1 1 1 6 2 1 1 2 13Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke
bawah
1 7 1 0 1 1 1 6 2 1 1 2 13Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke
bawah
• Node terakhir pada path (misal
j
)
memiliki baik A[left(
j
)], A[right(
j
)]
yang lebih besar dari A[i]
1 7 1 0 1 1 1 6 2 1 1 2 13
Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke bawah
• Node terakhir pada path (misal
j
) memiliki
baik A[left(
j
)], A[right(
j
)] yang lebih besar dari
A[i]
• Seluruh elemen path
Memiliki prioritas
lebih
kecil
dari
saudaranya
1 7 1 0 1 1 1 6 2 1 1 2 13
Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke bawah
• Node terakhir pada path (misal
j
) memiliki baik
A[left(
j
)], A[right(
j
)] yang lebih besar dari A[i]
• Seluruh elemen path
Memiliki prioritas
lebih
kecil
dari
saudaranya
• Seluruh elemen pd path ini
di pindahkan ke atas
1 1 2 1 1 2 13 17 10 16Cara kerja Heapify lainnya
• Heapify(i) melacak path tree ke bawah
• Node terakhir pada path (misal j) memiliki baik
A[left(
j
)], A[right(
j
)] yang lebih besar dari A[i]
• Seluruh elemen path
Memiliki prioritas lebih
kecil dari saudaranya
• Seluruh elemen pd path ini
di pindahkan ke atas
•
A[i] pindah ke posisi
j
1 1 2 1 1 2 13 17 10 16
Run Time Analisis
• Heap dengan n node mempunyai height
O(log n)
• Selama penyisipan kita harus
memindahkan elemen ke atas
• Dengan demikian setidaknya di perlukan
O(log n) langkah
Operasi Binary Heap
• Delete-Min
• Building heap dalam O(n) time
• Heapsort
Delete Minimum
• Elemen minimum adalah elemen pada top heap
• Kita dapat menghapus elemen tersebut dan
memindahkan anaknya ke atas untuk mengisi ruang
yang kosong karena penghapusan tadi
• Ruang yang kosong pada tree di pindahkan ke bawah
• Di akhiri pada setiap posisi pada akhir level
• Hasilnya tree menjadi tidak ada yang kosong pada akhir
levelnya
Delete-min dalam heap
8 1 0 11 1 8 2 1 1 2 4 3 23 26 29 31 13 19 17Delete-min dalam heap
1 0 11 1 8 2 1 1 2 4 3 23 26 29 31 13 19 17Delete-min dalam heap
1 0 11 1 8 2 1 1 2 4 3 23 26 29 31 13 19 17Delete-min dalam heap
1 1 1 8 2 1 1 2 4 3 23 26 29 31 13 19 17 10Delete-min dalam heap
1 1 1 8 2 1 1 2 4 3 23 26 29 31 13 19 17 10Delete-min dalam heap
1 1 2 1 1 2 4 3 23 26 29 31 13 19 17 10 18Delete-min dalam heap
1 1 2 1 1 2 4 3 26 29 31 13 19 17 10 18 18Delete-min dalam heap
1 1 2 1 1 2 4 3 26 29 31 13 19 17 10 18 23Delete-min dalam heap (2)
• Ganti elemen top dengan elemen
terakhir dalam heap
8
1
0 11
1
Delete-min dalam heap (2)
• Ganti elemen top dengan elemen
terakhir dalam heap
1
0 11
1
Delete-min dalam heap (2)
• Ganti elemen top dengan elemen
terakhir dalam heap
• Lakukan Heapify(1)
1 2 13 17 10 16 11 11Delete-min dalam heap (2)
• Ganti elemen top dengan elemen
terakhir dalam heap
• Lakukan Heapify(1)
1 2 13 10 17 16 11 11Delete-min dalam heap (2)
• Ganti elemen top dengan elemen
terakhir dalam heap
• Lakukan Heapify(1)
1 2 13 10 16 17 11 21Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 0 21 13 31
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 0 21 13 31
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 0 21 13
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 0 21 13 17
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap 1 21 11
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 26 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Jadi mulai dari parent leaves terakhir
11 8
1 0
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap 1 8 11
0
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Jadi mulai dari parent leaves terakhir
11
8 1
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3 4 3 13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
11
8 1
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3
13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Jadi mulai dari parent leaves terakhir
11
8 1
0
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
2 3
13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
11 8
1
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Jadi mulai dari parent leaves terakhir
11 21 8 1 0 23
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
11 21 8 1 0 23
Building Heap
• Dimulai dari bawah ke atas
• Semua leaves adalah heap
13 1 7
Build-Heap (A)
for i
n/2
downto 1
do Heapify(A,i)
Karen leaves berupa heap
Jadi mulai dari parent leaves terakhir
11 21 8 1 0 23
Analisis Building heap
• Kebenaran : induksi pada i, semua akar tree pada
m>i adalah heap
• Run time : n call pada Heapify = n O(log n)=O(n log
n)
• Height node : panjang dari jalur terpanjang dari node
ke leaf
• Height tree: height node
• Time Heapify(i)=O(height of subtree berakar i)
• Asumsi : jum node n=2k-1 (complete binary tree)
Analisis Building heap (2)
• Untuk n/2 node dngan height 1, heapify
membutuhkan setidaknya 1 kali tukar
• Untuk n/4 node dngan height 2, heapify
membutuhkan setidaknya 2 kali tukar
• Untuk n/2i node dngan height i, heapify
membutuhkan setidaknya i kali tukar
• Jadi total jumlah pertukaran :
+ + + + + + + − =O n n n k n T .3 ... 1 8 1 2 . 4 1 2 1 ) (
Bagaimana terjadi O(n) ?
∑
∑
∑
∑
∞ ∞ = − ∞ = − ∞ ==
=
=
→
−
=
−
→
−
=
−
<
−
=
0 2 1 0 2 1 02
2
/
1
2
1
//
)
(
//
)
1
(
1
//
1
1
1
i i i i i ii
x
masukan
x
x
x
x
i
x
kalikan
x
x
i
si
diferensia
x
if
x
x
Jadi O(n)
Heapsort
• Buat heap
Lakukan delete-min
Secara berulang hingga
Heap mjd kosong
• Lakukan sort pada, array
Pindahkan (tukar)
elemen yang di hapus
8 1 0 11 1 2 2 1 1 7 1 6 23 43 29 26 13 19 31
Proses heapsort
• Delete-min
1 1 1 2 21 17 1 6 2 3 4 3 2 9 2 6 13 19 31 8 10Proses heapsort
• Heapify (1)
1 1 1 2 21 17 1 6 2 3 4 3 2 9 2 6 13 19 8 31 10Proses heapsort
• Heapify (1)
1 1 13 19 8 10 31 12 21 16 23 43 29 26 17Proses heapsort
• Heapify (1)
1 1 13 19 8 10 12 31 21 16 23 43 29 26 17Proses heapsort
• Heapify (1)
1 1 13 19 8 10 12 16 21 31 23 43 29 26 17Proses heapsort
• Delete-min
1 1 13 19 8 10 12 16 21 31 23 43 29 26 17Proses heapsort
• Delete-min
1 1 13 10 8 19 12 16 21 31 23 43 29 26 17Proses heapsort
• Heapify(1)
13 10 8 19 12 16 21 31 23 43 29 26 17 11Proses heapsort
• Heapify(1)
13 10 8 11 12 16 21 31 23 43 29 26 17 19Proses heapsort
• Delete-min
19 10 8 11 12 16 21 31 23 43 29 26 17 13Proses heapsort
• Delete-min
19 10 8 26 12 16 21 31 23 43 29 11 17 13Proses heapsort
• Heapify(1)
19 10 8 26 12 16 21 31 23 43 29 11 17 13Proses heapsort
• Heapify(1)
19 10 8 12 26 16 21 31 23 43 29 11 17 13Proses heapsort
• Heapify(1)
19 10 8 12 16 26 21 31 23 43 29 11 17 13Proses heapsort
• Delete-min
19 10 8 12 16 23 21 31 26 43 29 11 17 13Proses heapsort
• Delete-min
19 10 8 29 16 23 21 31 26 43 12 11 17 13Proses heapsort
• Heapify(1)
19 10 8 29 16 23 21 31 26 43 12 11 17 13Proses heapsort
• Heapify(1)
19 10 8 13 16 23 21 31 26 43 12 11 17 29Proses heapsort
• Heapify(1)
19 10 8 13 16 23 21 31 26 43 12 11 29 17Proses heapsort
• Delete-min
19 10 8 13 16 23 21 31 26 43 12 11 29 17Proses heapsort
• Heapify(1)
19 10 8 43 16 23 21 31 26 13 12 11 29 17Proses heapsort
• Heapify(1)
19 10 8 16 43 23 21 31 26 13 12 11 29 17Proses heapsort
• Delete-min
19 10 8 16 21 23 43 31 26 13 12 11 29 17Proses heapsort
• Heapify(1)
19 10 8 26 21 23 43 31 16 13 12 11 29 17Proses heapsort
• Heapify(1)
19 10 8 17 21 23 43 31 16 13 12 11 29 26Proses heapsort
• Delete-min
26 10 8 17 21 23 43 31 16 13 12 11 29 19Proses heapsort
• Heapify(1)
26 10 8 31 21 23 43 17 16 13 12 11 29 19Proses heapsort
• Heapify(1)
26 10 8 19 21 23 43 17 16 13 12 11 29 31Proses heapsort
• Delete-Min
31 10 8 19 21 23 43 17 16 13 12 11 29 26Proses heapsort
• Heapify(1)
31 10 8 29 21 23 43 17 16 13 12 11 19 26Proses heapsort
• Heapify(1)
31 10 8 21 29 23 43 17 16 13 12 11 19 26Proses heapsort
• Delete-min
31 10 8 21 23 29 43 17 16 13 12 11 19 26Proses heapsort
• Heapify(1)
21 10 8 31 23 29 43 17 16 13 12 11 19 26Proses heapsort
• Heapify(1)
21 10 8 23 31 29 43 17 16 13 12 11 19 26Proses heapsort
• Delete-min
21 10 8 23 29 31 43 17 16 13 12 11 19 26Proses heapsort
• Heapify(1)
21 10 8 43 29 31 23 17 16 13 12 11 19 26Proses heapsort
• Heapify(1)
21 10 8 26 29 31 23 17 16 13 12 11 19 43Proses heapsort
• Delete-min
21 10 8 26 29 31 23 17 16 13 12 11 19 43Proses heapsort
• Heapify(1)
21 10 8 31 29 26 23 17 16 13 12 11 19 43Proses heapsort
• Delete-min
21 10 8 29 31 26 23 17 16 13 12 11 19 43Proses heapsort
• Hepaify(1)
21 10 8 43 31 26 23 17 16 13 12 11 19 29Proses heapsort
• Delete-min
21 10 8 31 43 26 23 17 16 13 12 11 19 29Proses heapsort
• Delete-min
21 10 8 43 31 26 23 17 16 13 12 11 19 29Proses heapsort
• Delete-min
21 10 8 43 31 26 23 17 16 13 12 11 19 29Run time operasi heap
• Insert():O(log n)
• Heapify(): O(log n)
• Findmin(): O(1)
• Deletemin(): O(log n)
• Buildheap(): O(n)
Psuedo code
• PARENT(i)
return i/2
• LEFT(i)
return 2i
• RIGHT(i)
return 2i + 1
Tukar
Tukar (a,b)
temp=a
a=b
Heapify
HEAPIFY(A, i)
l LEFT(i)
r RIGHT(i)
if l <=heap-size[A] and A[l] > A[i] then largest l
else largest i
If r <=heap-size[A] and A[r] > A[largest] then largest r
Shiftdown
ShiftDown(A,i)
ki
repeat
jk
if 2j<=length(A) and A[2j]>A[k]
then k2j
if 2j<length(A) and A[2j+1]>A[k]
then k2j+1
Shiftup
Shiftup(A,i)
ki
repeat
jk
if j>i and A[j%2]<A[k] then kj%2
Tukar(A[j],A[k])
Buildheap dan Makeheap
BUILDHEAP(A)
heap-size[A] length[A]
for i length
A/2
downto 1
do HEAPIFY(A, i)
Atau
Makeheap(A)
FindMax-min, DelMax-min
Findmax(A)
return A[1];
FindMin(A)
return A[n]
DelMax(A)
A[1]A[n]
ShiftDown(A[1..n-1],1)
DelMin(A)
InsertNode
InsertNode(A,v)
A[n+1]v
Heapsort
Heapsort (A)
makeheap(A)
for in downto 2 do tukar(A[1],A[i])
Shiftdow(A[1..i-1],1) Atau
HEAPSORT(A)
BUILDHEAP(A)
for i length[A] downto 2 do tukar(A[1],A[i])