0% menganggap dokumen ini bermanfaat (0 suara)
55 tayangan47 halaman

Pemrograman Kompetitif Dasar - 07 Struktur Data Dasar

Diunggah oleh

Random
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
55 tayangan47 halaman

Pemrograman Kompetitif Dasar - 07 Struktur Data Dasar

Diunggah oleh

Random
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 47

Struktur Data Dasar

Tim Olimpiade Komputer Indonesia

1/47
Pendahuluan

Melalui dokumen ini, kalian akan:


• Mengenal beberapa macam struktur data dasar.
• Mengetahui pentingnya penggunaan struktur data.
• Mengetahui operasi-operasi yang dapat dilakukan pada
struktur data dasar.

2/47
Tentang Struktur Data

Struktur Data
Merupakan tata cara untuk merepresentasikan dan menyimpan
data, sehingga mendukung operasi terhadap data tersebut secara
efisien.

3/47
Kilas Balik: Array

Array merupakan contoh struktur data dasar yang mendukung


operasi berikut:
• Membaca nilai yang disimpan pada suatu indeks sembarang.
• Mengubah nilai yang disimpan pada suatu indeks sembarang.

Akses indeks secara sembarang ini biasa disebut sebagai random


access.

4/47
Kilas Balik: Array (lanj.)

• Bagaimana kalau kita hendak menyisipkan suatu elemen


sebagai indeks pertama dari array ?
• Kita harus menggeser seluruh isi array, barulah memasukkan
elemen yang hendak dimasukkan di indeks pertama.
• Operasi ini dilaksanakan dalam O(N), dengan N adalah
ukuran array.

5/47
Kilas Balik: Array (lanj.)

• Bagaimana jika operasi ini sering dilakukan?


• Melaksanakannya dalam O(N) kurang efisien.
• Adakah cara yang lebih baik?

6/47
Bagian 1

Linked List

7/47
Mengenal Linked List
Linked list terdiri dari kumpulan node.

Node dapat diartikan sebagai sebuah titik yang nantinya dapat


dihubungkan dengan node lainnya.

Sebuah node menyimpan dua informasi:


1. data: informasi yang disimpan.
2. next: pointer ke node berikutnya.

data next

8/47
Mengenal Linked List (lanj.)

• Pointer -pointer ini menghubungkan antar node dalam linked


list.
• Node paling depan biasa disebut head.

head
30 1 20 16

9/47
Jenis Linked List

Berdasarkan hubungannya dengan node lain, linked list terbagi


menjadi 2 macam, yaitu:
• singly linked list: tiap node hanya memiliki pointer ke node
selanjutnya saja (next).
• doubly linked list: tiap node memiliki pointer ke node
selanjutnya (next) dan node sebelumnya (prev).

Pada pembahasan ini, kita akan menggunakan doubly linked list.

10/47
Struktur Doubly Linked List

prev data next

head tail
30 1 20 16

11/47
Linked List dan Array
• Pada doubly linked list, biasanya kita hanya memiliki referensi
ke head dan tail.
• Untuk mengakses elemen ke-x dari linked list, kita dapat
melakukannya dengan:
get(head, x)
1 current = head
2 for i = 2 to x
3 current = current.next
4 return current

• Terlihat tidak efisien?

12/47
Linked List dan Array (lanj.)

Doubly linked list memiliki keuntungan dalam:


• Menyisipkan elemen baru.
• Menghapus suatu elemen.

Kedua operasi tersebut dapat dilakukan secara efisien.

13/47
Menyisipkan Elemen Linked List

Diberikan node yang bukan tail, sisipkan newNode sesudahnya.

newNode
20
node
... 1 16 ...

14/47
Menyisipkan Elemen Linked List (lanj.)

1. Isi pointer newNode.prev untuk mengarah ke node.


2. Isi pointer newNode.next untuk mengarah ke node.next.

newNode
20
node
... 1 16 ...

15/47
Menyisipkan Elemen Linked List (lanj.)

3. Perbaiki pointer newNode.prev .next untuk mengarah ke


newNode.
4. Perbaiki pointer newNode.next.prev untuk mengarah ke
newNode.

newNode
20
node
... 1 16 ...

16/47
Menyisipkan Elemen Linked List (lanj.)

• Untuk menyisipkan elemen di paling awal atau paling akhir,


gunakan cara serupa.
• Tidak ada pergeseran, hanya ”cabut” dan ”pasang” pointer.
• Kompleksitasnya adalah O(1).

17/47
Menghapus Elemen Linked List

Diberikan node yang bukan head maupun tail, hapus dari linked
list.

node
... 1 20 16 ...

18/47
Menghapus Elemen Linked List (lanj.)

1. Ubah node.prev .next menjadi node.next.


2. Ubah node.next.prev menjadi node.prev .

node
... 1 20 16 ...

19/47
Menghapus Elemen Linked List (lanj.)

3. Hapus node.

node
... 1 16 ...

20/47
Menghapus Elemen Linked List (lanj.)

• Anda juga dapat menghapus head atau tail dengan cara


serupa.
• Sama seperti menyisipkan elemen, tidak ada operasi
pergeseran di sini.
• Kompleksitasnya adalah O(1).

21/47
Rangkuman

• Linked list memang tidak mendukung random access secara


efisien.
• Namun linked list mendukung operasi menyisipkan dan
menghapus jika diketahui node tempat
penyisipan/penghapusan dilakukan.

22/47
Mengenal Stack
• Stack dapat dimisalkan seperti tumpukan piring pada
umumnya.
• Jika terdapat piring baru yang ingin dimasukkan, maka piring
tersebut masuk dari paling atas.
• Jika sebuah piring akan diambil dari tumpukan, maka yang
diambil juga piring yang paling atas.

23/47
Mengenal Stack (lanj.)
• Struktur data stack menyimpan informasi dalam bentuk
tumpukan.
• Informasi yang baru dimasukkan ke paling atas tumpukan.
• Hanya informasi paling atas yang bisa diakses/dihapus pada
setiap waktunya.
• Oleh karena itu struktur data stack disebut memiliki sifat
LIFO (Last In First Out).

24/47
Operasi pada Stack

Stack memiliki operasi sebagai berikut:


• push, yaitu memasukkan elemen baru ke bagian atas
tumpukan.
• pop, yaitu membuang elemen paling atas tumpukan.
• top, yaitu mengakses elemen paling atas tumpukan.

25/47
Aplikasi Stack

• Eksekusi fungsi pada sejumlah bahasa pemrograman biasanya


menggunakan struktur data stack, tertama untuk fungsi
rekursif.
• Pemanggilan fungsi rekursif yang menambah kedalaman
berarti melakukan ”push” pada stack eksekusi fungsi.
• Fungsi yang dieksekusi adalah fungsi di paling atas stack.
• Setelah fungsi di paling atas selesai, dilakukan ”pop” dan
eksekusi fungsi dilanjutkan ke fungsi yang ada di paling atas
stack berikutnya.
• Oleh sebab itu, ketika pemanggilan fungsi terlalu dalam,
terjadi stack overflow.

26/47
Aplikasi Stack Lainnya

• Stack juga digunakan pada kalkulator ekspresi matematika


dalam notasi postfix.
• Notasi postfix adalah notasi penulisan ekspresi matematika
dengan urutan operand, operand, dan operator.
• Contoh:
• ”1 2 +” bermakna ”1 + 2”
• ”1 2 3 + −” bermakna ”1 − (2 + 3)”
• ”1 2 3 + − 4 ×” bermakna ”(1 − (2 + 3)) × 4”
• Notasi yang biasa kita gunakan adalah notasi infix, yaitu
dengan urutan operand, operator, dan operand.

27/47
Aplikasi Stack Lainnya (lanj.)

• Diberikan sebuah ekspresi dalam notasi postfix, nilai akhirnya


dapat dicari dengan skema kerja stack.
• Pada awalnya, inisialisasi sebuah stack kosong.
• Proses ekspresi dari kiri ke kanan:
1. Jika ditemukan operand, push ke dalam stack.
2. Jika ditemukan operator, pop dua kali untuk mendapat dua
operand teratas stack, hitung, lalu push kembali ke dalam
stack.
• Satu-satunya nilai terakhir di dalam stack adalah hasil
ekspresinya.

28/47
Eksekusi Ekspresi Postfix

Ekspresi: 1 2 3 + − 4 ×
1. Push angka 1, stack: [1].
2. Push angka 2, stack: [1, 2].
3. Push angka 3, stack: [1, 2, 3].
4. Ditemukan +:
• Pop dua kali, didapat nilai 2 dan 3, stack: [1].
• Operasikan 2 + 3, dan push, stack: [1, 5]
5. ...

29/47
Eksekusi Ekspresi Postfix (lanj.)

Ekspresi: 1 2 3 + − 4 ×
5. Ditemukan -:
• Pop dua kali, didapat nilai 1 dan 5, stack: [].
• Operasikan 1 - 5, dan push, stack: [-4]
6. Push angka 4, stack: [-4, 4].
7. Ditemukan ×:
• Pop dua kali, didapat nilai -4 dan 4, stack: [].
• Operasikan -4 × 4, dan push, stack: [-16]

Jadi 1 2 3 + − 4 × = −16

30/47
Implementasi Stack

• Anda dapat mengimplementasikan stack menggunakan singly


linked list.
• Node yang perlu Anda simpan cukup head saja (atau tail
saja), berhubung penyisipan/penghapusan selalu dilakukan di
bagian tersebut.

31/47
Alternatif Implementasi Stack

• Alternatif yang seringkali lebih mudah adalah menggunakan


sebuah array dan variabel penunjuk.
• Variabel penunjuk ini menyatakan indeks array yang menjadi
elemen paling atas stack, dan bergerak maju/mundur sesuai
dengan perintah push/pop.
• Seluruh operasi dapat dilakukan dalam O(1).

32/47
Alternatif Implementasi Stack (lanj.)
initializeStack(maxSize)
1 // Buat array stack berukuran maxSize
2 topOfStack = 0

push(item)
1 topOfStack = topOfStack + 1
2 stack[topOfStack] = item

pop()
1 topOfStack = topOfStack − 1

top()
1 return stack[topOfStack]

33/47
Alternatif Implementasi Stack (lanj.)

• Pastikan nilai maxSize sama dengan maksimal operasi push


yang mungkin dilakukan.
• Pada operasi pop, kita tidak benar-benar menghapus
elemennya, melainkan hanya variabel penunjuknya yang
”dimundurkan”.

34/47
Bagian 2

Stack

35/47
Contoh Soal

• Anda diberikan sebuah string, misalnya acaabcbcd.


• Cari string abc dalam string tersebut. Jika ditemukan maka
hapus string abc tersebut, lalu ulangi pencarian.
• Pencarian berakhir ketika tidak terdapat string abc lagi.
• Tentukan total penghapusan yang berhasil dilakukan
• Contoh, pada string acaabcbcd terdapat sebuah string abc,
dan hapus string tersebut menjadi acabcd. Lalu, ditemukan
lagi string abc dan hapus menjadi acd. Karena tidak
ditemukan lagi string abc, maka jawabannya adalah 2.

36/47
Pembahasan Soal

• Lakukan iterasi setiap karakter pada string tersebut.


• Untuk setiap karakter, push ke dalam stack.
• Cek 3 karakter teratas pada stack.
• Jika 3 karakter teratas merupakan abc, artinya terdapat 1
penghapusan. Lalu pop ketiga huruf tersebut dari stack.
Pada soal ini, Anda harus dapat memodifikasi struktur data stack
agar Anda dapat melakukan operasi top pada 3 elemen teratas.
Kompleksitas total adalah O(N), dengan N merupakan panjang
string.

37/47
Bagian 3

Queue

38/47
Mengenal Queue

• Apakah anda pernah melihat antrean pembelian?


• Struktur data queue mirip dengan analogi antrean tersebut.
• Saat seorang ingin masuk ke antrean, maka orang tersebut
harus mengantri dari belakang.
• Sementara itu, orang yang dilayani terlebih dahulu adalah
orang yang paling depan.

39/47
Mengenal Queue (lanj.)
• Struktur data queue menyimpan informasi dalam bentuk
antrean.
• Informasi yang baru dimasukkan ke paling belakang antrean.
• Hanya informasi paling depan yang bisa diakses/dihapus pada
setiap waktunya.
• Oleh karena itu struktur data queue disebut memiliki sifat
FIFO (First In First Out).

40/47
Operasi Queue

Queue memiliki beberapa operasi yang dapat dilakukan:


• push, yaitu memasukkan elemen baru ke bagian akhir antrean.
• pop, yaitu mengeluarkan elemen paling depan antrean.
• front, yaitu mengakses elemen yang paling depan antrean.

41/47
Aplikasi Queue

• Sesuai namanya, pada komputer queue digunakan untuk


berbagai hal yang memerlukan antrean.
• Misalnya antrean berkas-berkas yang akan diunduh dari
internet untuk ditampilkan pada browser Anda.
• Queue akan sering kita gunakan ketika sudah memasuki
materi graf.
• Tepatnya ketika melakukan breadth-first search.

42/47
Implementasi Queue

• Anda dapat mengimplementasikan queue menggunakan singly


linked list.
• Anda dapat menyimpan node head dan tail.
• Setiap push, sisipkan elemen sesudah tail.
• Setiap pop, hapus node head.

43/47
Alternatif Implementasi Queue

• Lagi-lagi, alternatif yang seringkali lebih mudah adalah


menggunakan sebuah array dan dua variabel penunjuk.
• Variabel penunjuk ini menyatakan indeks array yang menjadi
elemen paling depan dan belakang queue.
• Kedua variabel penunjuk ini selalu bergerak maju.
• Seluruh operasi dapat dilakukan dalam O(1).

44/47
Alternatif Implementasi Queue (lanj.)
initializeQueue(maxSize)
1 // Buat array queue berukuran maxSize
2 head = 1
3 tail = 0
push(item)
1 tail = tail + 1
2 queue[tail] = item
pop()
1 head = head + 1
front()
1 return queue[head]

45/47
Alternatif Implementasi Queue (lanj.)
• Kelemahan dari implementasi ini adalah beberapa elemen di
bagian awal array tidak digunakan kembali.
• Misalnya telah dilakukan 15 kali push, dan 11 kali pop.
• Sebanyak 11 elemen pertama pada array tidak akan
digunakan kembali.
• Ini adalah pemborosan, karena aslinya hanya terdapat 4
elemen di dalam queue.
• Meskipun demikian, dalam dunia kompetisi hal ini masih
dapat diterima.
• Pastikan nilai maxSize sama dengan maksimal operasi push
yang mungkin dilakukan.

46/47
Penutup

• Struktur data yang baru kita pelajari ini merupakan struktur


data dasar.
• Pada lain kesempatan, kita akan mempelajari struktur data
yang lebih kompleks dan manfaatnya lebih ”berasa”, seperti
heap untuk priority queue, binary search tree untuk kamus,
dan segment tree untuk dynamic range query.

47/47

Anda mungkin juga menyukai