Veri Yapılarının Temeli: Diziler (Arrays) Nedir, Neden Önemlidir?

Merhaba sevgili yazılım meraklıları! Bugün sizlerle yazılım dünyasının en temel yapı taşlarından biri olan diziler (arrays) hakkında konuşmak istiyorum. Eğer kod yazmaya yeni başladıysanız veya veri yapılarını anlamaya çalışıyorsanız, dizilerle karşılaşmanız kaçınılmazdır.

Bu yazımda, dizilerin ne olduğunu, neden bu kadar yaygın ve önemli olduklarını, farklı programlama dillerinde nasıl kullanıldıklarını ve kendi yazılım yolculuğumda edindiğim tecrübelerle harmanlayarak sizlere aktarmaya çalışacağım. Hazırsanız, bu temel ama güçlü veri yapısının derinliklerine inelim.

Peki Nedir Bu Dizi (Array) Tam Olarak?

Veri Yapılarının Temeli: Diziler (Arrays) Nedir, Neden Önemlidir?

En basit haliyle dizi, aynı türden birden fazla veriyi tek bir değişken adı altında düzenli bir şekilde saklamanıza olanak tanıyan bir veri yapısıdır. Şöyle düşünün: Kitaplarınızı tek tek odanın farklı yerlerine koymak yerine, onları numaralandırılmış raflara dizdiğiniz bir kitaplık gibi. İşte o kitaplık bir dizidir, kitaplar da dizinin elemanları.

Dizideki her elemanın kendine özgü bir konumu yani indeksi vardır. Bu indeksler sayesinde istediğiniz elemana doğrudan ve hızlı bir şekilde ulaşabilirsiniz. Elemanlar genellikle bellekte art arda sıralanır, bu da erişimi çok verimli hale getirir.

Programlamada Dizilere Neden İhtiyaç Duyarız?

Belki aklınıza şu soru geldi: “Her veri için ayrı bir değişken tanımlasak olmaz mı?” Elbette olur, ama bu pratik olmaz. Özellikle çok sayıda benzer veriyi (örneğin, bir sınıftaki öğrencilerin notları, bir oyundaki düşman listesi, bir resimdeki pikseller) yönetmeniz gerektiğinde, her biri için ayrı bir değişken tanımlamak kodunuzu okunaksız, yönetilmesi zor ve verimsiz hale getirir.

Dizilerin Temel Katkıları

  • Verimli Veri Depolama: Benzer verileri tek bir yapıda tutarak bellek kullanımını optimize ederler.
  • Düzenli Organizasyon: Elemanlar indekslerine göre sıralı olduğu için verilere erişim ve yönetim kolaylaşır.
  • Hızlı Erişilebilirlik: İndeksler sayesinde herhangi bir elemana doğrudan ulaşım (Random Access) mümkündür, bu da performansı artırır.
  • Veri İşlemeyi Basitleştirme: Büyük veri setleri üzerinde döngülerle işlem yapmak diziler sayesinde çok daha kolaydır.
  • Kodun Akıcılığı ve Okunabilirliği: Tek bir değişken adı altında birden çok veriyi yönetmek, kodunuzu daha temiz ve anlaşılır hale getirir.

Dizi Nasıl Başlatılır (Initialize Edilir)?

Bir dizi kullanmaya başlamadan önce onu “başlatmanız” yani bellekte yer ayırmanız ve başlangıç değerlerini vermeniz gerekir. Bu işlem programlama diline göre ufak farklılıklar gösterebilir ama temel mantık aynıdır.

Farklı Dillerde Dizi Başlatma Örnekleri

Gelin birkaç popüler dilde dizi başlatma örneklerine bakalım:

C++: Dizi boyutu belirtilir ve isteğe bağlı olarak başlangıç değerleri atanabilir.

// Bildirim sırasında değer atama
int sayilar[5] = {1, 2, 3, 4, 5};

// Boyutu belirtip sonra değer atama
int baskaSayilar[3];
baskaSayilar[0] = 10;
baskaSayilar[1] = 20;
baskaSayilar[2] = 30;

Python: Python’da diziler genellikle listelerle temsil edilir. Liste boyutu dinamiktir ve başlangıç değerleri köşeli parantez içinde verilir.

# Doğrudan değerlerle başlatma
sayilar_listesi = [1, 2, 3, 4, 5]

Boş liste başlatıp sonradan ekleme
baska_liste = []
baska_liste.append(10)
baska_liste.append(20)

JavaScript: JavaScript’te de listeye benzer şekilde köşeli parantez kullanılır ve boyut dinamiktir.

// Doğrudan değerlerle başlatma
let sayilarDizisi = [1, 2, 3, 4, 5];

// Boş dizi başlatıp sonradan ekleme
let baskaDizi = [];
baskaDizi.push(10);
baskaDizi.push(20);

Dizilerde İndeksleme Mantığı

Dizinin en can alıcı noktalarından biri indeksleme sistemidir. Bir dizideki elemanlara ulaşmak, güncellemek veya silmek için indekslerini kullanırız. İndeks, elemanın dizideki sıra numarası gibidir.

İndeksleme Türleri

Programlama dillerinin çoğunda gördüğümüz yaygın indeksleme türleri şunlardır:

  • Sıfır Tabanlı İndeksleme (Zero-based Indexing): Dizinin ilk elemanının indeksi 0’dır. Sonraki elemanlar 1, 2, 3… şeklinde devam eder. C, C++, Python, Java, JavaScript gibi popüler dillerin çoğu bu sistemi kullanır. Örneğin, 5 elemanlı bir dizide indeksler 0, 1, 2, 3, 4’tür.
  • Bir Tabanlı İndeksleme (One-based Indexing): Dizinin ilk elemanının indeksi 1’dir. Sonraki elemanlar 2, 3… şeklinde devam eder. Bazı eski dillerde veya özel durumlarda karşımıza çıkabilir ama modern programlamada daha az yaygındır. 5 elemanlı bir dizide indeksler 1, 2, 3, 4, 5 olur.
  • Negatif İndeksleme (Negative Indexing): Dizinin sonundan başlayarak elemanlara erişim sağlar. Son elemanın indeksi -1, sondan bir öncekini -2’dir ve bu böyle devam eder. Özellikle Python gibi dillerde oldukça kullanışlıdır ve dizinin boyutunu bilmeden son elemanlara kolayca ulaşmanızı sağlar. 5 elemanlı bir dizide indeksler -5, -4, -3, -2, -1 şeklinde olabilir.

Veri Yapılarında Dizi Çeşitleri

Diziler sadece tek bir satır halinde olmak zorunda değildir. İhtiyaca göre farklı boyutlarda ve özelliklerde diziler tanımlayabiliriz. Tecrübelerime göre en sık karşılaşacağınız dizi tipleri şunlardır:

Yaygın Dizi Tipleri

  • Tek Boyutlu Diziler (One-Dimensional Array): Az önce bahsettiğimiz, elemanların doğrusal bir sıra halinde durduğu temel dizi türüdür. Listeler veya vektörler gibi verileri saklamak için kullanılır.
  • Çok Boyutlu Diziler (Multi-Dimensional Array): İki veya daha fazla boyuta sahip dizilerdir. En yaygın olanı 2 boyutlu dizilerdir ki bunlar genellikle matris veya tablo şeklinde verileri temsil etmek için kullanılır. 3 boyutlu diziler de küp şeklinde veriler için kullanılabilir.
  • Statik Diziler (Static Array): Boyutu bildirim anında belirlenen ve program çalışırken değiştirilemeyen dizilerdir. Bellekteki yerleri sabittir.
  • Dinamik Diziler (Dynamic Array): Boyutu program çalışırken ihtiyaca göre büyüyüp küçülebilen dizilerdir. Arka planda farklı mekanizmalar (genellikle daha büyük bir statik diziye kopyalama) kullanarak bu esnekliği sağlarlar. Python’daki listeler veya C++’daki std::vector buna örnektir.

Çeşitli Dizi Tiplerine Örnekler (C++)

Çok boyutlu dizilerin C++’taki kullanımına göz atalım:

2 Boyutlu Dizi (Matris):

#include <iostream>

int main() {
    // 3x3 boyutunda bir 2D dizi (matris) tanımlama ve başlatma
    int matris[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    std::cout << "2D Dizi Elemanlari:" << std::endl;
    for(int i = 0; i < 3; i++) { // Satirlar
        for(int j = 0; j < 3; j++) { // Sutunlar
            std::cout << matris[i][j] << " ";
        }
        std::cout << std::endl; // Her satir sonu alt satira gec
    }

    return 0;
}

Bu örnekte, matris[i][j] ifadesiyle i. satırın j. sütunundaki elemana erişiyoruz. Çıktısı bir tablo gibi görünecektir.

3 Boyutlu Dizi:

#include <iostream>

int main() {
    // 2x2x2 boyutunda bir 3D dizi tanımlama ve başlatma
    int kup[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};

    std::cout << "3D Dizi Elemanlari:" << std::endl;
    for(int i = 0; i < 2; i++) { // Boyut 1
        for(int j = 0; j < 2; j++) { // Boyut 2
            for(int k = 0; k < 2; k++) { // Boyut 3
                std::cout << kup[i][j][k] << " ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }

    return 0;
}

Bu örnekte ise kup[i][j][k] şeklinde üç indeks kullanarak elemanlara erişiyoruz. Çıktı, iç içe geçmiş yapıyı yansıtacaktır.

Python’da Temel Dizi (Liste) İşlemleri

Python’da listeler dizilere karşılık gelir ve üzerinde birçok işlem yapabiliriz. İşte en temel olanları:

  • Elemanlara Erişme:

    Belirli bir indeksteki elemanın değerini almak için kullanılır.

    # Elemana erisim ornegi
    sayilar = [10, 20, 30, 40, 50]
    Ucuncu elemana erisme (indeks 2)
    eleman = sayilar[2]
    Elemani yazdırma
    print(eleman)

    Çıktı: 30

  • Elemanları Güncelleme:

    Belirli bir indeksteki elemanın değerini değiştirmek için kullanılır.

    # Eleman guncelleme ornegi
    sayilar = [10, 20, 30, 40, 50]
    Ikinci elemani (indeks 1) 25 ile guncelleme
    sayilar[1] = 25
    Guncellenmis listeyi yazdırma
    print(sayilar)

    Çıktı: [10, 25, 30, 40, 50]

  • Ekleme (Insertion):

    Dizinin belirli bir indeksine yeni bir eleman ekler. Mevcut elemanlar sağa kaydırılır.

    # Eleman ekleme ornegi
    sayilar = [10, 20, 30, 40, 50]
    2. indekse (ucuncu siraya) 35 ekleme
    sayilar.insert(2, 35)
    Guncellenmis listeyi yazdırma
    print(sayilar)

    Çıktı: [10, 20, 35, 30, 40, 50]

  • Silme (Deletion):

    Dizinin belirli bir indeksindeki elemanı siler. Kalan elemanlar sola kaydırılır.

    # Eleman silme ornegi
    sayilar = [10, 20, 30, 40, 50]
    Dorduncu elemani (indeks 3) silme
    del sayilar[3]
    Guncellenmis listeyi yazdırma
    print(sayilar)

    Çıktı: [10, 20, 30, 50]

  • Dolaşma (Traversal):

    Dizideki her elemanı sırayla ziyaret etme işlemidir. Genellikle döngüler kullanılır.

    # Dizi icinde dolasma ornegi
    sayilar = [10, 20, 30, 40, 50]
    Dizi icinde dolasma
    for sayi in sayilar:
        print(sayi)

    Çıktı:

    10
    20
    30
    40
    50
  • Arama (Search):

    Belirli bir elemanın dizide olup olmadığını ve varsa indeksini bulma işlemidir.

    # Eleman arama ornegi
    sayilar = [10, 20, 30, 40, 50]
    30 sayisinin dizide olup olmadigini kontrol etme
    if 30 in sayilar:
        indeks = sayilar.index(30)
        print(f"Eleman 30, {indeks}. indekste bulundu")
    else:
        print("Eleman bulunamadi")

    Çıktı: Eleman 30, 2. indekste bulundu

  • Sıralama (Sorting):

    Dizideki elemanları belirli bir düzene göre (örn: küçükten büyüğe) sıralama işlemidir.

    # Dizi siralama ornegi
    sayilar = [40, 10, 30, 20, 50]
    Dizinin siralanmis bir versiyonunu olusturma
    siralanmis_sayilar = sorted(sayilar)
    Siralanmis listeyi yazdırma
    print(siralanmis_sayilar)

    Çıktı: [10, 20, 30, 40, 50]

Farklı Programlama Dillerinde Dizi Örnekleri

Dizilerin temel mantığı aynı olsa da, sözdizimleri (syntax) dilden dile değişir. Bu farklılıkları görmek, hangi dilde çalışırsanız çalışın dizi mantığını uygulamanıza yardımcı olur. İşte birkaç dilde daha temel dizi kullanımları:

C++ Dizi Örneği

#include <iostream>

int main() {
    int sayilar[5] = {10, 20, 30, 40, 50};

    // Elemana erisim
    std::cout << "Ucuncu eleman: " << sayilar[2] << std::endl;

    // Elemani guncelleme
    sayilar[1] = 25;

    // Dizi icinde dolasma
    for(int i = 0; i < 5; i++) {
        std::cout << sayilar[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Açıklama: 5 elemanlı bir tam sayı dizisi oluşturuldu, üçüncü elemana (indeks 2) erişildi, ikinci eleman (indeks 1) güncellendi ve tüm dizi elemanları yazdırıldı.

Çıktı:

Ucuncu eleman: 30
10 25 30 40 50

Python Dizi Örneği

# Python'da listeler dizilere karsilik gelir
sayilar = [10, 20, 70, 40, 50]

Elemana erisim
print("Ucuncu eleman:", sayilar[2])

Elemani guncelleme
sayilar[1] = 25

Dizi icinde dolasma
for sayi in sayilar:
    print(sayi, end=" ")
print() # Yeni satir icin

Açıklama: Bir Python listesi oluşturuldu, üçüncü elemana (indeks 2) erişildi, ikinci eleman (indeks 1) güncellendi ve tüm liste elemanları yan yana yazdırıldı.

Çıktı:

Ucuncu eleman: 70
10 25 70 40 50

Java Dizi Örneği

public class Main {
    public static void main(String[] args) {
        // Tam sayi dizisi olusturma
        int[] sayilar = {10, 20, 30, 40, 50};

        // Elemana erisim
        System.out.println("Ucuncu eleman: " + sayilar[2]);

        // Elemani guncelleme
        sayilar[1] = 25;

        //

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir