İçeriğe atla
ΣDSA Patterns
Menü
Dil

Karmaşıklık

Karmaşıklık ve Big-O

Kod mülakatları için pratik bir giriş: Big-O ne demek, yaygın sınırlar, döngüleri nasıl analiz edersin, alan karmaşıklığı nerede devreye girer.

Big-O neyi ölçer?

Zaman karmaşıklığı, girdi boyutu n büyüdükçe algoritmanın yaptığı işin nasıl ölçeklendiğini söyler. Mülakatlarda genelde en kötü durum (worst-case) Big-O’su istenir; bazen ortalama durum da konuşulur (ör. hash map).

Big-O sabit çarpanları ve düşük dereceli terimleri yok sayar: 3n² + 100n + 5 → O(n²). Amaç “bu yaklaşım büyüdükçe yaşar mı?” sorusuna hızlı cevap vermektir.

Yaygın sınırlar

Big-OAdTipik örnekNe zaman
O(1)SabitDizi indeksi, hash map ortalama get/putGirdi boyutundan bağımsız iş
O(log n)Logaritmikİkili arama, dengeli ağaçta aramaHer adımda arama uzayını yarıya indir
O(n)DoğrusalTek geçiş, dizi taramaHer öğeye bir kez bak
O(n log n)Lineeritmikİyi sıralamalar (merge/heap), birçok “sırala + tara”Sıralama veya böl-yönet birleştirme
O(n²)Kareselİç içe iki döngü, naif çift kontrolüHer çift / her i,j
O(2ⁿ)ÜstelAlt küme tam sayım, naif özyinelemeHer eleman dahil/hariç
O(n!)FaktöriyelTüm permütasyonlarSıra sayımı (n küçük olmalı)

Döngüleri nasıl sayarsın?

Alan (space) karmaşıklığı

Girdi dışında ne kadar ek bellek kullanıyorsun? Çıktı dizisi bazen sayılır bazen “gerekli çıktı” diye ayrı tutulur, mülakatta netleştir. Özyineleme yığını da alandır: derinlik d ise çoğu zaman O(d) ek alan.

Yapılara göre kaba tablo

YapıErişimAramaEklemeNot
Dizi / listeO(1)O(n)O(n)**Sona ekleme amortize O(1) olabilir
Hash map / set-O(1) ort.O(1) ort.Kötü hash / çarpışmada O(n)
Sıralı diziO(1)O(log n)O(n)İkili arama mümkün
Yığın / kuyrukO(1) uçO(n)O(1)Uç işlemleri
Min/max heapO(1) minO(n)O(log n)Top-K ve öncelik
Dengeli BST-O(log n)O(log n)Sıralı gezinme

n = 1000’de ne kadar iş?

Aşağıdaki logaritmalar 2 tabanlıdır; yalnızca sabiti değiştirir. n = 1000 iken log2(n) yaklaşık 10. Naif özyinelemeli Fibonacci Θ(φⁿ), kabaca O(1.618ⁿ). Buna O(2ⁿ) demek gevşek bir üst sınırdır. En kötü durumu söyle; ortalama veya amortize diyorsan belirt.

Big-On = 1000Not
O(1)1Dizi indeksi. Hash get/put ortalama; kötü durumda O(n).
O(log n)~10İkili arama, dengeli BST.
O(n)1.000Tek geçiş.
O(n log n)~10.000Mergesort, heapsort, Timsort.
O(n²)1.000.000İç içe iki geçiş.
O(n³)1.000.000.000Floyd–Warshall, üç iç içe geçiş.
O(2ⁿ)2^1000Alt küme dahil/hariç. Her alt kümeyi somutlamak Θ(n · 2ⁿ).
O(n!)1000!Tüm permütasyonlar.

Cebir

  1. Sabitleri düş: O(2n) → O(n).
  2. Düşük terimleri düş: O(n² + n) → O(n²).
  3. Farklı girdiler ayrı kalır: a sonra b döngüsü O(a + b).
  4. İç içe iş çarpar: dışarıda O(n), içeride O(m) → O(n · m).
  5. Ardışık iş toplanır: O(n) sonra O(m) → O(n + m).

Erken çıkış en iyi durumu iyileştirebilir. En kötü durum Big-O hâlâ en kötü yoldur.

Ek alan kaynakları

Yardımcı alan girdiyi dışarıda tutar. Söylerken belirt. Çıktı depolaması bazen ayrı sayılır; mülakatçının hangisini istediğini sor. Yerinde demek O(1) ek alan demektir. Girdinin kendisi yine O(n) kaplar.

KaynakEk alan
Sabit sayıda skalerO(1)
Uzunluğu n olan dizi veya dizgiO(n)
ÖzyinelemeO(derinlik) yığın
Özyinelemeli ikili aramaO(log n) yığın. Döngü biçimi O(1).
Girdinin hash map’iO(n)

Amortize maliyetler

α(n) ters Ackermann fonksiyonudur. Mülakatta göreceğin her yapıda en fazla 4’tür. Zorlanmış çarpışma zincirli bir hash tablosu çağrı başına O(n) kalır. Amortize O(1) çalışan bir hash varsayar.

İşlemEn kötü çağrıAmortizeKoşul
Dinamik dizi eklemeO(n)O(1)Geometrik yeniden boyutlandırma
Hash tablo insertO(n)O(1)Düzgün hash + yeniden boyutlandırma
Union-findO(n)O(α(n))Rank/size birleşimi ve path compression
Splay ağacıO(n)O(log n)Bir işlem dizisi üzerinden amortize

Üst tabloda yazılmayan ayrımlar

Canlı tablo dizi, hash map, sıralı dizi, yığın/kuyruk, heap ve dengeli BST’yi listeler. Aşağıdakiler o satırların açılımı.

YapıİşlemZamanNot
DiziOrtaya ekle / silO(n)Elemanlar kayar
Tekli bağlı listeBaşta ekle / silO(1)
Tekli bağlı listeTuttuğun düğümden sonra ekleO(1)Düğümü bulmak ayrı O(n)
Tekli bağlı listeTuttuğun düğümü silO(n)Önceki düğüm gerekir; kuyrukta değilsen halefin değerini kopyalayabilirsin
Çift bağlı listeTuttuğun düğümü silO(1)
Heapn öğeden kurO(n)Floyd bottom-up; n push değil

Sıralama

Stabil, eşit anahtarların orijinal sırasını korur demektir.

AlgoritmaEn iyiOrtalamaEn kötüEk alanStabilNot
TimsortO(n)O(n log n)O(n log n)O(n)EvetPython’un çalıştırdığı
InsertionO(n)O(n²)O(n²)O(1)EvetNeredeyse sıralı girdide en iyi
BubbleO(n)O(n²)O(n²)O(1)EvetO(n) en iyi durum swapped-flag ister
SelectionO(n²)O(n²)O(n²)O(1)Hayır
MergesortO(n log n)O(n log n)O(n log n)O(n)Evet
HeapsortO(n log n)O(n log n)O(n log n)O(1)Hayır
QuicksortO(n log n)O(n log n)O(n²)O(log n) ort.HayırEn kötü özyineleme derinliği O(n), ekstra alan da O(n)
CountingO(n + k)O(n + k)O(n + k)O(k)Evetk anahtar aralığı; tamsayı anahtar
Radix (LSD)O(d(n + b))O(d(n + b))O(d(n + b))O(n + b)Evetd basamak, b taban
BucketO(n + k)O(n + k)O(n²)O(n)Kova içi sıralama stabiyseOrtalama düzgün yayılım varsayar

Graflar

Süreler komşuluk listesi varsayar. Komşuluk matrisi DFS ve BFS’i O(V²) yapar. Fibonacci heap ile Dijkstra O(E + V log V) olur; mülakatlar ikili-heap sınırını bekler. Döngü içeren bir grafa topolojik sıralama geçerli bir sıra üretmez. Kahn, kalan indegree’li düğüm bırakarak bunu bildirir.

AlgoritmaZamanEk alanGerekirKalıp
DFSO(V + E)O(V)graph-dfs
BFSO(V + E)O(V)Ağırlıksız en kısa yol (hop)grid-graph-bfs
DijkstraO((V + E) log V)O(V)Negatif olmayan ağırlık; ikili heap sınırıshortest-path-weighted
Bellman–FordO(VE)O(V)Negatif ağırlık serbest; V−1 turdan sonra bir tur daha negatif döngü yakalarshortest-path-weighted
Floyd–WarshallO(V³)O(V²)Tüm çiftler. Negatif kenar serbest. dist[i][i] < 0 negatif döngü—
Topolojik sıralamaO(V + E)O(V)Yönlü asiklik graftopological-sort
KruskalO(E log E)O(V)Yönsüz. Kenarları sırala, sonra union-findminimum-spanning-tree
PrimO(E log V)O(V)Yönsüz ve bağlı. İkili heap. Yoğun graf + dizi O(V²)minimum-spanning-tree

Mülakat ipuçları

Sonraki adım

Temel kalıplara geç: yol haritası, kalıp listesi, veya kaynaklar (platformlar, kitaplar, referanslar), veya dil kartları: Python, TypeScript, C#.

Big-O eğrilerini görsel görmek için matematik temelleri - büyüme hızları, logaritmalar ve toplamlar sayfalarına bak.