Belajar Data Structure - Decision Matrix: Memilih Struktur Data yang Tepat
Episode 24 of 28

Belajar Data Structure - Decision Matrix: Memilih Struktur Data yang Tepat

Memilih struktur data yang tepat membutuhkan framework, bukan tebakan. Di episode ini kalian memahami pertanyaan kunci: access pattern, insert/delete frequency, memory constraint, serta mempraktikkan 5 coding problems dengan identifikasi DS optimal dan justifikasi trade-off.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 23 kita menutup Fase 5 dengan suffix array dan suffix tree, pada episode ini kita memasuki Fase 6: Pemilihan, Optimasi & Produksi dengan membahas decision matrix — framework untuk memilih struktur data yang tepat berdasarkan pertanyaan kunci, bukan tebakan atau kebiasaan.

Sejauh ini kita telah mempelajari 15+ struktur data. Pertanyaannya sekarang: kapan harus menggunakan mana? Jawabannya bukan "tergantung" — ada framework yang bisa kalian ikuti secara konsisten.

Framework: Pertanyaan Kunci

1. Access Pattern?

Pertanyaan paling penting: bagaimana data kalian diakses?

PatternDS OptimalContoh
Random access by indexArrayLookup table, buffer
Key-value lookupHash MapDictionary, cache
Ordered iterationBST, TreeMapLeaderboard, range query
Min/Max priorityHeapTask scheduling, top-K
Prefix matchingTrieAutocomplete
Shortest pathGraph + DijkstraNavigation

2. Insert/Delete Frequency?

FrekuensiDS OptimalAlasan
Insert di head seringLinked ListO(1) insert head
Insert/delete di tengahBST, Hash MapO(log n) atau O(1)
Insert/delete di ujungDeque, StackO(1) di kedua ujung
Batch insertArrayCache-friendly, bulk load

3. Memory Constraint?

ConstraintDS OptimalTrade-off
Hemat memoriArray, Bloom FilterKurang fleksibel
Bisa boros memoriLinked List, Hash MapLebih fleksibel
Disk-basedB-Tree, LSM-TreeMinimalkan disk I/O

4. Concurrent Access?

SkenarioDS OptimalKeterangan
Read-heavyConcurrentHashMapOptimasi read
Write-heavyLock-free queueMinimalisasi lock
Read-write balancedConcurrent skip listBalance

Matriks Perbandingan

DSAccessInsertDeleteSearchOrderedMemory
ArrayO(1)O(n)O(n)O(n)TergantungEfisien
Linked ListO(n)O(1) headO(1) headO(n)TidakBoros
Hash MapN/AO(1) avgO(1) avgO(1) avgTidakMenengah
BSTN/AO(log n)O(log n)O(log n)YaEfisien
HeapO(1) minO(log n)O(log n)O(n)PartialEfisien
TrieN/AO(m)O(m)O(m)YaBoros
B-TreeN/AO(log n)O(log n)O(log n)YaEfisien

Praktik: 5 Coding Problems

Problem 1: Two Sum

PythonTwo sum dengan hash map
def two_sum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], i]
        seen[num] = i
    return []
 
# DS optimal: Hash Map — O(n) lookup, O(n) space

Justifikasi: Hash Map memungkinkan O(1) lookup untuk complement, menjadikan solusi O(n).

Problem 2: Top K Frequent Elements

PythonTop K frequent dengan heap
from collections import Counter
import heapq
 
def top_k_frequent(nums, k):
    count = Counter(nums)
    return heapq.nlargest(k, count.keys(), key=count.get)
 
# DS optimal: Heap — O(n log k) untuk top K

Justifikasi: Min-heap berukuran k menjaga elemen terbesar secara efisien.

Problem 3: Merge Intervals

PythonMerge intervals dengan sorting
def merge_intervals(intervals):
    intervals.sort()
    merged = [intervals[0]]
    for start, end in intervals[1:]:
        if start <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], end)
        else:
            merged.append([start, end])
    return merged
 
# DS optimal: Array + Sorting — O(n log n) time, O(n) space

Problem 4: LRU Cache

PythonLRU cache
# DS optimal: Doubly Linked List + Hash Map — O(1) get/put
# Sudah dibahas di episode 22

Problem 5: Word Break

PythonWord break dengan Trie
class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end = False
 
def build_trie(words):
    root = TrieNode()
    for word in words:
        node = root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
    return root
 
def word_break(s, word_dict):
    trie = build_trie(word_dict)
    n = len(s)
    dp = [False] * (n + 1)
    dp[0] = True
 
    for i in range(n):
        if dp[i]:
            node = trie
            for j in range(i, n):
                if s[j] not in node.children:
                    break
                node = node.children[s[j]]
                if node.is_end:
                    dp[j + 1] = True
 
    return dp[n]
 
# DS optimal: Trie — prefix sharing untuk dictionary lookup

Tip

Jangan menghafal matriks ini. Sebaliknya, latih pertanyaan kunci: "Bagaimana data diakses?" → "Seberapa sering insert/delete?" → "Berapa banyak memory?" → "Apakah perlu ordered?" Dengan pertanyaan ini, kalian akan secara natural memilih DS yang tepat.

Penutup

Inti yang harus dibawa pulang:

  • Framework: access pattern → insert/delete frequency → memory → ordering.
  • Two Sum → Hash Map. Top K → Heap. Merge Intervals → Array + Sorting.
  • LRU Cache → Doubly Linked List + Hash Map. Word Break → Trie.
  • Jangan menghafal — latih pertanyaan kunci untuk membuat keputusan.

Di episode 25 selanjutnya kita akan membahas memory layout, cache, dan space-time tradeoff — bagaimana cara data tersimpan di memori mempengaruhi performa, cache locality, prefetching, dan perbandingan array-of-struct vs struct-of-array. Ini akan mengubah cara kalian berpikir tentang "efisien"!

Belajar Data Structure - Decision Matrix: Memilih Struktur Data yang Tepat | Belajar Data Structure