C++ Kodlamaya Dayalı Karmaşık Veri Yapıları Hakkında Her Şey kitabı ile işleyişi basit ama büyük veri setleri üzerinde işlem yapabilen kodlar yazabilirsiniz Kitapla öğreneceğiniz veri yapıları ile programlama becerilerinizi geliştirin
C++ dilinde kodlamaya dayalı karmaşık veri yapıları, yazılım geliştiricileri için büyük önem taşımaktadır. Bu veri yapıları, programlama dillerinde saklanan bilgiyi organize etme ve erişim yöntemlerini sağlamak için kullanılır. Bu makalede, C++ dilinde kullanılan en yaygın karmaşık veri yapıları ayrıntılı bir şekilde ele alınacaktır. Dizi, sıra, bağlı liste, düzenli sıralı liste ve ağaç veri yapıları bu makalede yer alacaktır.
Dizi veri yapısı, birbirine benzer türden verilerin tek bir değişken adı altında toplanmasına olanak sağlar. Bu veri yapısı başlarken bellidir ve kendini yenilemez. Sıra (Linked List) veri yapısı, bellek bölümlerindeki bilgilerin bağlantılar ile birbirine bağlandığı bir veri yapısıdır. Bu veri yapısı, birbirine bağlı düğümlerden oluşur ve eklenen elemanlar dinamik olarak oluşturulur. Bağlı liste, sıra veri yapısına biraz daha esneklik kazandırır, çünkü verilerin başa veya sona eklenmesi mümkündür. Çift taraflı bağlı liste, bir önceki ve bir sonraki veriye erişmenin sağlandığı bir veri yapısıdır. Dairesel bağlı liste veri yapısı ise, son veri elemanının birinci veri elemanına bağlı olduğu bir yapıdır.
Dizi (Array) Veri Yapısı
C++ dilinde sıklıkla kullanılan veri yapılarından biri olan dizi, aynı türdeki elemanların bir araya getirildiği bir veri yapısıdır. Diziler, bellek üzerinde ardışık bloklar halinde depolanır ve her bir eleman için bir indeks kullanılır. C++ dilinde dizilerin boyutu, %0'dan başlayıp istenilen değere kadar değiştirilebilir. Bununla birlikte, dizinin boyutu bir defa belirlendikten sonra genellikle sabit kalır.
İndeks işlemleri diziler için oldukça önemlidir ve C++ dilinde dizilerin karmaşıklığı O(1)dir. Dizilerin avantajlarından biri, elemanlara doğrudan erişim sağlamasıdır. Ancak dezavantajı, eleman eklemek ya da diziden eleman silmek zorlaşabilmesidir.
Dizi Özellikleri | Açıklama |
---|---|
Boyutu belirlenirken sabit kalabilir | Ancak C++ dilinde boyutu istenildiği zaman değiştirilebilir. |
Aynı türdeki elemanları bir araya getirir | Aynı türdeki elemanlardan oluşan verileri düzenli bir şekilde depolamak için kullanılır. |
Bellek üzerinde ardışık bloklar halinde depolanır | Diziler, bellekte sürekli bir alan gerektirirler ve değiştirilebilirler. |
C++ dilinde dizi veri yapısındaki elemanların erişimleri indisleri kullanılarak yapılır. Örneğin;
int dizi[5] = {2, 4, 6, 8, 10}; // 5 elemanlı bir dizi tanımlamasıcout << dizi[2]; // 6 elemanının değeri olan 6'yı yazdıracak.
Diziler, veri yapısı olarak sadece aynı türden verileri tutabildiği için, listedeki verilerin türleri uyumlu olmalıdır. Dizilerin bellekte alacakları yer sabit olduğundan, daha büyük veri dosyalarının işlenmesi yavaş olabilir. C++ dilinde veri yapıları, programlama dillerinde sıklıkla kullanılan bir konudur ve bu nedenle dizilerin özellikleri öğrenmek çok önemlidir.
Sıra (Linked List) Veri Yapısı
C++ dilinde kodlama yaparken sıklıkla kullanılan sıra (linked list) veri yapısı, verileri bağlantılı düğümler halinde saklar. Sıra veri yapısı, dizilere (array) alternatif olarak daha uygun olabilir, çünkü bu yapılar öğelerin eklenmesi veya çıkartılması sırasında daha fazla esneklik sağlar.
Sıra veri yapısının her bir öğesi, kendi değeri ve bir sonraki öğenin yerini belirten bir işaretçi içerir. Bu işaretçi, önceki öğenin sonraki öğeyi gösterecek şekilde nasıl anlatılacağını belirler. C++ dilinde sıra veri yapısı, her bir öğenin adresini işaret eden bir baş işaretçi ve son öğenin yerini belirten bir son işaretçi ile tanımlanır. Bu sayede sıra veri yapısı hızlıca işlenebilir ve çok sayıda öğeden oluşan veriler de kolaylıkla depolanabilir.
Kod | Anlamı |
---|---|
node *head = NULL; | Başlangıçta sıranın başlangıç düğümünü gösteren işaretçi boş olarak atanır. |
node *newNode = new node; | Yeni bir sıra öğesi oluşturulur. |
newNode->data = 15; | Yeni öğenin değeri atanır. |
newNode->next = head; | Yeni öğenin gösterdiği bir sonraki öğe, başlangıç öğesi olarak belirlenir. |
head = newNode; | Önceden boş olan baş işaretçisi, yeni öğe tarafından işaret edilir ve sıra öğesi oluşur. |
Bu örnek, sıranın önünden bir öğe ekleme işlemi yapar. Bu ekleme işlemi, yeni öğenin baş işaretçisi ile başlatıldıktan sonra, önceden baş işaretçisi olarak atanmış olan işaretçi ile birlikte yapılır. Daha sonra, yeni baş işaretçisi, yeni öğeyi işaret eder hale gelir. Bu şekilde, C++ dilinde sıra veri yapısı ile öğeler eklemek, sıralamak ve silmek kolaylıkla gerçekleştirilebilir.
Bağlı Liste (Doubly Linked List) Veri Yapısı
Bağlı liste, C++ dilinde sıklıkla kullanılan bir veri yapısıdır. Bu veri yapısı, her bir elemanının kendisinden önceki ve sonraki elemanın adreslerini gösterdiği bir sıralı listedir. Bu özellik sayesinde, listede verileri ekleme, çıkarma ve sıralama işlemleri kolayca yapılabilmektedir.
Bağlı listeler, tek taraflı ve çift taraflı olarak ikiye ayrılır. Tek taraflı bağlı listelerde sadece bir sonraki elemanın adresi tutulurken, çift taraflı bağlı listelerde her elemanın hem sonraki hem de önceki elemanın adresi tutulur. Bu sayede, listedeki verilere hem ileri hem de geri yönde erişim mümkün hale gelir.
Bağlı listede veri eklemek için, öncelikle eklemek istenilen verinin adresini tutacak bir düğüm oluşturulur. Daha sonra, bu düğümün önceki elemanının sonraki adresi listenin başına, sonraki elemanının önceki adresi ise önceki elemanın sonrasına bağlanarak ekleme işlemi gerçekleştirilir. Benzer şekilde, veri çıkartmak için de düğümlerin adresleri değiştirilerek işlem yapılır.
Bağlı listelerin en büyük avantajlarından biri, veri yapısının esnek olmasıdır. Bu sayede, verileri sıralı veya rastgele olarak listeye ekleyebilir ya da çıkarabilirsiniz. Ayrıca, bu veri yapısı sayesinde diğer veri yapıları örneğin ağaçlar, grafikler ve heapler gibi veri yapılarının oluşturulmasında da kullanılabilir.
Çift Taraflı Bağlı Liste (Doubly Linked List) Veri Yapısı
Çift taraflı bağlı liste, elemanları birer anahtar değeri ve iki bağlantı şeklinde tutulan ve her elemanın bir öncesi ve bir sonrası olduğu bir veri yapısıdır. C++ dilinde çift taraflı bağlı listenin yöntemleri oldukça fazla ve özellikleri oldukça kullanışlıdır.
Metod Adı | Çalışma Süresi | Açıklama |
---|---|---|
push_back() | O(1) | Listeye sona eleman ekler |
push_front() | O(1) | Listeye başa eleman ekler |
pop_back() | O(1) | Listeden sondaki elemanı siler |
pop_front() | O(1) | Listeden baştaki elemanı siler |
insert() | O(1) | Belirtilen konuma eleman ekler |
erase() | O(1) | Belirtilen konumdaki elemanı siler |
Çift taraflı bağlı liste aynı zamanda reverse() fonksiyonu sayesinde de ters çevrilebilir ve böylece listenin elemanları sondan başa doğru okunabilir. Bu veri yapısı aynı zamanda birçok diğer veri yapısının oluşumunda kullanılır.
Dairesel Bağlı Liste (Circular Linked List) Veri Yapısı
C++ dilinde, dairesel bağlı liste veri yapısı, sıra veri yapısından türetilmiştir. Sıra veri yapısında olduğu gibi, dairesel bağlı listelerde de her elemanın bir sonraki elemanı için bir adresi (pointer) vardır. Ancak, dairesel bağlı listelerde son elemanın adresi, ilk elemanın adresiyle bağlantılıdır. Yani, son elemanın bir sonraki elemanı ilk elemandır. Bu sayede, elemanlar döngüsel bir şekilde gezilebilir.
Dairesel bağlı listeler tıpkı bağlı listelerde olduğu gibi, verileri sıralı veya sırasız bir şekilde depolama imkanı sunar. Veri ekleme ve silme işlemleri, sıra veri yapısında olduğu gibi gerçekleştirilir. Ancak, dairesel bağlı listelerde son elemanın bir sonraki elemanı ilk elemanda olduğu için, son elemanın işaretçisi (pointer) kontrol edilmelidir. Bu sayede, ekleme ve silme işlemleri sırasında dairesel yapının korunması sağlanır.
İşlev | Açıklama |
---|---|
createCircularLinkedList() | Boş bir dairesel bağlı liste oluşturur. |
insertAtBeginning() | Listenin başlangıcına eleman ekler. |
insertAtEnd() | Listenin sonuna eleman ekler. |
deleteNode() | Belirtilen elemanı listeden siler. |
displayList() | Listenin elemanlarını ekrana yazdırır. |
Dairesel bağlı listeler özellikle döngüsel işlemler için oldukça yararlı bir veri yapısıdır. Örneğin, bir müzik yürütücüsünde şarkıların çalma listesi, dairesel bağlı liste olarak tutulabilir. Bu sayede, son şarkı bittiğinde otomatik olarak ilk şarkıya geçiş yapılır ve döngü devam eder.
Düzenli Sıralı Liste (Ordered Linked List) Veri Yapısı
C++ dilinde Düzenli Sıralı Liste, elemanları küçükten büyüğe veya büyükten küçüğe doğru sıralanmış olan bir veri yapısıdır. Bu veri yapısı, elemanları yeniden sıralamak için kodlamayı kolaylaştırır ve arama işlemlerini hızlandırır. Düzenli Sıralı Liste, örnek olarak bir telefon rehberi verebilir. Rehber, isime göre alfabetik bir şekilde sıralanır ve böylece arama işlemleri çok daha hızlı halledebilir.
Düzenli Sıralı Liste, elemanları düzenlemek için özel bir algoritma kullanır. Dizi veri yapısında olduğu gibi, elemanlar arasında sabit bir boşluk bulunmaz. Bunun yerine, her eleman sadece bir sonraki elemanın adresini tutar. Öğeler genellikle bir " düğüm" olarak adlandırılır ve her düğüm, liste başlangıcından veya sonuna kadar birbirine bağlanır. Düzenli Sıralı Liste'ye girilen her yeni eleman, listede uygun bir konumda sıralanır. Bu veri yapısının avantajı, eleman ekleme ve silme işlemlerindeki performanstır.
Düğüm Adı | Değer | Adres |
---|---|---|
1 | 11 | 0x003 |
2 | 22 | 0x005 |
3 | 33 | 0x008 |
4 | 44 | 0x00A |
Yukarıda verilen tabloda, aşağıdaki gibi bir düzenli sıralı liste yapısı oluşur:
- 11 (0x003) -->
- 22 (0x005) -->
- 33 (0x008) -->
- 44 (0x00A) -->
- nullptr
Bu liste, elemanları artan sırada düzenlediğinden, kodlama işlemlerinde faydalıdır. Yeni bir eleman eklendiğinde, veri yapısı, elemanın değerine uygun bir şekilde sıralar. Silme işlemi yapmak istendiğinde, işlem yapılacak elemanın adresine ulaşmak için gezmek gerekir. Bu durum, listenin herhangi bir yerindeki herhangi bir elemanı silebilmenize olanak tanır.
Ağaç (Tree) Veri Yapısı
C++, yazılım geliştirme alanında oldukça popüler bir programlama dilidir ve veri yapıları konusunda oldukça zengin bir dil olarak nitelendirilebilir. Bu dilde ağaç veri yapısı, bulunmayan verileri aranması için hızlı ve etkili bir yöntem sağlar. Bu nedenle C++ dilinde ağaç veri yapısı oldukça sık kullanılır.
Ağaç veri yapısı, pek çok dalın ve yaprağın bağlantılı olduğu yapraklı bir yapıya benzer. Bu veri yapısı, verilerin hızlı bir şekilde aranmasına ve kullanıcılar tarafından kolayca anlaşılmasına olanak tanır. C++ dilinde kullanılan ağaç veri yapısı ayrıca düğümler, ana düğümler ve alt düğümler şeklinde de tanımlanabilir.
- Binary Search Tree Veri Yapısı: Bu veri yapısı, tüm düğümlerin bir ana düğüme göre sıralandığı yapılardan oluşur. Ana düğümler sıralanmış ve alt düğümler içindeki tüm veriler bu sıraya göre sağa veya sola yerleştirilir.
- AVL Tree Veri Yapısı: Bu veri yapısı, tüm düğümlerin bir ana düğüme göre sıralandığı yapıya benzer. Ancak, bu veri yapısında sıralama yapılırken sabit bir yükseklik de göz önüne alınır. Bu yükseklik, verilerin hızlı ve etkili bir şekilde bulunmasına olanak tanır.
Her iki ağaç yapısı da C++ dilinde kullanılmakta ve veri yapıları konusunda oldukça etkilidir. Ağaç veri yapısının kullanımı, bulunması zor verilerin aranmasında ve analizinde oldukça kullanışlıdır. C++ dilinde ağaç veri yapısı, programlama konusunda uzman olanlar için vazgeçilmez bir araçtır.
Binary Search Tree Veri Yapısı
C++ dilinde kullanılan Binary Search Tree (BST) veri yapısı, ağaç yapısının önemli bir şekli olarak karşımıza çıkar. BST, bir ağaç yapısı olarak ele alınır ve bu yapıda her bir düğümün en fazla iki çocuğu vardır. BST yapısı, elemanları tutarken sıralı bir yapıyı da korur. Bu sayede elemanlar arasında arama yapmak oldukça kolay hale gelir. BST'lerde her bir düğüm, "sol çocuk" ve "sağ çocuk" olmak üzere iki alt düğüme sahiptir.
BST'lerde kullanılan bir diğer önemli bileşen ise "anahtar (key)"dır. Her bir düğümde bir anahtar değeri tutulur ve bu anahtar, elemanların sıralanmasında kullanılır. BST yapısı, özellikle sıralama ve arama problemlerinde kullanılır. BST yapısı üzerinde bir eleman arama işlemi gerçekleştirileceği zaman, öncesinde elemanları sıralama işlemi gerçekleştirilir ve arama işlemi, sıralama dizisi üzerinde gerçekleştirilir. BST yapısı, elemanlar arasında O(log n) zaman karmaşıklığına sahip bir arama işlemi gerçekleştirir.
BST yapısı üzerinde, eleman ekleme, eleman silme, eleman güncelleme ve eleman arama gibi işlemler gerçekleştirilebilir. Eleman ekleme işlemi yapılacaksa, ağaç yapısında ilk önce doğru konuma gelmek gerekir. Bu konum, her bir düğümün anahtar (key) değeri ile karşılaştırılır ve BST yapısındaki sıralı yapıya uygun olarak, yeni elemanın doğru konumu belirlenir.
Eleman silme işlemi gerçekleştirileceğinde, silinecek elemanın yerine ağaç yapısındaki diğer düğümlerin kaydırılması işlemi gerçekleştirilir. Eğer, silinecek elemanın iki çocuğu varsa, bu iki çocuk düğümü arasından doğru konuma gelmek için tüm elemanlar çıkarılır ve yeni eleman yeniden yerleştirilir.
BST yapısı, elemanları sıralamak için kullanılırken, özellikle sık tekrar eden elemanlar için daha fazla bellek kullanımı gerektirir. Bu nedenle, BST yapısının seçimi, özellikle veri toplama ve sıralama işlemleri için belirli bir veri yapısı belirlenmeden önce iyi düşünülmesi gereken bir seçimdir.
AVL Tree Veri Yapısı
AVL Tree, adını kurucusu Georgy Adelson-Velsky ve Evgenii Landis'ten alan bir veri yapısıdır. Bu veri yapısı, veri ekleme ve silme işlemleri sırasında düğümlerin denge durumunu kontrol eder ve dengeli bir ağaç yapısını korur. Bu nedenle, AVL Tree veri yapısı, arama işlemleri için oldukça etkili ve verimlidir.
C++ dilinde AVL Tree veri yapısını kullanmak için önce AVL Tree sınıfını tanımlamak gerekir. Bu sınıf, C++'ta ön tanımlı değildir, bu yüzden kullanıcı tarafından tanımlanması gerekmektedir. Daha sonra AVL Tree sınıfındaki fonksiyon ve metotlar kullanılarak AVL Tree yapısı oluşturulabilir, erişilebilir ve yönetilebilir.
AVL Tree Yöntemleri | Açıklama |
---|---|
rotateLeft() | Düğümlerin sola dönmesini sağlar. |
rotateRight() | Düğümlerin sağa dönmesini sağlar. |
rotateRightLeft() | Düğümlerin önce sağa, sonra sola dönmesini sağlar. |
rotateLeftRight() | Düğümlerin önce sola, sonra sağa dönmesini sağlar. |
insert() | Belirli bir değeri AVL Tree yapısına ekler. |
remove() | Belirli bir değeri AVL Tree yapısından siler. |
search() | Belirli bir değerin AVL Tree yapısında olup olmadığını kontrol eder. |
AVL Tree'nin temel özelliklerinden biri, her düğümün bir denge faktörüne sahip olmasıdır. Denge faktörü, bir düğümün sol alt ağacındaki düğümlerden sağ alt ağacındaki düğümlere olan mesafenin farkıdır. Bu faktör, bütün düğümlerin birbirine bağlanması sonucunda önceden belirlenmiş bir değerden fazla veya az olamaz.
AVL Tree yapısının önemli avantajlarından biri, Ağaç veri yapısında bulunan en büyük elemanı ve en küçük elemanı bulmak gibi işlemlerin çok daha hızlı gerçekleştirilmesidir. Bunun yanı sıra, veri içinde arama yapmak için AVL Tree yapısı kullanıldığında veriye erişim hızı artar ve çok daha az bellek kullanımı sağlar.