Veri Yapıları ve Algoritmalar

Ömür Buruk
@omurburuk
Published in
5 min readApr 19, 2020

Bu yazımızda veri yapılarını, yazılımda verinin ifade ediliş şekillerini, kullanım ve ilişki yapılarını ele alacağız. Devamında algoritma nedir, neden gereklidir. Bunları inceleyeceğiz. Veri yapıları için C# programlama dili üzerinden örnekler vereceğiz.

Bir yazılımın olmazsa olmazı veridir. Diğer bir ifadeyle yazılım girdi olan veriyi belirli kural ve yordamlardan geçirip sonuç elde işlemidir. Veri belli başlı bir nitelikten oluşabilir veya niteliklerin bir bütün hali ile ifade edilebilir.

Aşağıda örnekler ile verinin minimum niteliklerle oluşturulmasını sağlayan değişken türlerini ele alalım.

string ad = “Ahmet”;
int boy = 180;
byte ayakNumarasi = 42;
bool dogruMu = true;
float kilo = 70.4f; //± 3.4*1038 (reel sayı)
double hacim = 1.4d; //± 1.7*10308 (reel sayı)
decimal yukseklik = 1.2m; //± 7.9*1028 (reel sayı)
char karakter = ‘a’;

Belirttiğimiz bazı değişken türleri yazılım verinin ve veri yapılarının oluşmasını sağlayan yapı taşlarıdır. Bu yapı taşlarından yazılımda farklı bağlantılar ile kullanılmasıyla birlikte veri yapıları oluşmaktadır. Aşağıda veri yapılarına bazı örnekler vermekteyim.

Liste ve Bağlantılı Liste (Link List) : Listeler yukarıdaki değişken türlerinin veya bu değişken türlerinin birleşiminden oluşan verinin genellikle anlamlı bir bütün oluşturmasına bağlı olarak birlikte ve sıralı bir şekilde kullanılmasını sağlayan kümedir.
Örnek:
ad: bir değişken ve değeri “Ahmet”; numara: bir değişken ve değeri 12;
Öğrenci bir değişken ve içerisinde ad ve numara değişkenlerini barındırır. Burada ifade edilen veri Öğrenci olmakla birlikte kendi içerisinde alt değişkenleri bulunmaktadır.
Öğrenci1: { ad:”Ahmet”, numara:12} , Öğrenci2 : {ad:”Mehmet”, numara:13
Sınıf Listesi : Öğrenci1=>Öğrenci2=>Öğrenci3 …=>Öğrenci(n)
n burada sonlu bir değeri ifade eder. Öğrenci1 bu listenin ilkini ifade eder ve Öğrenci(n) ise bu listenin sonunu ifade eder. Arada kalan veriler listenin ara elemanlarıdır.

C# kodu olarak ele alırsak: “Ogrenci yukarıda belirttiğimiz değişkenlerden oluşan bir sınıftır.”

class Ogrenci {
string ad;
int numara;
public Ogrenci(string ad, int numara){
this.ad=ad;
this.numara=numara;
}
}

static void Main(string[] args){
Ogrenci ogrenci1=new Ogrenci(“Ahmet”,12);
Ogrenci ogrenci2=new Ogrenci(“Mehmet”,13);
Ogrenci ogrenci3=new Ogrenci(“Hasan”,13);
List<Ogrenci> ogrenciListesi=new List<Ogrenci>(); // Burada öğrenci listesi veri yapısını oluşturduk.
ogrenciListesi.Add(ogrenci1);
ogrenciListesi.Add(ogrenci2);
ogrenciListesi.Add(ogrenci3);

}

Bağlı listeler ise; bir veri kümesinin her bir verisi kendinden sonraki verinin ne olduğunu bilerek belli bir düzen oluşturur. Örnek verecek olacak bir folklor ekibinin bir oyun gerçekleştirmek için sırası ile dizilip ve oyun için sıradan ayrılmakta olsunlar. Oyunu icra ettikten hemen sonra tekrar sıra ile dizilmek için aynı noktaya hareket etsinler. Burada folklor ekibindeki her bir kişinin kendinden sonraki kişinin kim olduğunu bilmesi yeterlidir. Böylece tekrardan aynı sırayı yakalayabilirler.
Yukarıdaki durumu Tek yönlü bağlı liste ve C# kodu ile açıklayalım;

class FolklorOyuncu{
string ad;
public FolklorOyuncu sonrakiOyuncu;
public FolklorOyuncu(string ad){
this.ad=ad;
}
}
static void Main(string[] args){
FolklorOyuncu oyuncu1= new FolklorOyuncu(“Kenan”); // head
FolklorOyuncu oyuncu2= new FolklorOyuncu(“Cem”);
FolklorOyuncu oyuncu3= new FolklorOyuncu(“Samet”); //
oyuncu1.sonrakiOyuncu=oyuncu2;
oyuncu2.sonrakiOyuncu=oyuncu3;

}

Ağaç (Tree) : Ağaç veri modelinde veriler birbirine bağlantı şekilleri olarak kümede bulunan eleman sayısının 1 eksiği(n-1) kadar bulunabilir. Örnek verecek olursak bir topluluğun birbiriyle arkadaş olma durumlarını ele alabiliriz.

class Kisi{
string ad;
public List<Kisi> arkadaslar=new List<Kisi>();
public Kisi(string ad){
this.ad=ad;
}
}
static void Main(string[] args){
Kisi kisi1= new Kisi(“Kenan”);
Kisi kisi2= new Kisi(“Selim”);
Kisi kisi3= new Kisi(“Cihan”);
Kisi kisi4= new Kisi(“Emre”);
kisi1.arkadaslar.Add(kisi2);
kisi1.arkadaslar.Add(kisi4);
kisi2.arkadaslar.Add(kisi1);
kisi2.arkadaslar.Add(kisi3);
kisi3.arkadaslar.Add(kisi2);
kisi3.arkadaslar.Add(kisi4);
kisi4.arkadaslar.Add(kisi3);

}

Graf (Graph) : Bilgisayar dünyasında bulunan ve gerçek hayatta çeşitli sebeplerle karşılaşılan yapıları temsil amacıyla kullanılan şekillerdir.Örneğin bir bilgisayar ağını, karakenarları haritasını veya bir karar ağacını graflar kullanarak temsil etmek mümkündür. Bilgisayar bilimleri çeşitli uygulamalarda karşılaşılan bu yapıları ifade etmek için çeşitli matematiksel ve görsel yöntemlerden faydalanır. Buna göre bir grafta bulunan varlıklar düğümler ile ifade edilmekte, bu varlıklar arasındaki ilişkiler ise graftaki kenarlar ile ifade edilmektedir.

Grafları kenarların yönlü olup olmamasına göre, yönlü graflar ve yönsüz graflar olarak ikiye ayırmak mümkündür. Ayrıca kenarların değer almasına göre değerli graflar veya değersiz graflar isimleri verilebilir.

Örnek Graf Çizimi

Veritabanı-İlişkisel (Database Relational) : Veriler bir program veya kullanıcı tarafından talep edildiğinde kullanılması ve bütünlüğü korunarak saklanması için veritabanında depolanırlar. Veritabanlarında veriyi tutmak için tablolar kullanılır. Tablolar yapı olarak değişkenlerin bir arada kullanılarak oluşturulurlar. Bu yapı üzerinden tablolalara kayıtlar kaydedilir. Bir örnek üzerinden ele alalım.

Musteri: {MusteriNo:1,İsim:”Didem”,Soyisim: “Yılmaz”},
{MusteriNo:2,İsim:”Hakan”,Soyisim: “Taş”} burada baktığımızda MusteriNo,Isim,Soyisim değişkenleri Musteri verisinin yapısını ifade eder.
Didem Yılmaz ve Hakan Taş müşterileri ise bu veri yapısında tabloya kayıtlı olan verilerdir. MusteriNo verisi benzersiz olmakla birlikte genellikle otomatik olarak artan 1…n (1 den sonsuza kadar) sıralı bir şekilde artan değişkendir. Her müşteri için benzersiz bir numarayı ifade eder ve müşterinin diğer verilerle ilişkilerinde kullanılır.

Aşağıdaki örnekle bu durumu ele alalım.

Müşterinin sipariş ettiği ürünler için bağlantısını ifade eden veri yapısı.

Müşteri tablosu siparişler tablosu ile ilişkilendirilmiş yapıdadır. 1'den Sonsuz’a ilişki kurulmuştur. Burada ki ifade 1 müşterinin belirli olmayan kadar sipariş verebileceği anlamını taşır. Diğer taraftan baktığımızda siparişler ürünleri içerir. Bir sipariş verilmesi için en az 1 ürün olması gerekir. Bir üründen birden fazla sipariş verilebilir anlamını taşır.

Urun : { UrunId: 1, Ismi:”Oyun konsolu”, Fiyat:1500, Adet:100}
Sipariş : { SiparisId:1, UrunId:1, SiparisAdedi:1, MusteriId:1}

Buradaki veriler 1 numaralı Didem Yılmaz kişisinin 1 numaralı Oyun konsolu ürününden 1 adet sipariş verip 1 numaralı siparişi oluşturduğunu ifade eder.

Burada veri yapıların ve verilerin bu yapılar üzerinde tutulma şekillerini ve ifade ettikleri anlamları açıklamaya çalıştık.

Algoritmalar :

Algoritma: Bir problemin çözümünde izlenecek yol anlamına gelir. Algoritma, belirli bir problemin sonucunu elde etmek için art arda uygulanacak adımları ve koşulları kesin olarak ortaya koyar. Herhangi bir giriş verisine karşılık, çıkış verisi elde edilmesi gereklidir. Bunun dışındaki durumlar algoritma değildir.

Bir örnek verecek olursak: Bir sayının diğer bir sayıdan büyük olup olmadığını kontrol etmek için;

BAŞLA
OKU sayi1
OKU sayi2
EĞER sayi1> sayi2 İSE YAZ sayi1
DEĞİLSE YAZ sayi2
BİTİR

C# Kodu olarak Ele aldığımızda;

static void Main(string[] args)
{
int sayi1 = Convert.ToInt32(Console.ReadLine());
int sayi2 = Convert.ToInt32(Console.ReadLine());
if (sayi1 > sayi2)
Console.WriteLine(“{0} sayısı büyüktür”, sayi1);
else Console.WriteLine(“{0} sayısı büyüktür”, sayi2);
}

Diğer örnek verecek olursak: Bir müşterinin bir web sitesi üzerinden sipariş verme durumunu ele alalım.

Müşteri siteye girer-> Ürünleri Listeler-> Ürünlerden beğendiklerini sepete ekler -> Siparişi tamamlama sayfasına gider -> Ödemesini yapar -> Durum başarılı ise “Sipariş gerçekleşmiştir”, Değil ise “Sipariş başarısız olmuştur. Nedeni: …” yazar.

BAŞLA
ÜRÜNLERİLİSTELE()
SEPETEEKLE()
DURUM=ODEMEYİTAMAMLA();
EĞER DURUM==”BAŞARILI” İSE YAZ “SİPARİŞİNİZ GERÇEKLEŞMİŞTİR”
DEĞİLSE YAZ “SİPARİŞİNİZ BAŞARISIZ OLMUŞTUR”
BİTİR

Bu aksiyonların bütünü bir Algoritmayı ifade etmekle birlikte kendi içlerinde algoritmalara ayrılabilirler. Algoritmalar bize bütünden parçayı görme yada parçadan bütünü oluşturma imkanı sağlarlar.

Bu yazımızda veri yapılarını, nasıl oluşturulduklarını ve farklı tiplerde veri yapılarının kullanım şekillerini örneklerle ele almaya çalıştık. Ayrıca algoritma nedir, nasıl kurulur örneklerle birlikte ele almaya çalıştık. Yazılım yapısını öğrenmekten, web-mobil programlamaya doğru ilerleyişimizi sürdürmekteyiz.

--

--