Ağaçlar (trees), düğümlerden (nodes) oluşan bir veri yapısı türüdür, ve bu düğümler bir hiyerarşi içinde birbirine bağlanır. Ağaçlar, çok sayıda uygulamaya sahip olan oldukça yaygın bir veri yapısıdır. İşte ağaçların bazı temel tanımları ve özellikleri:
Ağaç Tanımı:
Düğüm (Node): Ağaçtaki her bir öğe, bir düğüm olarak adlandırılır. Her düğüm, bir değer içerir ve diğer düğümlere olan bağlantıları temsil eder.
Kenar (Edge): İki düğüm arasındaki bağlantı, bir kenar olarak adland
Genel ağaçlar (General Trees), her düğümün sıfır veya daha fazla sayıda çocuğu olabileceği bir ağaç yapısı türüdür. Bu, genel ağaçların çok çeşitli yapıları modellemesine izin verir, ve bu nedenle birçok farklı uygulamada kullanılırlar.
Genel Ağaçların Özellikleri:
Kök Düğüm (Root Node): Ağaçta tam olarak bir kök düğümü bulunur. Bu düğüm, hiçbir üst düğümü (ebeveyni) olmayan tek düğümdür.
Çocuk Düğümler (Child Nodes): Her düğüm, sıfır veya daha fazla çocuk düğüme sahip olabi
Positional List, belirli bir pozisyona erişim sağlamak için uygun bir veri yapısıdır, bu da çeşitli sıralama algoritmalarının uygulanmasını mümkün kılar. Aşağıda, bir Positional List'i sıralamanın bir yolu olan Insertion Sort algoritmasının bir uygulamasını bulacaksınız.
Insertion Sort İle Positional List Sıralama
Insertion Sort, bitişik öğeleri karşılaştırarak ve gerekirse değiştirerek çalışır. Positional List içindeki elemanlar arasında bu karşılaştırmaları yapmak oldukça kolaydır.
Positional Doubly Linked List, pozisyonlarını takip etmek istediğiniz öğelerle çalışmanız gerektiğinde kullanabileceğiniz bir veri yapısıdır. İkili bağlı liste (Doubly Linked List) üzerine inşa edilmiştir, bu nedenle her düğüm bir sonraki düğüme ve bir önceki düğüme işaret eder.
class PositionalList:
class Node:
def __init__(self, element, prev, next):
self.element = element
self.prev = prev
self.next = next
class Position:
def __in
Pozisyonel Liste (Positional List) soyut veri tipi (ADT), öğelerin pozisyonlarını veya yerlerini temsil etmeyi kolaylaştıran bir veri yapısıdır. Bu yapı, öğeleri hatırlayarak, onları düzenli bir şekilde eklemeye, çıkarmaya ve güncellemeye olanak tanır.
Pozisyonel Liste ADT'si, genellikle ikili bağlı listeler gibi veri yapıları kullanılarak uygulanır ve aşağıdaki ana işlemleri içerir:
İlk Pozisyonu Bulma: Listenin ilk pozisyonunu verir.
Son Pozisyonu Bulma: Listenin son pozisyonunu
Bir deque (çift yönlü kuyruk), hem baştan hem de sondan öğe eklemeye ve çıkarmaya izin veren bir veri yapısıdır. İkili bağlı bir liste kullanarak deque oluşturmak, son derece uygun ve verimli bir yaklaşımdır.
İşte bir deque'nin ikili bağlı bir liste kullanarak nasıl uygulanacağına dair bir örnek:
1. Düğüm Sınıfı
Öncelikle, her düğümü temsil eden bir sınıf oluşturmalıyız. Her düğüm, bir değer ve iki bağlantı içerir: prev (önceki düğüme işaret eder) ve next (sonraki düğüme işaret ed
İkili bağlı listeler (Doubly Linked Lists) veri yapılarından biridir. Bu yapıda her düğüm kendisinden önceki ve sonraki düğümlerin referanslarını tutar. Bu, verilerin iki yönde de gezinilmesine olanak tanır. İkili bağlı bir listenin her bir düğümü genellikle bir veri kısmı ve iki referans kısmı içerir. Bu referanslar, düğümün kendisinden önceki ve sonraki düğümlere işaret eder.
İkili bağlı listenin bir şeması şu şekilde olabilir:
İkili bağlı listelerin bazı özellikleri şunlardır:
Dairesel bağlı liste (Circularly Linked List), her düğümün bir sonraki düğüme bir referansını içerdiği ve son düğümün de başlangıç düğümüne referans verdiği bir bağlı liste türüdür. Bu, listede dairesel bir yapı oluşturur, böylece listenin sonundan başına geçiş yapabilirsiniz.
Dairesel bağlı listeler, genellikle uygulamalarda düzenli bir şekilde bir liste üzerinde dönülmesi gerektiğinde kullanılır. Örneğin, bir oyun içindeki karakterler arasında dönerken veya bir çalma listesi içinde şarkıl
Kuyruk (queue), ilk giren ilk çıkar (First-In-First-Out veya FIFO) prensibine göre çalışan bir veri yapısıdır. Bu, bir kuyruğa eklenen ilk öğenin, aynı zamanda kuyruktan çıkarılan ilk öğe olacağı anlamına gelir.
Tek yönlü bağlı bir liste kullanarak bir kuyruk uygulamak da mümkündür. Baş düğüm, kuyruğun önünü temsil eder, ve son düğüm, kuyruğun sonunu temsil eder.
Kuyruk İmplementasyonu
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
Yığıt (stack), son giren ilk çıkar (Last-In-First-Out veya LIFO) prensibine göre çalışan bir veri yapısıdır. Bir yığıt, iki ana işlemi destekler: push, bir öğeyi yığına ekler, ve pop, yığından bir öğeyi çıkarır.
Tek yönlü bağlı bir liste kullanarak bir yığıt uygulamak oldukça basittir. Baş düğüm, yığının en üstündeki öğeyi temsil eder, ve bu, push ve pop işlemlerinin hızlı bir şekilde gerçekleştirilmesini sağlar.
Yığıt İmplementasyonu
class Node:
def __init__(self, data=None):
Tek yönlü bağlı bir listenin başına bir öğe eklemek, genellikle oldukça hızlı ve basit bir işlemdir. Bu işlem, genellikle O(1) zaman karmaşıklığına sahiptir çünkü başa ekleme işlemi sabit sayıda adımda gerçekleştirilir.
Bağlı listenin başına bir öğe eklemek için aşağıdaki adımlar izlenir:
Yeni Düğüm Oluştur: İlk olarak, listenin başına eklemek istediğiniz değeri içeren yeni bir düğüm oluşturmalısınız.
Yeni Düğümün Referansını Ayarla: Yeni düğümün next referansını, şu anki baş düğü
Tek yönlü bağlı listeler (singly linked lists) hakkında daha ayrıntılı bir açıklama yapacağım.
Tek yönlü bağlı liste, düğümlerin birbirine yalnızca bir yönde bağlandığı bir veri yapısıdır. Her düğüm, bir veri öğesi ve sonraki düğüme işaret eden bir referans içerir. Son düğüm, genellikle NULL referansına sahip olur, bu liste sonunun işaretçisidir.
Tek Yönlü Bağlı Liste Yapısı:
Düğüm (Node): Veri ve sonraki düğüme işaret eden bir referans içerir.
Baş Düğüm (Head): Listenin ilk
Bağlı listeler, düğümlerden (nodes) oluşan bir veri yapısıdır. Her düğüm, bir veri alanı ve bir sonraki düğümün referansını içerir. İlk düğüme başlangıç düğümü denir, son düğüm ise genellikle NULL referansına sahip olur.
İşte bağlı listelerin temel özellikleri ve bileşenleri:
Düğüm (Node): Bir düğüm, genellikle iki bileşen içerir: bir veri kısmı ve bir sonraki düğümün referansı.
Baş Düğüm (Head): Listenin ilk düğümüne baş düğüm denir. Baş düğümü bilindiği sürece, listedeki diğer d
Python'da collections modülündeki deque sınıfı, çift uçlu kuyruk (double-ended queue) veri yapısını etkili bir şekilde uygulamanıza olanak tanır.
Deque Nedir?
Deque (Double-Ended Queue), her iki ucundan da ekleme ve çıkarma işlemlerinin yapılabildiği bir veri yapısıdır. Bu, deque'nin hem yığıt (stack) hem de kuyruk (queue) olarak kullanılmasına olanak tanır.
Python'da Deque Kullanımı
collections modülünden deque'yi içe aktararak başlayabilirsiniz:
from collections import d
Double-Ended Queues (Çift Uçlu Kuyruklar), veya genellikle "deque" olarak adlandırılan veri yapısı, her iki ucunda da ekleme ve çıkarma işlemlerinin yapılabildiği bir kuyruk türüdür. Bu, deque'nin daha esnek bir veri yapısı olmasını sağlar, çünkü hem kuyruk (FIFO - First-In, First-Out) hem de yığıt (LIFO - Last-In, First-Out) olarak kullanılabilir.
Deque İşlemleri:
Append (Ekleme): Deque'nin sağ ucuna bir öğe ekler.
Append Left (Sol Tarafa Ekleme): Deque'nin sol ucuna bir öğe ekle
"Shrinking the Underlying Array" (Altta Yatan Diziyi Küçültme), bir veri yapısının (örneğin bir dizi listesi veya kuyruk) kullanmadığı belleği serbest bırakmak için kullanılan bir tekniktir. Bu yaklaşım, gereksiz bellek kullanımını en aza indirmek ve dolayısıyla daha etkili bir bellek yönetimi sağlamak için kullanılır.
Neden Gerekli?
Bir veri yapısı içindeki öğeler çıkarıldıkça, kullanılmayan bir alan oluşabilir. Bu durum, kullanmadığınız bellek alanı kapladığından, gereksiz bir yük ol
Resizing the Queue (Kuyruğun Yeniden Boyutlandırılması), bir kuyruk veri yapısının kapasitesinin dinamik olarak değiştirilmesi işlemidir. Bu, bir kuyruğun içeriğinin yeterince büyük veya küçük olmaması durumunda, kuyruğun verimli bir şekilde çalışmasını sağlamak için gereklidir.
Neden Gerekli?
Performans İyileştirmesi: Kapasitesi dolmuş bir kuyruğa yeni öğeler eklemek istediğinizde, yeni bir kapasiteyle kuyruğu yeniden boyutlandırmak gerekir.
Alan Kullanımı: Eğer kuyruğunuz çok bü
Circular array (dairesel dizi), bir dizi veri yapısının özel bir uygulamasıdır. Bu yapıda, sonraki öğenin dizinin sonuna ulaştığında başına dönmesi ve oradan devam etmesi sağlanır. Bu, bir çember şeklinde düşünülebilir, yani son öğeden sonra ilk öğeye geri dönülür. Bu, dizinin sonunda boş alan olmadığında, dizinin başında boş alan olup olmadığını kontrol etmeyi kolaylaştırır.
Kullanımı:
Dairesel diziler, kuyruk yapısının uygulanmasında, işlemci planlamada ve birçok farklı senaryoda kul
Array-Based Queue Implementation, bir kuyruk (queue) veri yapısının dizi (array) kullanılarak nasıl uygulanacağını ifade eder. Bu uygulama, belirli bir boyuttaki bir dizi üzerinde işlemler yapmayı içerir.
Bu tür bir kuyruk yapısında, iki önemli gösterge (genellikle "front" ve "rear" olarak adlandırılır) kullanılır. Bunlar, dizideki en ön ve en son öğelerin konumlarını belirtir.
class ArrayQueue:
def __init__(self, capacity):
self.capacity = capacity
self.queue = [None
Abstract Data Type (ADT), bir veri yapısının mantıksal tanımını ve bu veri yapısı üzerinde gerçekleştirilebilecek işlemleri tanımlar, ancak bu işlemlerin nasıl gerçekleştirileceğinin ayrıntılarını belirtmez. Yani, ADT, "ne" yapılması gerektiğini tanımlar, "nasıl" yapılacağını değil.
Queue Abstract Data Type (Kuyruk Soyut Veri Tipi), bir kuyruk veri yapısının özelliklerini ve üzerinde gerçekleştirilebilecek işlemleri tanımlar. Temelde, bir kuyruk, öğelerin sırayla saklandığı ve ilk giren öğe
Queue (Kuyruk), bir veri yapısıdır ve ilk giren, ilk çıkar (First In, First Out - FIFO) ilkesine göre çalışır. Yani, kuyruğa ilk eklenen öğe, ilk çıkarılacak olan öğedir.
Kuyruk Operasyonları:
Enqueue: Kuyruğun sonuna bir öğe ekler.
Dequeue: Kuyruğun başından bir öğe çıkarır ve döndürür.
Front: Kuyruğun başındaki öğeyi döndürür, ancak çıkarmaz.
Rear: Kuyruğun sonundaki öğeyi döndürür.
IsEmpty: Kuyruğun boş olup olmadığını kontrol eder.
Size: Kuyruğun boyutunu,
Yığın (stack) veri yapısının bir dizi (array) kullanılarak basit bir uygulamasıdır. Bu yaklaşım, yığın işlemlerinin (push, pop, peek/top vb.) bir dizi üzerinde yürütülmesi mantığına dayanır.
Array-Based Stack Implementation'ın avantajları, dizilerin ardışık bellek bloklarında depolanmasından ve sabit zamanlı indeks erişimi sağlamasından kaynaklanır. Bununla birlikte, dizi boyutunun sabit olması nedeniyle, yığının kapasitesi de sabittir ve dolu bir yığına eklemeler hata durumlarına yol açabi
Yığınlar (Stacks), bilgisayar biliminde oldukça yaygın olarak kullanılan bir veri yapısıdır. Yığınlar, nesnelerin düzenlenmesi için kullanılır ve son giren, ilk çıkan (Last In First Out - LIFO) prensibine dayalıdır. Bu, yığına en son eklenen öğenin, ilk çıkarılacak öğe olacağı anlamına gelir.
Yığınlar, aşağıdaki temel işlemleri destekler:
Push: Bir öğeyi yığının en üstüne ekler.
Pop: Yığının en üstündeki öğeyi çıkarır ve geri döndürür.
Peek/Top: Yığının en üstündeki öğeyi dön
Python'da çok boyutlu listeler (veya diziler), kendi içinde başka listeler içeren bir liste şeklinde düzenlenir. Bu iç içe listeler, bir matris veya tensör gibi bir yapıyı temsil edebilir, karmaşık veri organizasyonuna imkan tanır.
2D Liste (Matris)
2D liste, satırlar ve sütunlarla bir tablo gibidir:
satir = 3
sutun = 4
# Tüm değerleri sıfır olan 2D bir liste oluşturma
matris = [[0 for j in range(sutun)] for i in range(satir)] # matris = [[0]*sutun]*satir
# Matrisi yazdırma
for s
Çok boyutlu (multidimensional) veri kümeleri, verilerin birden fazla özelliği veya boyutu olduğunda kullanılır. Her bir boyut, verinin bir yönünü temsil eder. İşte çok boyutlu veri kümelerinin ayrıntılı bir açıklaması:
1. Çok Boyutlu Veri Nedir?
Çok boyutlu veri, her biri farklı bir özelliği veya boyutu temsil eden birden fazla değer içerir. Örneğin, bir şehrin iklim verileri sıcaklık, nem, yağış miktarı, rüzgar hızı vb. gibi farklı boyutlar içerebilir.
2. Kullanım Alanları
Ç