Örüntü Tanıma Kopya Kâğıdı
15 yaygın problem işaretini (sıralı dizi, tüm kombinasyonlara ihtiyaç duyma, kısıt altında değeri en üst düzeye çıkarma vb.) onları en hızlı çözen algoritma örüntüleriyle eşleştirin.
Örüntü Tanıma Kopya Kâğıdı, CoddyKit'te ücretsiz bir DSA Interview Prep dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA Interview Prep kursu toplamda 4 dersten oluşur.
60 Saniyelik Örüntü Tanıma Oyunu
Gerçek bir mülakatta, bir problemi okuduktan sonra hangi algoritmik örüntünün uygulanacağını belirlemek için yaklaşık 60 saniyeniz vardır; mülakat yapan kişi bu sürenin ardından kod yazmaya başlamanızı bekler. Geliştirmeniz gereken en önemli beceri budur — uygulamaları ezberlemek değil, başvurmanız gereken aracı tanımaktır.
Örüntü tanıma, problem ipuçlarını (problem ifadesindeki sözcükleri ve kısıtları) bilinen algoritma aileleriyle eşleştirerek gelişir. Örüntüyü belirlediğinizde uygulama, bir şablonu doldurma çalışmasına dönüşür. Bu ders, en yaygın 15 problem ipucunu ve bunlara karşılık gelen örüntüleri sistematik biçimde özetleyen bir kısa başvuru kılavuzudur.
# 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: Dizi ve Metin Örüntüleri
Diziler ve metinlerle ilgili en sık karşılaşılan problem ipuçları:
- Sıralı dizi + hedefi bulma → İkili arama O(log n)
- Toplamı hedefe eşit olan ikili veya üçlü grubu bulma → Sıralıysa iki işaretçi O(n), sıralı değilse karma tablo O(n)
- Bir koşulu sağlayan en uzun/en kısa alt dizi veya alt metin → Kayan pencere O(n)
- Bitişik alt dizinin en büyük/en küçük toplamı → Kadane algoritması O(n)
- Yinelenen değerleri bulma → Karma küme O(n) veya sort O(n log n)
Dizi sıralıysa her zaman önce ikili aramayı değerlendirin. Sıralı olmayan dizi + hedef toplam + O(n) = neredeyse her zaman tümleyeni aramak için karma tablo kullanılması demektir.
# 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: Ağaç ve Graf Örüntüleri
Ağaç ve graf problemlerinin ipuçları ve bunlara karşılık gelen örüntüler:
- Seviye seviye dolaşma / ağırlıksız grafta en kısa yol → Çift uçlu kuyrukla BFS O(V+E)
- Tüm yolları keşfetme / döngü bulma / DFS sırası → Özyinelemeli veya yinelemeli DFS O(V+E)
- BST + sıralı dolaşma özellikleri (k'ıncı öğe, sıralı düzen) → Sıralı dolaşmayla DFS O(n)
- En düşük ortak ata → Yol izlemeli özyinelemeli iniş O(n)
- Bağlı bileşenler / iki grubu birleştirme → 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: Dinamik Programlama Sinyalleri
DP sinyallerini tanımak en zordur. Şu anahtar sözcükleri arayın:
- '... için kaç yol vardır?' → Sayma DP'si (alt problemlerin sayılarını toplama)
- '... elde etmenin en düşük/en yüksek maliyeti' → Eniyileme DP'si (alt problemlerin minimumunu veya maksimumunu alma)
- '... elde edebilir miyiz?' (uygulanabilirlik) → Mantıksal DP (alt problemlerin OR işlemi)
- İki metin diziniyle tanımlanan alt problem → 2B DP (LCS, düzenleme uzaklığı)
- Kapasite kısıtı altında öğeleri alma veya atlama → Sırt çantası DP'si
- En iyi alt yapı + örtüşen alt problemler → Yinelenen çağrılar için özyineleme ağacını inceleyin → 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: Öbek, Yığın ve Açgözlü Yaklaşım Sinyalleri
Öbek, monoton yığın ve açgözlü yaklaşım problemlerinin ipuçları:
- En büyük K öğe / k'ıncı en büyük veya en küçük öğe → Öbek (en büyük K öğe için minimum öbeği, k'ıncı en küçük öğe için maksimum öbeği) O(n log k)
- Veri akışının medyanı → İki öbek (küçük yarının maksimum öbeği + büyük yarının minimum öbeği)
- Bir sonraki daha büyük/küçük öğe → Monoton yığın O(n)
- En büyük dikdörtgen alanı / su biriktirme → Monoton yığın O(n)
- Aralık planlama / örtüşmeyen aralıkların sayısını en üst düzeye çıkarma → Açgözlü yaklaşım (sort bitiş time ölçütüne göre)
# 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: Geri İzleme ve Bit İşlemleri
Geri izleme ve bit işlemlerinin ipuçları:
- Tüm alt kümeleri / permütasyonları / kombinasyonları oluşturma → Geri izleme O(2^n veya n!)
- Kısıtları sağlama (N veziri, Sudoku) → Budamayla geri izleme
- Eksik veya tekil bir öğeyi bulma → XOR O(n), O(1) alan
- Küçük bir kümenin tüm alt kümelerini sıralama (n ≤ 20) → Bit maskesiyle 2^n sıralaması
- 1 bitlerinin sayısını bulma / ikinin kuvveti kontrolü → Bit işlemleri (n & (n-1))
- Küçük bir kümeyle durum sıkıştırmalı DP → Bit maskesi DP 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}')Kısıt Analizi: N Size Ne Söyler
n girdi boyutu kısıtı, kabul edilebilir zaman karmaşıklığını ve dolayısıyla kullanılacak algoritma ailesini doğrudan gösterir:
- n ≤ 20: O(2^n) veya O(n!) kabul edilebilir — bit maskesi DP'si, geri izleme
- n ≤ 500: O(n³) kabul edilebilir — Floyd-Warshall, kaba kuvvet DP'si
- n ≤ 5000: O(n²) kabul edilebilir — basit DP, kuadratik sort
- n ≤ 10^6: O(n log n) gerekir — birleştirmeli sıralama, öbek, ikili arama
- n ≤ 10^8: O(n) gerekir — iki işaretçi, kayan pencere, doğrusal DP
Bu kısıt analizi, problemi okuduktan sonra atacağınız ilk adım olmalıdır — herhangi bir algoritmaya karar vermeden önce.
# 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}')Problem → Örüntü: Hızlı Uygulama
Bu eşleştirmeyi otomatik hâle gelene kadar uygulayın. Her problem açıklamasını okuyun ve çözüme bakmadan önce örüntüyü belirleyin. Hız önemlidir — bir mülakatta örüntüyü 60 saniyeden kısa sürede belirlemelisiniz:
- 'Sıralı bir dizi verildiğinde, herhangi iki öğenin toplamının K olup olmadığını bulun'
- 'Bir ağaç verildiğinde, çapını bulun (herhangi iki düğüm arasındaki en uzun yol)'
- 'Bekleme süresi k olan n görev verildiğinde, gereken minimum CPU aralıklarını bulun'
- 'Bir metin verildiğinde, en uzun palindromik alt dizeyi bulun'
- 'Bir öğesi eksik olan 1..n verildiğinde, eksik sayıyı bulun'
# 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')Uyarı İşaretleri: Örüntünüz Ne Zaman İşe Yaramıyor
Deneyimli mühendisler bile başlangıçta yanlış örüntüyü seçebilir. Mevcut yaklaşımınızın yanlış olduğunu gösteren şu ipuçlarını tanıyın ve yön değiştirin:
- O(n²) çözümünüz küçük örnekleri geçiyor ancak büyük girdilerde zaman aşımına uğruyor → karma tabloya, ikili aramaya veya monoton bir yapıya ihtiyacınız var
- Açgözlü yaklaşımınız bir karşı örnekte başarısız oluyor → DP'yi deneyin
- DP durum uzayınız çok büyük → açgözlü bir kanıt veya daha akıllı bir durum tanımı arayın
- BFS yanlış yanıt veriyor → BFS (ağırlıksız) yerine Dijkstra'ya (ağırlıklı) ihtiyacınız olup olmadığını kontrol edin
- Boş işaretçi hataları alıyorsunuz → uygulamaya geçmeden önce temel durumları ve uç durum kontrollerini ekleyin
# 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}')Mülakatlarda Örüntü Tanımayı İfade Etme
Mülakatlarda örüntü tanımanızı sözlü olarak ifade etmek uzmanlığınızı gösterir ve yanlış yoldaysanız mülakat yapan kişiye sizi yönlendirme fırsatı verir. Şu yapıdaki ifadeleri kullanın:
- 'Dizinin sıralı olduğunu fark ediyorum; bu nedenle ikili aramayı düşünüyorum...'
- 'Problem en büyük alt diziyi istiyor; bu, klasik bir Kadane algoritması problemidir...'
- 'Olası tüm alt kümelere ihtiyacımız var; bu da özyineleme ağacıyla geri izlemeyi düşündürüyor...'
- 'n ≤ 20 kısıtı, 2^n = 1M değerinin kabul edilebilir olduğunu gösteriyor; dolayısıyla bit maskesi DP'si işe yarayabilir...'
Örüntüyü açıkladıktan sonra tek bir kod satırı yazmadan önce zaman ve alan karmaşıklığından söz edin. Bu, uygulamaya geçmeden önce verimliliği düşündüğünüzü gösterir.
# 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']
)Örüntü Tanıma Söz Dağarcığınızı Geliştirme
Örüntü tanımayı geliştirmenin en hızlı yolu problemleri rastgele değil, temalı gruplar hâlinde çözmektir. Bir hafta yalnızca kayan pencere problemlerine ayırın. Ardından iki işaretçili problemlere, sonra da DP problemlerine geçin. Aynı türden 20 problem çözmek, o örüntüyü bir bakışta tanımanızı sağlayacak sezgiyi hızla geliştirir.
Her problemden sonra tek satırlık bir 'örüntü notu' yazın: problem ipucunu ve bunun tetiklediği örüntüyü kaydedin. Kendi kısa başvuru kılavuzunuzu oluşturun. Temalı gruplar hâlinde 200 problem çözdükten sonra mülakat problemlerinin yaklaşık %90'ını 30 saniyeden kısa sürede tanıyacaksınız — kalan %10'luk bölüm, deneyimli mühendisler için bile dikkatli analiz gerektirir.
# 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"]}')Hızlı Kontrol
Bu dersteki Veri Yapıları & Algoritmalar — Kodlama Mülakatına Hazırlık kavramlarını ne kadar anladığınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: örüntü tanıma, problem ipuçlarını algoritma aileleriyle eşler — sıralı dizi ikili aramayı, 'tüm alt kümeler' geri izlemeyi, 'minimum maliyet' ise DP'yi gösterir; n kısıtı kabul edilebilir karmaşıklığı gösterir: n ≤ 20, O(2^n) kullanımına izin verir; n ≤ 10^6 ise O(n log n) veya daha iyisini gerektirir ve kod yazmadan önce örüntüyü ve karmaşıklığı sözlü olarak ifade etmek uzmanlığınızı gösterir ve mülakat yapan kişinin geri bildirim vermesini sağlar. Sırada, örüntü tanımayı kolay ve orta zorlukta, süre tutulan deneme mülakatı problemleriyle uygulamaya geçiriyoruz.
Sıkça Sorulan Sorular
“Örüntü Tanıma Kopya Kâğıdı” dersi ücretsiz mi?
Evet — “Örüntü Tanıma Kopya Kâğıdı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA Interview Prep kursu toplamda 4 dersten oluşur.
“Örüntü Tanıma Kopya Kâğıdı” dersinde ne öğreneceğim?
15 yaygın problem işaretini (sıralı dizi, tüm kombinasyonlara ihtiyaç duyma, kısıt altında değeri en üst düzeye çıkarma vb.) onları en hızlı çözen algoritma örüntüleriyle eşleştirin. DSA Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DSA Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Örüntü Tanıma Kopya Kâğıdı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DSA Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Örüntü Tanıma Kopya Kâğıdı
- Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler
- Kenar Durumlarını Ele Alma ve Mülakatçıyla İletişim
- Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü