Mata Kuliah: Struktur Data dan Algoritma
Pertemuan: 15
Topik: Review dan Integrasi Struktur Data
Waktu: 150 menit
Sifat: Open Book
Pilih jawaban yang paling tepat untuk setiap soal berikut.
Diberikan kebutuhan sistem yang memerlukan operasi pencarian berdasarkan ID dengan kompleksitas O(1) rata-rata. Struktur data manakah yang paling tepat?
A. Array terurut
B. Linked List
C. Binary Search Tree
D. Hash Table
E. Heap
Dalam implementasi LRU Cache, kombinasi struktur data yang digunakan adalah:
A. Array dan Stack
B. Hash Table dan Doubly Linked List
C. BST dan Queue
D. Heap dan Array
E. Single Linked List dan Hash Table
Manakah pernyataan yang BENAR tentang perbandingan Array dan Linked List?
A. Array memiliki kompleksitas O(1) untuk insert di tengah
B. Linked List memiliki kompleksitas O(1) untuk akses berdasarkan indeks
C. Array memiliki kompleksitas O(n) untuk akses berdasarkan indeks
D. Linked List memiliki kompleksitas O(1) untuk insert di awal (jika sudah ada pointer ke head)
E. Keduanya memiliki penggunaan memori yang sama
Untuk implementasi fitur Undo/Redo pada text editor, kombinasi struktur data yang paling tepat adalah:
A. Satu Queue
B. Dua Stack
C. Satu Array
D. Satu Linked List
E. Satu Heap
Perhatikan tabel kompleksitas berikut:
| Operasi | Struktur Data X |
|---|---|
| Insert | O(log n) |
| Delete | O(log n) |
| Find Min | O(1) |
| Search | O(n) |
Struktur data X adalah:
A. Binary Search Tree
B. Min-Heap
C. Hash Table
D. Sorted Array
E. Queue
Manakah algoritma sorting yang memiliki kompleksitas waktu terbaik O(n) untuk data yang sudah hampir terurut?
A. Quick Sort
B. Merge Sort
C. Insertion Sort
D. Heap Sort
E. Selection Sort
Dalam sistem antrian prioritas rumah sakit, pasien dengan kondisi darurat harus dilayani terlebih dahulu. Struktur data yang paling tepat adalah:
A. Queue biasa
B. Stack
C. Max-Heap / Priority Queue
D. Linked List
E. Array
Diberikan kebutuhan untuk menyimpan data yang sering dilakukan operasi pencarian range (misal: semua data dengan nilai antara 100-200). Struktur data yang paling tepat adalah:
A. Hash Table
B. Heap
C. Binary Search Tree
D. Stack
E. Queue
Manakah pernyataan yang SALAH tentang Hash Table?
A. Rata-rata kompleksitas search adalah O(1)
B. Worst case search bisa O(n) jika banyak collision
C. Selalu menjaga urutan data berdasarkan key
D. Membutuhkan fungsi hash yang baik
E. Dapat menggunakan separate chaining untuk menangani collision
Untuk aplikasi yang memerlukan operasi First-In-First-Out (FIFO), struktur data yang tepat adalah:
A. Stack
B. Queue
C. Heap
D. BST
E. Hash Table
Perhatikan karakteristik berikut:
Struktur data yang dimaksud adalah:
A. Heap
B. Hash Table
C. Binary Search Tree (balanced)
D. Sorted Array
E. Queue
Manakah algoritma sorting yang TIDAK stable?
A. Merge Sort
B. Insertion Sort
C. Bubble Sort
D. Quick Sort (implementasi standar)
E. Counting Sort
Dalam sistem navigasi GPS yang perlu menyimpan rute perjalanan dan memungkinkan kembali ke titik sebelumnya, struktur data yang paling cocok adalah:
A. Queue
B. Stack
C. Array
D. Heap
E. Hash Table
Diberikan n = 1.000.000 data. Manakah struktur data yang memberikan kompleksitas waktu terbaik untuk operasi pencarian?
A. Unsorted Array: O(n)
B. Sorted Array dengan Binary Search: O(log n)
C. Linked List: O(n)
D. Hash Table: O(1) rata-rata
E. B dan D sama baiknya
Untuk implementasi spell checker yang perlu mengecek apakah sebuah kata ada dalam kamus, struktur data yang paling efisien adalah:
A. Array
B. Linked List
C. Binary Search Tree
D. Hash Table / Hash Set
E. Queue
Manakah pernyataan yang BENAR tentang Heap Sort?
A. Memiliki worst case O(n²)
B. Merupakan algoritma sorting yang stable
C. Memiliki kompleksitas waktu O(n log n) untuk semua kasus
D. Membutuhkan memori tambahan O(n)
E. Tidak dapat dilakukan secara in-place
Dalam implementasi browser history (back/forward), struktur data yang paling tepat adalah:
A. Satu Stack
B. Satu Queue
C. Dua Stack
D. Satu Linked List
E. Hash Table
Perhatikan kriteria pemilihan berikut:
Struktur data yang paling tepat adalah:
A. Linked List
B. Array
C. Hash Table
D. Binary Search Tree
E. Heap
Manakah kompleksitas waktu yang BENAR untuk operasi pada Doubly Linked List (dengan pointer ke node yang akan dioperasikan sudah tersedia)?
A. Delete: O(n)
B. Insert setelah node: O(n)
C. Delete: O(1)
D. Traversal ke node sebelumnya: O(n)
E. Access by index: O(1)
Untuk sistem yang memerlukan pencarian cepat DAN data terurut, kombinasi struktur data yang dapat digunakan adalah:
A. Hash Table saja
B. Heap saja
C. BST atau Hash Table + Sorted Structure
D. Queue saja
E. Stack saja
Jelaskan perbedaan utama antara Stack dan Queue dalam hal urutan akses data!
Sebutkan 3 kriteria utama dalam memilih struktur data yang tepat untuk suatu permasalahan!
Lengkapi tabel perbandingan kompleksitas berikut:
| Operasi | Array (unsorted) | Linked List | Hash Table |
|---|---|---|---|
| Access | ? | ? | ? |
| Search | ? | ? | ? |
| Insert | ? | ? | ? |
Jelaskan mengapa Hash Table tidak cocok untuk operasi yang memerlukan data terurut, dan sebutkan struktur data alternatif yang lebih tepat!
Dalam konteks sorting, jelaskan: a. Apa yang dimaksud dengan “stable sort”? b. Mengapa stabilitas penting dalam beberapa kasus? c. Sebutkan 2 contoh algoritma sorting yang stable!
Jelaskan bagaimana LRU Cache menggunakan kombinasi Hash Table dan Doubly Linked List untuk mencapai kompleksitas O(1) pada operasi get dan put!
Perhatikan skenario berikut:
Struktur data apa yang Anda rekomendasikan? Jelaskan alasannya!
Jelaskan trade-off antara menggunakan Array vs Linked List untuk implementasi Stack!
Dalam implementasi text editor dengan fitur Undo/Redo: a. Jelaskan peran masing-masing stack! b. Apa yang terjadi saat user melakukan aksi baru setelah beberapa kali Undo?
Diberikan kebutuhan sistem berikut:
Rancang kombinasi struktur data yang tepat dan jelaskan alasannya!
Jelaskan kapan sebaiknya menggunakan: a. Quick Sort b. Merge Sort c. Heap Sort
Perhatikan kode berikut:
// Fungsi untuk mencari elemen dalam struktur data
int cari(int target) {
// Implementasi A: Array terurut dengan binary search
// Implementasi B: Hash Table
}
Bandingkan kedua implementasi dari segi: a. Kompleksitas waktu rata-rata b. Kompleksitas ruang c. Fleksibilitas untuk operasi lain
Jelaskan mengapa Heap lebih cocok untuk Priority Queue dibandingkan dengan Sorted Array!
Rancang struktur data untuk sistem booking tiket kereta dengan kebutuhan:
Jelaskan pilihan struktur data dan kompleksitas setiap operasi!
Buatlah diagram decision tree sederhana untuk memilih struktur data berdasarkan karakteristik operasi yang dominan! (Dapat digambar dalam bentuk teks/pseudocode)
Latar Belakang: Pusat komando pertahanan udara memerlukan sistem monitoring radar yang dapat:
Tugas:
a. (2 poin) Rancang struktur data yang tepat untuk sistem ini! Jelaskan mengapa Anda memilih kombinasi struktur data tersebut.
b. (2 poin) Tuliskan pseudocode untuk operasi getTop10Threats() yang mengembalikan 10 objek dengan tingkat ancaman tertinggi!
c. (3 poin) Analisis kompleksitas waktu untuk setiap operasi utama:
Latar Belakang: Divisi logistik memerlukan sistem manajemen inventaris yang dapat:
Tugas:
a. (2 poin) Rancang arsitektur data menggunakan kombinasi struktur data yang optimal! Gambarkan diagram arsitekturnya.
b. (2 poin) Implementasikan fungsi cariByKode(string kode) dan cariByKategori(string kategori) dalam pseudocode!
c. (2 poin) Jelaskan bagaimana sistem akan menangani alert kedaluwarsa secara efisien tanpa melakukan scan seluruh data setiap hari!
d. (2 poin) Analisis trade-off dari desain Anda dibandingkan dengan menggunakan single data structure (misalnya hanya Array atau hanya Hash Table)!
| No | Jawaban | Penjelasan Singkat |
|---|---|---|
| 1 | D | Hash Table memberikan O(1) rata-rata untuk pencarian berdasarkan key/ID |
| 2 | B | LRU Cache menggunakan Hash Table (O(1) lookup) + Doubly Linked List (O(1) move to front/remove) |
| 3 | D | Linked List O(1) insert di awal jika pointer ke head tersedia (hanya ubah beberapa pointer) |
| 4 | B | Dua Stack: satu untuk Undo (menyimpan aksi), satu untuk Redo (aksi yang di-undo) |
| 5 | B | Min-Heap: insert/delete O(log n), find-min O(1), tapi search O(n) |
| 6 | C | Insertion Sort O(n) untuk data hampir terurut karena minimal pergeseran |
| 7 | C | Max-Heap/Priority Queue untuk mengambil elemen dengan prioritas tertinggi |
| 8 | C | BST mendukung range query dengan traversal inorder |
| 9 | C | Hash Table TIDAK menjaga urutan, data tersimpan berdasarkan hash value |
| 10 | B | Queue mengikuti prinsip FIFO (First-In-First-Out) |
| 11 | C | Balanced BST memiliki semua operasi O(log n) dan inorder traversal terurut |
| 12 | D | Quick Sort standar tidak stable (elemen equal bisa bertukar urutan) |
| 13 | B | Stack LIFO cocok untuk backtracking/kembali ke titik sebelumnya |
| 14 | D | Hash Table O(1) lebih baik dari Binary Search O(log n) untuk lookup murni |
| 15 | D | Hash Set O(1) untuk membership checking |
| 16 | C | Heap Sort O(n log n) untuk semua kasus, in-place, tapi tidak stable |
| 17 | C | Dua Stack: Back stack dan Forward stack untuk navigasi |
| 18 | B | Array: O(1) access by index, memory efficient, ukuran tetap |
| 19 | C | Doubly Linked List: Delete O(1) jika pointer ke node tersedia |
| 20 | C | BST untuk keduanya, atau Hash Table + struktur terurut terpisah |
Stack vs Queue:
Perbedaan utama: Urutan pemrosesan data berlawanan — Stack memproses dari yang terbaru, Queue memproses dari yang terlama.
3 Kriteria utama pemilihan struktur data:
Jenis operasi yang dominan: Apakah lebih sering search, insert, delete, atau access?
Kompleksitas waktu yang diperlukan: Operasi kritis harus memiliki kompleksitas rendah (idealnya O(1) atau O(log n))
Constraint memori: Apakah memori terbatas? Apakah data perlu contiguous?
Kriteria tambahan: ukuran data, kebutuhan pengurutan, frekuensi modifikasi.
| Operasi | Array (unsorted) | Linked List | Hash Table |
|---|---|---|---|
| Access | O(1) | O(n) | O(1)* |
| Search | O(n) | O(n) | O(1)* |
| Insert | O(1) amortized/O(n) | O(1) di posisi | O(1)* |
*) Rata-rata, worst case O(n)
Catatan:
Mengapa Hash Table tidak cocok untuk data terurut:
Hash function mendistribusikan data secara acak — tidak ada hubungan antara nilai key dan posisi penyimpanan
Tidak ada operasi range query — tidak bisa efisien mengambil data dalam rentang tertentu
Traversal tidak berurutan — iterate hash table tidak menghasilkan urutan bermakna
Alternatif yang lebih tepat:
a. Stable Sort: Algoritma sorting yang mempertahankan urutan relatif elemen-elemen dengan nilai/key yang sama seperti urutan di input awal.
b. Mengapa stabilitas penting:
c. Contoh algoritma stable:
LRU Cache dengan Hash Table + Doubly Linked List:
Struktur:
Operasi GET(key):
Operasi PUT(key, value):
Semua operasi O(1) karena tidak ada traversal — semua akses langsung via pointer.
Rekomendasi: Hash Table + BST (atau Skip List)
Alasan:
Alternatif praktis: Gunakan Hash Table saja untuk operasi sehari-hari, lalu sort on-demand saat perlu tampilan terurut (sorting 10.000 data dengan O(n log n) masih cukup cepat jika tidak terlalu sering).
Trade-off Array vs Linked List untuk Stack:
| Aspek | Array-based Stack | Linked List Stack |
|---|---|---|
| Push | O(1) amortized* | O(1) always |
| Pop | O(1) | O(1) |
| Memory | Contiguous, mungkin ada waste | Per-node overhead (pointer) |
| Resizing | Perlu realokasi jika penuh | Tidak perlu |
| Cache | Cache-friendly | Cache-unfriendly |
| Max size | Perlu diketahui/dynamic | Unlimited (sesuai memori) |
*) Amortized O(1) dengan strategi doubling
Rekomendasi:
a. Peran masing-masing Stack:
Operasi:
b. Aksi baru setelah beberapa Undo:
Desain untuk Sistem Data Sensor:
Kombinasi struktur data:
Cara kerja:
Alasan: Mirip LRU Cache tetapi ordered by timestamp bukan by access time.
Kapan menggunakan masing-masing sorting:
a. Quick Sort:
b. Merge Sort:
c. Heap Sort:
Perbandingan Array Terurut (Binary Search) vs Hash Table:
a. Kompleksitas waktu rata-rata:
b. Kompleksitas ruang:
c. Fleksibilitas untuk operasi lain:
Heap vs Sorted Array untuk Priority Queue:
| Operasi | Heap | Sorted Array |
|---|---|---|
| Insert | O(log n) | O(n) |
| Extract-Min/Max | O(log n) | O(1)* atau O(n)** |
| Find-Min/Max | O(1) | O(1) |
*) O(1) jika hapus dari ujung **) O(n) jika perlu shift
Mengapa Heap lebih cocok:
Sorted Array hanya lebih baik jika: Insert sangat jarang, atau selalu hapus dari ujung.
Struktur data untuk sistem booking tiket:
Arsitektur:
Main: Hash Table
key: nomor_gerbong
value: BitArray/BitSet untuk kursi (1 = booked, 0 = available)
Operasi dan kompleksitas:
hashTable[gerbong][kursi] → O(1)Alternatif: Hash Table of Hash Sets, dimana inner set menyimpan kursi yang terbooked.
Decision Tree Pemilihan Struktur Data:
START: Apa operasi yang paling sering?
│
├─► Pencarian berdasarkan key/ID
│ └─► Hash Table ✓
│
├─► Akses berdasarkan posisi/indeks
│ └─► Array ✓
│
├─► Insert/Delete di awal atau akhir
│ ├─► Perlu LIFO? → Stack (Array atau Linked List) ✓
│ └─► Perlu FIFO? → Queue ✓
│
├─► Insert/Delete di tengah (posisi arbitrary)
│ └─► Linked List ✓
│
├─► Perlu data terurut ATAU range query?
│ ├─► Ya, dan insert/delete sering → BST ✓
│ └─► Ya, tapi data statis → Sorted Array ✓
│
├─► Perlu mengambil elemen dengan prioritas (min/max)
│ └─► Heap / Priority Queue ✓
│
└─► Kombinasi kebutuhan kompleks
└─► Gunakan MULTIPLE struktur data (indexing) ✓
a. Rancangan Struktur Data:
Kombinasi:
Alasan kombinasi:
b. Pseudocode getTop10Threats():
function getTop10Threats():
// Asumsi menggunakan Max-Heap berdasarkan threat_level
result = empty list
tempHeap = copy(threatHeap) // Preserve original
count = 0
while count < 10 AND tempHeap not empty:
topThreat = extractMax(tempHeap)
result.append(topThreat)
count++
return result
// Kompleksitas: O(k log n) dimana k = 10
Alternatif lebih efisien (tanpa modifikasi heap):
function getTop10Threats():
// Gunakan partial heap extraction atau selection algorithm
// Atau maintain separate "top-k" structure yang di-update saat insert
return topKList // O(1) jika pre-maintained
c. Analisis Kompleksitas:
| Operasi | Struktur Data | Kompleksitas | Penjelasan |
|---|---|---|---|
| Update posisi | Hash Table | O(1) | Lookup ID, update koordinat |
| Pencarian by ID | Hash Table | O(1) | Direct hash lookup |
| Top 10 ancaman | Max-Heap | O(k log n) | Extract 10 elemen dari heap |
| Hapus objek | Hash Table + Heap | O(log n) | O(1) dari Hash, O(log n) dari Heap |
Catatan untuk Top 10:
a. Arsitektur Data:

Gambar 15.7: Arsitektur multi-index untuk sistem logistik militer
Struktur:
b. Pseudocode Pencarian:
// Pencarian berdasarkan kode
Item* cariByKode(string kode) {
if (primaryHash.contains(kode)) {
return primaryHash.get(kode);
}
return nullptr; // Tidak ditemukan
}
// Kompleksitas: O(1)
// Pencarian berdasarkan kategori
List<Item*> cariByKategori(string kategori) {
if (categoryIndex.contains(kategori)) {
return categoryIndex.get(kategori); // Return list of pointers
}
return emptyList;
}
// Kompleksitas: O(1) untuk mendapat list, O(k) untuk iterate k items
c. Penanganan Alert Kedaluwarsa:
Strategi: Min-Heap + Daily Check
// Struktur: Min-Heap dengan tanggal kedaluwarsa sebagai key
function dailyExpiryCheck():
today = getCurrentDate()
threshold = today + 30 days
alerts = empty list
// Peek dan extract selama item akan kedaluwarsa dalam 30 hari
while not expiryHeap.isEmpty():
topItem = expiryHeap.peek()
if topItem.expiryDate <= threshold:
alerts.append(topItem)
expiryHeap.extractMin()
// Move to "expiring soon" separate list
else:
break // Semua item berikutnya expiry lebih lama
return alerts
// Kompleksitas: O(k log n) dimana k = jumlah item yang akan expire
// TIDAK perlu scan seluruh 50.000 data!
Keunggulan:
d. Trade-off Analisis:
| Aspek | Multi-Index (Desain Ini) | Single Hash Table | Single Array |
|---|---|---|---|
| Cari by kode | O(1) | O(1) | O(n) |
| Cari by kategori | O(1) + O(k) | O(n) scan | O(n) scan |
| Expiry check | O(k log n) | O(n) scan | O(n) scan |
| Memory | ~3x overhead | 1x | 1x |
| Insert complexity | O(log n) update heap | O(1) | O(1) |
| Maintenance | Lebih kompleks | Simple | Simple |
Kesimpulan:
| Bagian | Jumlah Soal | Poin per Soal | Total |
|---|---|---|---|
| Pilihan Ganda | 20 | 2 | 40 |
| Uraian | 15 | Bervariasi (2-4) | 45 |
| Studi Kasus | 2 | 7 + 8 | 15 |
| Total | 100 |
This repository is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0). Commercial use is permitted, provided attribution is given to the author.
© 2026 Anindito