Kodnos
Software Engineering

Alan Karmasikligi - Kodunuz Ne Kadar Bellek Kullaniyor?

Alan karmasikligi nedir ve neden onemlidir? Zaman-alan odunlesimini anlamak, ne zaman hiz icin bellek harcamak gerektigini bilmek ve algoritmanizin bellek kullanimini analiz etmek.

A
admin
6 Mar 20265 dk okuma18 görüntülenme
Alan Karmasikligi - Kodunuz Ne Kadar Bellek Kullaniyor?

Alan Karmaşıklığı Nedir? (Ve RAM'iniz Neden Önemli)

Algoritmanız hızlı. Harika. Ama kimsenin yeterince erken uyarmadığı bir şey var: hız denklemin sadece yarısıdır.

Bir tablo çizeyim. Bir milyon kaydı ışık hızında işleyen bir fonksiyonunuz var. O(n) zaman, güzel. Ama bunu yaparken tüm veri setinin bellekte bir kopyasını oluşturuyor. Ve bir kopyasını daha. Ve bir tane daha. Aniden sunucunuzun RAM'i bitiyor, uygulamanız çöküyor ve gece saat 3'te bir OutOfMemoryError'a bakıp neyin yanlış gittiğini merak ediyorsunuz.

Alan karmaşıklığı, algoritmanızın girdi büyüdükçe kullandığı ekstra belleği ölçer. Tıpkı zaman karmaşıklığı gibi, Big O notasyonu kullanarak ifade ederiz.

Buradaki anahtar kelime ekstra. Genellikle girdinin kendisini saymayız — sadece algoritmanızın işini yaparken ayırdığı ek belleği önemseriz. n boyutunda yeni bir dizi oluşturuyorsanız, bu O(n) ekstra alan demektir. Sadece birkaç değişken kullanıyorsanız, bu O(1) ekstra alandır.

Zaman-Alan Takası: Temel Seçim

İşte her geliştiricinin eninde sonunda zor yoldan öğrendiği bir şey: neredeyse her zaman daha fazla bellek kullanarak kodu hızlandırabilir ve daha az bellek kullanarak kodu yavaşlatabilirsiniz.

Buna zaman-alan takası denir ve her yerde karşınıza çıkar:

  • Tekrar bulma: O(1) alanla iç içe döngüler (O(n²) zaman) veya O(n) alanla hash set (O(n) zaman). Daha fazla bellek = daha hızlı.
  • Önbellekleme/Memoizasyon: Hesaplanan sonuçları saklayarak tekrar hesaplamayı önleyin. Daha fazla bellek = ÇOK daha hızlı.
  • Veritabanı indeksleri: Sorguları hızlandırmak için ekstra disk alanı. Aynı prensip.
  • Bedava öğle yemeği yoktur. Bu takası anlamak, akıllı mimari kararlar vermenin yoludur.

    Uygulamada Görün

    Aşağıdaki interaktif görselleştirme, farklı yaklaşımların alan karmaşıklığını gösteriyor. Girdi büyüdükçe bellek kullanımının nasıl değiştiğini görmek için adımları takip edin:

    <iframe src="/tr/dsa/embed.html?topic=1&lang=tr" width="100%" height="200" style="border:none;border-radius:12px;overflow:hidden" loading="lazy"></iframe>


    Alan Karmaşıklığı Seviyeleri (Gerçek Örneklerle)

    O(1) Alan — Sabit: Minimalist

    Ne anlama gelir: Algoritmanız, girdi boyutundan bağımsız olarak aynı küçük miktarda ekstra bellek kullanır. Birkaç değişken, bir sayaç, bir bayrak — hepsi bu.

    Gerçek örnek: Bir dizinin toplamını bulma. Dizi ne kadar büyük olursa olsun sadece bir değişkene ihtiyacınız var.

    Ne zaman kullanmalı: Yapabildiğinizde her zaman O(1) alanı tercih edin.

    O(n) Alan — Doğrusal: Adil Takas

    Ne anlama gelir: Algoritmanız, girdiyle orantılı olarak büyüyen ekstra veri oluşturur. Genellikle n boyutunda yeni bir dizi, hash set veya sözlük.

    Gerçek örnek: Hash set kullanarak tekrarları kaldırma. Tüm elemanlar benzersizse set n boyutuna kadar büyüyebilir.

    Ne zaman kullanmalı: Hız artışına ihtiyacınız olduğunda ve belleğiniz varsa. En yaygın takas.

    O(n²) Alan — Karesel: Dikkatli Kullanın

    Ne anlama gelir: Algoritmanız n × n boyutunda 2B bir yapı oluşturur. Bellek, girdinin karesiyle büyür.

    Gerçek örnek: Tüm şehir çiftleri arasında mesafe matrisi, dinamik programlama tabloları.

    Ne zaman kullanmalı: Yalnızca problem gerçekten 2B yapı gerektirdiğinde. O(n)'ye indirebilir misiniz diye sorun.


    Kod Örnekleri

    Python

    Python
    # O(1) Alan — sadece sabit değişkenler
    def total_sum(arr: list) -> int:
        total = 0              # Sadece 1 değişken — ekstra bellek yok
        for num in arr:        # her eleman üzerinde döner
            total += num       # Her sayıyı toplama ekle
        return total

    # O(n) Alan — girdiyle orantılı yeni liste def reverse_copy(arr: list) -> list: result = [] # Yeni liste n boyutuna büyür for i in range(len(arr) - 1, -1, -1): result.append(arr[i]) return result

    # O(n²) Alan — n × n ızgara def make_grid(n: int) -> list: return [[0] * n for _ in range(n)] # n satır × n sütun = O(n²)

    Java

    Java
    // O(1) Alan — sadece sabit değişkenler
    public static int totalSum(int[] arr) {
        int total = 0;
        for (int num : arr) total += num;
        return total;
    }

    // O(n) Alan — girdiyle orantılı yeni dizi public static int[] reverseCopy(int[] arr) { int[] result = new int[arr.length]; // O(n) ekstra alan for (int i = 0; i < arr.length; i++) { result[i] = arr[arr.length - 1 - i]; } return result; }

    // O(n²) Alan — n × n ızgara public static int[][] makeGrid(int n) { return new int[n][n]; // n × n = O(n²) alan }


    Alan Karmaşıklığını Analiz Etme

    1. Ekstra veri yapılarını sayın. Yeni diziler, setler, mapler, matrisler. 2. Girdiyi yok sayın. Sadece ek belleği sayarız. 3. Özyinelemeye dikkat. Her özyinelemeli çağrı yığına çerçeve ekler. n seviye = O(n) alan. 4. n ile büyüyüp büyümediğini kontrol edin. Tek değişken = O(1). n boyutlu dizi = O(n). n×n matris = O(n²). 5. "Azaltabilir miyim?" diye sorun. Yerinde değiştirme O(1), sadece mevcut satır O(n).


    Pratik Problemler

  • Move Zeroes — Yerinde değiştirerek O(1) alanda yapabilir misiniz?
  • Valid Anagram — O(n) alan (hash map) vs O(1) alan (sıralama)
  • Reverse String — Klasik yerinde O(1) alan alıştırması
  • Flatten 2D Vector — İteratorünüz ne kadar ekstra alan gerektirir?
  • Clone Graph — Neden O(n) alan gerektirir?

  • Sonuç

    Alan karmaşıklığı, çok fazla geliştiricinin görmezden geldiği bulmacanın diğer yarısıdır:

  • O(1) alan ideal — ekstra belleğe neredeyse dokunmaz
  • O(n) alan standart takas — daha hızlı zaman, daha fazla bellek
  • O(n²) alan pahalı — yalnızca gerekli olduğunda
  • Zaman-alan takası gerçektir. Daha hızlı genellikle daha fazla bellek demektir.
  • Özyineleme alan maliyetini gizler. Her çağrı yığın alanı tüketir.

Bir sonraki yazıda her şeyi bir araya getiriyorum: Big O kopya kağıdı — her karmaşıklık için hızlı başvuru kılavuzu.

5 DkBu makaleyi paylaşın
Oğuzhan Berke Özdil
Yazar

Oğuzhan Berke Özdil

Çocukluğumdan beri bilgisayarlarla iç içeyim. Bu sitede, yazılımı daha sağlam temellerle öğrenme yolculuğumda edindiğim bilgi ve deneyimleri paylaşıyorum. AGH University of Krakow'da Bilgisayar Bilimleri lisansımı tamamladım ve şu anda aynı üniversitede AI & Data Analysis odaklı yüksek lisansıma devam ediyorum.

Yorumlar (