Ringkasan Pengenalan Pola
Petakan 15 sinyal masalah umum (array terurut, perlu semua kombinasi, maksimalkan nilai dengan kendala, dan sebagainya) ke pola algoritma yang menyelesaikannya paling cepat
Ringkasan Pengenalan Pola adalah pelajaran DSA Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar DSA Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus DSA Interview Prep mencakup 4 pelajaran total.
Permainan Pengenalan Pola dalam 60 Detik
Dalam wawancara nyata, Anda memiliki kira-kira 60 detik setelah membaca soal untuk mengidentifikasi pola algoritmik yang berlaku sebelum pewawancara mengharapkan Anda mulai menulis kode. Inilah keterampilan terpenting yang perlu dikembangkan — bukan menghafal implementasi, melainkan mengenali alat yang harus digunakan.
Pengenalan pola berasal dari pemetaan sinyal soal (kata-kata dan batasan dalam pernyataan soal) ke keluarga algoritme yang telah dikenal. Setelah Anda mengidentifikasi polanya, implementasi menjadi latihan mengisi templat. Pelajaran ini merupakan lembar contekan sistematis berisi 15 sinyal soal yang paling umum beserta pola yang sesuai.
# The recognition process
recognition_steps = [
'1. Read the problem once fully (do not start coding)',
'2. Identify the data structure: array, string, tree, graph, matrix?',
'3. Identify the ask: find min/max, count ways, enumerate, detect cycle...?',
'4. Note the constraint: n<=20 (bitmask), sorted (binary search), DAG (topo sort)?',
'5. Map signal -> pattern',
'6. State the pattern and complexity to the interviewer before coding',
'7. Handle edge cases mentally before writing',
]
for step in recognition_steps:
print(step)Sinyal 1–3: Pola Larik dan Teks
Sinyal soal yang paling sering muncul untuk larik dan teks:
- Larik terurut + mencari sasaran → Pencarian biner O(log n)
- Menemukan pasangan/tiga serangkai yang jumlahnya sama dengan sasaran → Dua penunjuk O(n) jika sudah terurut, peta hash O(n) jika belum terurut
- Sublarik/subteks terpanjang/terpendek yang memenuhi kondisi → Jendela geser O(n)
- Jumlah maksimum/minimum sublarik yang berurutan → Algoritme Kadane O(n)
- Deteksi duplikat → Himpunan hash O(n) atau sort O(n log n)
Jika larik sudah terurut, selalu pertimbangkan pencarian biner terlebih dahulu. Larik tidak terurut + jumlah sasaran + O(n) = hampir selalu peta hash untuk mencari komplemen.
# Quick recognition: array/string signals
signals = [
('Sorted array, find element', 'Binary search O(log n)'),
('Find two elements summing to K', 'Sort+two-ptr O(n log n) or hash O(n)'),
('Longest subarray with property P', 'Sliding window (variable size) O(n)'),
('Max sum contiguous subarray', 'Kadane algorithm O(n)'),
('Anagram/permutation check', 'Frequency map (Counter) O(n)'),
('Contains duplicate', 'Hash set O(n)'),
('Merge two sorted arrays/lists', 'Two pointers O(n+m)'),
('Rotate / shift array', 'Reverse trick O(n) in-place'),
('Next permutation', 'Find rightmost ascent + swap + reverse'),
('Maximum product subarray', 'Track max and min (handles negatives)'),
]
for signal, pattern in signals:
print(f'{signal:45s} => {pattern}')Sinyal 4–6: Pola Pohon dan Graf
Sinyal soal pohon dan graf beserta polanya:
- Penelusuran per tingkat / jalur terpendek dalam graf tanpa bobot → BFS dengan dek O(V+E)
- Menjelajahi semua jalur / deteksi siklus / urutan DFS → DFS rekursif atau iteratif O(V+E)
- BST + properti penelusuran berurutan (elemen ke-k, urutan terurut) → DFS berurutan O(n)
- Leluhur bersama terendah → Penelusuran rekursif dengan pelacakan jalur O(n)
- Komponen terhubung / menggabungkan dua kelompok → DSU O(n × alpha(n))
# Tree/graph signal recognition
tree_graph_signals = [
('Level-order / minimum depth / word ladder', 'BFS with deque'),
('All paths / path sum / all permutations tree', 'DFS recursive'),
('Cycle detection (undirected)', 'DFS with parent / DSU'),
('Cycle detection (directed) / course schedule', 'DFS three-color / Kahn topo sort'),
('Shortest path weighted graph', 'Dijkstra (non-neg) / Bellman-Ford (neg)'),
('All-pairs shortest path', 'Floyd-Warshall O(V^3)'),
('Topological order', 'Kahn BFS topo sort'),
('Min spanning tree', 'Kruskal (DSU) / Prim (heap)'),
('Dynamic connectivity / union-find', 'DSU path compression + union by rank'),
('Autocomplete / prefix search', 'Trie'),
('BST kth smallest / range sum', 'In-order DFS'),
]
for signal, pattern in tree_graph_signals:
print(f'{signal:50s} => {pattern}')Sinyal 7–9: Sinyal Pemrograman Dinamis
Sinyal DP adalah yang paling sulit dikenali. Carilah kata kunci berikut:
- 'Jumlah cara untuk...' → DP penghitung (menjumlahkan hitungan subsoal)
- 'Biaya minimum/maksimum untuk mencapai...' → DP optimasi (mengambil nilai minimum/maksimum dari subsoal)
- 'Bisakah kita mencapai...' (kelayakan) → DP boolean (OR dari subsoal)
- Subsoal yang ditentukan oleh dua indeks teks → DP 2D (LCS, jarak edit)
- Mengambil atau melewati elemen dalam batasan kapasitas → DP ransel
- Struktur bagian optimal + subsoal yang tumpang tindih → Periksa pohon rekursi untuk pemanggilan berulang → DP
# DP signal recognition
dp_signals = [
('Number of ways to climb stairs / decode string', '1D DP (Fibonacci-like)'),
('Minimum cost to reach end / coin change', '1D DP (greedy fails)'),
('Longest increasing subsequence', '1D DP O(n^2) or patience sort O(n log n)'),
('Longest common subsequence of two strings', '2D DP O(mn)'),
('Edit distance between two strings', '2D DP O(mn) (LCS variant)'),
('Partition array into two equal subsets', '0/1 knapsack boolean DP'),
('Fill knapsack with max value under weight limit', '0/1 knapsack optimisation DP'),
('Burst balloons / matrix chain multiplication', 'Interval DP'),
('Palindrome partitioning minimum cuts', 'Interval DP + prefix palindrome'),
('Rob houses in circle', '1D DP × 2 (linear sub-problems)'),
]
for signal, pattern in dp_signals:
print(f'{signal:55s} => {pattern}')Sinyal 10–12: Sinyal Tumpukan Prioritas, Tumpukan, dan Strategi Rakus
Sinyal untuk soal tumpukan prioritas, tumpukan monoton, dan strategi rakus:
- Elemen K teratas / elemen terbesar atau terkecil ke-k → Tumpukan prioritas (tumpukan minimum untuk K terbesar, tumpukan maksimum untuk elemen terkecil ke-k) O(n log k)
- Median aliran data → Dua tumpukan prioritas (tumpukan maksimum untuk separuh kecil + tumpukan minimum untuk separuh besar)
- Elemen berikutnya yang lebih besar/kecil → Tumpukan monoton O(n)
- Persegi panjang dengan luas terbesar / menjebak air → Tumpukan monoton O(n)
- Penjadwalan interval / memaksimalkan interval yang tidak saling tumpang tindih → Strategi rakus (sort berdasarkan waktu akhir)
# Heap / stack / greedy signals
heap_stack_greedy = [
('Top-K frequent elements', 'Min-heap size K: O(n log k)'),
('Kth largest in array', 'Max-heap pop K times: O(n + k log n)'),
('Streaming median', 'Two heaps (max + min): O(log n) per insert'),
('Merge K sorted lists', 'Min-heap of (val, list_idx): O(n log k)'),
('Next greater element', 'Monotonic decreasing stack: O(n)'),
('Largest rectangle in histogram', 'Monotonic increasing stack: O(n)'),
('Sliding window maximum', 'Monotonic decreasing deque: O(n)'),
('Trapping rain water', 'Two pointers OR monotonic stack: O(n)'),
('Jump game reachability / minimum jumps', 'Greedy range expansion: O(n)'),
('Merge overlapping intervals', 'Sort by start, linear scan: O(n log n)'),
('Gas station circular', 'Greedy: start from reset point: O(n)'),
('Task scheduler with cooldown', 'Greedy: sort by frequency: O(n log n)'),
]
for signal, pattern in heap_stack_greedy:
print(f'{signal:45s} => {pattern}')Sinyal 13–15: Penelusuran Mundur dan Manipulasi Bit
Sinyal untuk penelusuran mundur dan manipulasi bit:
- Menghasilkan semua himpunan bagian / permutasi / kombinasi → Penelusuran mundur O(2^n atau n!)
- Pemenuhan batasan (N-ratu, Sudoku) → Penelusuran mundur dengan pemangkasan
- Menemukan satu elemen yang hilang/unik → XOR O(n) ruang O(1)
- Mengenumerasi semua himpunan bagian dari himpunan kecil (n ≤ 20) → Enumerasi dengan masker bit 2^n
- Menghitung bit yang bernilai 1 / memeriksa pangkat dua → Trik bit (n & (n-1))
- DP kompresi keadaan dengan himpunan kecil → DP masker bit O(2^n × n)
# Backtracking and bit signals
bt_bit_signals = [
('Generate all subsets of array', 'Backtracking O(n * 2^n) / bitmask'),
('Generate all permutations', 'Backtracking O(n * n!)'),
('Combination sum with target', 'Backtracking with pruning'),
('Word search in grid', 'Backtracking DFS on grid O(m*n*4^L)'),
('N-queens placement', 'Backtracking with column/diag sets'),
('Find single unique element (all others x2)', 'XOR all: O(n) O(1)'),
('Missing number in 0..n', 'XOR or sum formula: O(n) O(1)'),
('Count set bits in n', 'n &= n-1 loop or DP O(n)'),
('Check power of two', 'n > 0 and n & (n-1) == 0'),
('Travelling salesman (n<=20)', 'Bitmask DP O(2^n * n^2)'),
('Number with max XOR in array', 'Trie on binary representation'),
]
for signal, pattern in bt_bit_signals:
print(f'{signal:50s} => {pattern}')Analisis Batasan: Apa yang Diberitahukan N kepada Anda
Batasan ukuran masukan n secara langsung memberi tahu Anda kompleksitas waktu yang dapat diterima — dan oleh karena itu keluarga algoritmenya:
- n ≤ 20: O(2^n) atau O(n!) dapat diterima — DP masker bit, penelusuran mundur
- n ≤ 500: O(n³) dapat diterima — Floyd-Warshall, DP pencarian menyeluruh
- n ≤ 5000: O(n²) dapat diterima — DP naif, sort kuadratik
- n ≤ 10^6: diperlukan O(n log n) — merge sort, tumpukan prioritas, pencarian biner
- n ≤ 10^8: diperlukan O(n) — dua penunjuk, jendela geser, DP linear
Analisis batasan ini harus menjadi langkah pertama Anda setelah membaca soal — sebelum menentukan algoritme apa pun.
# Constraint -> acceptable complexity -> algorithm family
complexity_map = [
('n <= 20', 'O(2^n) or O(n!)', 'Bitmask DP, backtracking/permutations'),
('n <= 500', 'O(n^3)', 'Floyd-Warshall, cubic DP, brute force'),
('n <= 5000', 'O(n^2)', 'Quadratic DP, bubble/insertion sort'),
('n <= 100000', 'O(n log n)', 'Merge sort, heap, binary search, topo sort'),
('n <= 1000000', 'O(n)', 'Linear DP, two pointers, sliding window, hash'),
('n <= 10^8', 'O(n) tight', 'Only simplest O(n) — no large constants'),
('n <= 10^18', 'O(log n) or O(1)', 'Math / number theory, binary search on answer'),
]
print(f'{'Constraint':15s} {'Complexity':15s} {'Algorithm Family'}')
print('-'*70)
for constraint, complexity, algorithms in complexity_map:
print(f'{constraint:15s} {complexity:15s} {algorithms}')Soal → Pola: Latihan Cepat
Latih pemetaan ini sampai menjadi otomatis. Baca setiap deskripsi soal dan identifikasi polanya sebelum melihat solusi. Kecepatan penting — dalam wawancara, Anda seharusnya dapat mengidentifikasi pola dalam waktu kurang dari 60 detik:
- 'Diberikan larik terurut, tentukan apakah ada dua elemen yang jumlahnya sama dengan K'
- 'Diberikan sebuah pohon, temukan diameternya (jalur terpanjang antara dua simpul mana pun)'
- 'Diberikan n tugas dengan waktu jeda k, temukan interval CPU minimum'
- 'Diberikan sebuah teks, temukan subteks palindrom terpanjang'
- 'Diberikan 1..n dengan satu elemen yang hilang, temukan bilangan yang hilang'
# Quick-fire pattern recognition answers
problems = [
('Sorted array: two elements sum to K',
'Two pointers (left from start, right from end): O(n)'),
('Tree diameter (longest path)',
'DFS returning (height, max_diameter) pair: O(n)'),
('Task scheduler with cooldown k',
'Greedy: (max_freq - 1)*(k+1) + count_of_max_freq: O(n log n)'),
('Longest palindromic substring',
'Expand around centre OR Manacher: O(n^2) or O(n)'),
('Missing number in 1..n',
'XOR all indices and values: O(n) O(1)'),
('Number of islands in binary grid',
'BFS/DFS flood fill counting connected components: O(m*n)'),
('Decode string like 3[a2[bc]] -> aaabcbcaabcbc',
'Stack to handle nested brackets: O(n)'),
('Valid parentheses [(){[]}]',
'Stack push open, pop+match on close: O(n)'),
]
for problem, solution in problems:
print(f'Q: {problem}\nA: {solution}\n')Sinyal Bahaya: Saat Pola Anda Gagal
Bahkan pengembang berpengalaman pun pada awalnya dapat memilih pola yang salah. Kenali sinyal bahwa pendekatan Anda saat ini keliru, lalu beralihlah:
- O(n²) Anda lolos uji kecil tetapi melebihi batas waktu pada masukan besar → Anda memerlukan peta hash, pencarian biner, atau struktur monoton
- Strategi rakus Anda gagal pada contoh tandingan → Cobalah DP
- Ruang keadaan DP Anda terlalu besar → Carilah pembuktian strategi rakus atau definisi keadaan yang lebih cerdas
- BFS Anda memberikan jawaban yang salah → Periksa apakah Anda memerlukan Dijkstra (berbobot), bukan BFS (tanpa bobot)
- Anda mendapatkan pengecualian penunjuk kosong → Tambahkan kasus dasar dan penjagaan kasus tepi sebelum mengimplementasikan
# Red flags and recovery strategies
red_flags = [
('TLE on large n', 'Check complexity; switch from O(n^2) to O(n log n) or O(n)'),
('WA with greedy', 'Find a counter-example; switch to DP or prove exchange arg'),
('DP table huge', 'State compression (bitmask/rolling array) or different state'),
('BFS gives wrong shortest path', 'Check if edges have weights; use Dijkstra instead'),
('Stack overflow in recursion', 'Add memoisation or convert to iterative with explicit stack'),
('Off-by-one in binary search', 'Use half-open intervals [lo, hi); verify with 2-element test'),
('DSU wrong answer', 'Check 0-indexed vs 1-indexed; check union direction'),
('Backtracking TLE', 'Add pruning conditions; ensure undo step is correct'),
]
print('Pattern | Recovery')
print('-'*70)
for flag, recovery in red_flags:
print(f'{flag:40s} => {recovery}')Mengomunikasikan Pengenalan Pola dalam Wawancara
Dalam wawancara, menjelaskan pengenalan pola Anda secara lisan menunjukkan keahlian dan memberi pewawancara kesempatan untuk membimbing Anda jika Anda berada di jalur yang salah. Gunakan struktur skrip berikut:
- 'Saya melihat lariknya sudah terurut, jadi saya mempertimbangkan pencarian biner...'
- 'Soal ini meminta sublarik maksimum, yang merupakan soal klasik algoritme Kadane...'
- 'Kita memerlukan semua himpunan bagian yang mungkin, yang menunjukkan penelusuran mundur dengan pohon rekursi...'
- 'Batasan n ≤ 20 memberi tahu saya bahwa 2^n = 1 juta dapat diterima, jadi DP masker bit mungkin dapat digunakan...'
Setelah menyatakan polanya, sebutkan kompleksitas waktu dan ruang sebelum menulis satu baris kode pun. Ini menunjukkan bahwa Anda memikirkan efisiensi sebelum implementasi.
# Interview communication template
def communicate_approach(problem, pattern, time_complexity, space_complexity, edge_cases):
print(f'Problem: {problem}')
print(f'Pattern: {pattern}')
print(f'Time: {time_complexity}, Space: {space_complexity}')
print(f'Edge cases to handle: {", ".join(edge_cases)}')
print()
# Example communications
communicate_approach(
problem='Find longest substring without repeating characters',
pattern='Sliding window with a set tracking current window characters',
time_complexity='O(n)',
space_complexity='O(min(n, alphabet_size))',
edge_cases=['empty string', 'all same characters', 'all unique characters']
)
communicate_approach(
problem='Given sorted matrix, find if target exists',
pattern='Binary search or staircase search (top-right corner): eliminate row or column each step',
time_complexity='O(m + n)',
space_complexity='O(1)',
edge_cases=['empty matrix', 'single element', 'target at corners']
)Membangun Kosakata Pengenalan Pola
Cara tercepat untuk membangun kemampuan pengenalan pola adalah menyelesaikan soal dalam kelompok bertema — bukan secara acak. Luangkan satu minggu hanya untuk soal jendela geser. Kemudian soal dua penunjuk. Setelah itu soal DP. Mengerjakan 20 soal dengan jenis yang sama secara cepat akan membangun intuisi untuk mengenali pola tersebut sekilas.
Setelah setiap soal, tulislah 'catatan pola' satu baris: sinyal soal dan pola yang dipicunya. Buatlah lembar contekan Anda sendiri. Setelah menyelesaikan 200 soal dalam kelompok bertema, Anda akan mengenali sekitar 90% soal wawancara dalam waktu kurang dari 30 detik — 10% sisanya memerlukan analisis cermat bahkan bagi pengembang berpengalaman.
# Personal pattern note template
pattern_notes = [
{'signal': 'sorted array + two sum', 'pattern': 'two pointers', 'example': 'LC 167 Two Sum II'},
{'signal': 'longest X without repeating', 'pattern': 'sliding window + set', 'example': 'LC 3 Longest Substring'},
{'signal': 'max sum subarray', 'pattern': 'Kadane', 'example': 'LC 53 Max Subarray'},
{'signal': 'permutations/subsets', 'pattern': 'backtracking', 'example': 'LC 46 Permutations'},
{'signal': 'tree path sum', 'pattern': 'DFS with accumulator', 'example': 'LC 112 Path Sum'},
{'signal': 'course schedule', 'pattern': 'Kahn topo sort', 'example': 'LC 207 Course Schedule'},
{'signal': 'top-K elements', 'pattern': 'min-heap size K', 'example': 'LC 215 Kth Largest'},
]
print(f'{'Signal':40s} {'Pattern':30s} {'Example'}')
print('-'*90)
for note in pattern_notes:
print(f'{note["signal"]:40s} {note["pattern"]:30s} {note["example"]}')Uji Cepat
Uji pemahaman Anda tentang konsep Struktur Data & Algoritme — Persiapan Wawancara Pemrograman dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari: pengenalan pola memetakan sinyal soal ke keluarga algoritme — larik terurut mengisyaratkan pencarian biner, 'semua himpunan bagian' mengisyaratkan penelusuran mundur, 'biaya minimum' mengisyaratkan DP, batasan n memberi tahu Anda kompleksitas yang dapat diterima: n ≤ 20 memungkinkan O(2^n), n ≤ 10^6 memerlukan O(n log n) atau lebih baik, dan menjelaskan pola serta kompleksitas sebelum menulis kode menunjukkan keahlian dan memungkinkan pewawancara memberikan umpan balik. Berikutnya, kita akan mempraktikkan pengenalan pola melalui soal wawancara simulasi berwaktu dengan tingkat kesulitan mudah dan menengah.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Ringkasan Pengenalan Pola” gratis?
Ya — teks lengkap “Ringkasan Pengenalan Pola” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus DSA Interview Prep, upgrade ke CoddyKit PRO. Kursus DSA Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Ringkasan Pengenalan Pola”?
Petakan 15 sinyal masalah umum (array terurut, perlu semua kombinasi, maksimalkan nilai dengan kendala, dan sebagainya) ke pola algoritma yang menyelesaikannya paling cepat Kamu berlatih DSA Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai DSA Interview Prep?
Tidak diperlukan pengalaman sebelumnya. DSA Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Ringkasan Pengenalan Pola” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran DSA Interview Prep ini?
Ya. Setiap pelajaran DSA Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Ringkasan Pengenalan Pola
- Simulasi Wawancara Berwaktu: Masalah Mudah dan Menengah
- Menangani Kasus Tepi dan Komunikasi Peserta Wawancara
- Pembahasan Masalah Sulit: Word Ladder II dan Alien Dictionary