Çok boyutlu diziler (MultiDimensional Arrays)
Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerindeki pek çok programlama dilinde birden fazla boyuttan oluşan dizilerin kullanılması mümkündür.
Örneğin bir ders çizelgesini, haftalık yemek listesini yada kişilerin aylık satışlarından oluşan bir tabloyu ele alalım. Günlük hayatta pek çok yerde tablolar kullanılmaktadır. Aynı zamanda matrisler (masfuf, matrix) matematikte küçümsenmeyecek bir öneme sahiptir.
İçerik
1. Çok boyutlu dizilerin tanımlanması
2. Çok boyutlu dizilerin kullanılması
3. İkiden çok boyutlu diziler
Tutulan bilgi her ne olursa olsun şayet tablo gibi iki boyutlu bir bilgiyse ya da daha fazla boyutu varsa bu bilginin tek boyutlu dizilerle modellenmesi ve işlenmesi güçtür.
Bunun yerine programlama dillerinde birden fazla boyuttan oluşan diziler (array) kullanılabilir. Bu dizilere çok boyutlu dizi (multi dimensional array) ismi verilir.
Çok boyutlu dizilerin tanımlanması
Günümüzde oldukça yaygın olan C yazım kurallarına göre ( C-syntax) bir matris aşağıdaki şekilde tanımlanabilir:
int a[3][3];
Yukarıdaki bu satırı, C/C++ programlama dilinde yazarsak hafızada bizim için 3×3 boyutlarında (3′e 3′lük) bir matris için yer açar (yani toplamda 9 hücreli ve 9 farklı sayı tutmaya yarayan bir yer) ve bu matrisin ismini a olarak tanımlar. Buradaki a matrisin (yani iki boyutlu dizinin (array)) ismidir ve herhangi bir değişken ismi verilebilir. Örnek olarak a ismi kullanılmıştır.
Yukarıdaki tanım satırını JAVA veya C# dillerinde aşağıdaki şekilde yapabiliriz:
int [][] a = new int[3][3];
Yukarıdaki bu yazımda farklı olan sadece yazılış şeklidir aslında yapılan iş aynıdır.
Yukarıdaki şekilde dizi tanımlandıktan sonra bu dizinin istenilen satır ve sütün değerlerine erişilebilir. Bu durumu aşağıdaki temsili resimden görebiliriz:
| a[0][0] | a[0][1] | a[0][2] |
| a[1][0] | a[1][1] | a[1][2] |
| a[2][0] | a[2][1] | a[2][2] |
Yukarıdaki resimde ilgili satır ve sütünlara erişmek için yazılması gereken indis değerleri verilmiştir. Yani örneğin aşağıdaki şekilde bir kod yazarsak:
a[1][2]=5;
Bu kod satırı ile a dizisinin 1. satırının 2. sütünuna 5 değeri konulmuş olur:
| 0 | 0 | 0 |
| 0 | 0 | 5 |
| 0 | 0 | 0 |
Burada önemli bir uyarı yapmak gerekir. Yukarıdaki satır ve sütün bilgileri tamamen bir kabule dayalıdır. Yani matrisin ilk indisi satır ikinci indisi sütün olarak gösterilmiş ve kullanılmıştır. Oysaki bilgisayarın hafızasında (RAM, Memory) tek boyutlu bir yapı vardır ve bizim iki boyutlu yapılarımız tek boyuta indirilerek tutulur. Dolayısıyla bizim satır ve sütün tutan indislerimiz bir kabule dayanır. Yani aslında aşağıdaki şekilde bir göterim de pek âlâ doğrudur:
| a[0][0] | a[1][0] | a[2][0] |
| a[0][1] | a[1][1] | a[2][1] |
| a[0][2] | a[1][2] | a[2][2] |
Yukarıdaki her iki göterimde bir kabule dayanır (aslında hafızada tek boyutlu olan bilginin iki boyutlu gösterilmesi bir kabuldür) ve programcı hangi kabulü isterse yapabilir ancak birisini kabul ederek bütün programcılık hayatı boyunca bu kabul üzerine devam edebilir.
Ancak programlama dili yazan arkadaşların (derleyiciler teorisi (compiler theory) gibi konular ile ilgilenen kişilerin) bu detayı bilmesinde yarar olabilir. Bu yüzden dilerlerse satır bazlı sıra (row major order) ve sütün bazlı sıra (column major order) başlıklı yazıları okuyabilirler.
Çok boyutlu dizilerin kullanılması
Çok boyutlu diziler genelde döngüler (loop) ile birlikte kullanılırlar. Bilindiği üzere aslında dizi (array) kavramının varlık sebebi birden fazla değişkeni hafızada bir arada tutmak ve kolayca ulaşmaktır. Dolayısıyla birden fazla değişkene erişirken indis numaralarından (satır ve sütün numaralarından) erişmek çoğu zaman avantajlı bir durumdur. İşte bu satır ve sütün numaraları üzerinde çalışan döngüler de çoğu zaman vaz geçilmez erişim araçlarıdır.
Örneğin aşağıdaki kodu ele alalım:
int a[5][5]; //diziyi tanimladik
//içine değer atıyoruz
for(int i = 0;i<5;i++){
for(int i = 0;i<5;i++){
a[i][j]=i+j;
}
}
//değerleri bastırıyoruz
for(int i = 0;i<5;i++){
for(int i = 0;i<5;i++){
printf("%d ",a[i][j]);
}
printf("\n");
}
Yukarıdaki kodun çıktısı aşağıdaki şekildedir:
0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8
Görüldüğü üzere yukarıdaki kod ile 5×5 boyularında bir matris tanımlanmış ve bu matrisin içerisine 01234 değerlerinden oluşan satır her seferinde 1 arttırılarak tekrarlanmıştır.
Yukarıda bu işlemi yapmaya yarayan kod değerlerin atandığı ve bastırıldığı iki bölüm olarak düşünülebilir ve her iki bölümde de dizinin elemanlarına döngüler marifeti ile erişilmiştir.
Şimdiye kadar anlatılan diziler iki boyutluydu. Programlama dillerinde ikiden yüksek sayıdaki boyutlarda dizi tanımlamak da mümkündür. Temel olarak programlama dillerinin çoğunda matrisin boyutunun bir limiti yoktur yani 3 boyutlu 4 boyutlu yada 100 boyutlu diziler tanımlanabilir.
Aslında dizi tanımı sırasında tek limit bilgisayarın donanım ve işletim sistemi kaynaklarından doğar. Yani örneğin bir tam sayı değerinin (int) 2 bayt (byte) kapladığı bir işletim sisteminde 10000×10000x10000 boyutlarına sahip 3 boyutlu bir dizi tanımlanırsa ( 104 104 104 = 1012 x 2 byte = 2×1012 byte ~ 1 terabyte) yaklaşık olarak 1TB yapar ki bu günümüz bilgisayarları için oldukça yüksek bir RAM miktarıdır.
Programlama dillerinde çok boyutlu diziler iki boyutlu dizilerde olduğu gibi boyut miktarını belirten ilave sayılar tanımlayarak gösterilir. Örneğin:
int a[5][5][5];
şeklindeki bir tanım C/C++ dillerinde veya
int [][][] a = new int[5][5][5];
şeklindeki bir tanım JAVA vey C# dillerinde 5×5x5 boyutlarında 3 boyutlu bir dizi tanımlamak için kullanılabilir.
Burdaki boyut sayısında bir limit bulunmamaktadır. Örneğin
int a[5][5][5][5][5];
şeklindeki bir satır ile 5 boyutlu (ve her boyutu 5 olan) bir dizi tanımlanabilir.
« MPI (Message Passing Interface , Mesaj Geçirme Arayüzü) | İki Parçalı Graflar (Bipartite Graphs) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Çok boyutlu diziler (MultiDimensional Arrays)' isimli yazı 30 Apr 2009 tarihinde, saat: 16:51 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 2132 defa okunmuştur.
Benzer yazıları C/C++, Derleyiciler, Programlama Dilleri, veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Çok boyutlu diziler (MultiDimensional Arrays)
Coloumn Major Order (Sütün bazlı sıralama)
Paralel Diziler (Parallel Arrays)
Row Major Order (Satır bazlı sıralama)
2 Boyutlu Şekil Dönüşümleri (2D Transformations)
İç içe döngüler (Nested Loops)
Homojen Koordinatlar (Homogenous Coordinates Form)
Pointer (Gösterici) ve Diziler (Arrays)
2 Boyutlu Döndürme (2D Rotation)
Öklit Mesafesi (Euclidean Distance, Euclidean Metric)
Homojen Koordinatlarla Şekil Değiştirm
Varlık-Durum Tablosu (Symbol Instance Table)
Doğrudan Çizim Algoritması (Direct Draw Algorithm , DDA)
Bağlantılar