Veri Yapıları ve Algoritmalar
Veri yapısı, verilerin bilgisayar hafızasında düzenlenme şeklidir. Veri yapısı, verilerin nasıl depolandığını, düzenlendiğini ve erişildiğini belirler. Bazı yaygın veri yapıları arasında Diziler, Bağlı Listeler, Yığınlar, Kuyruklar, Hash Tabloları, Ağaçlar ve Grafikler bulunur.
Algoritma ise, belirli bir problemi çözmek veya belirli bir işlemi gerçekleştirmek için tasarlanmış bir dizi adımdır. Algoritmalar, veri yapılarındaki veriler üzerinde işlem yapar ve çeşitli görevleri gerçekleştirir. Örneğin, sıralama ve arama algoritmaları gibi.
Veri yapıları ve algoritmalar, birlikte kullanıldığında, verimli ve etkili programlama çözümleri oluşturur.
Veri Yapıları
Diziler
Dizi, aynı türden bir dizi öğedir. Dizinin boyutu sabittir ve bir kez oluşturulduktan sonra değiştirilemez.
# Python'da bir dizi oluşturma arr = [1, 2, 3, 4, 5]
Bağlı Listeler
Bağlı liste, bir dizi düğümden oluşur. Her düğüm, bir veri öğesi ve bir sonraki düğüme işaret eden bir bağlantı içerir.
# Python'da bir bağlı liste düğümü class Node: def __init__(self, data=None): self.data = data self.next = None
Algoritmalar
Sıralama Algoritmaları
Sıralama algoritmaları, bir veri kümesini belirli bir düzende sıralamak için kullanılır. Örneğin, hızlı sıralama, birleştirme sıralaması, kabarcık sıralaması gibi.
# Python'da kabarcık sıralaması def bubbleSort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j]
Arama Algoritmaları
Arama algoritmaları, bir veri kümesinde belirli bir öğeyi bulmak için kullanılır. Örneğin, ikili arama, doğrusal arama gibi.
# Python'da ikili arama def binarySearch(arr, low, high, x): if high >= low: mid = (high + low) // 2if arr[mid] == x: return mid elif arr[mid] > x: return binarySearch(arr, low, mid - 1, x) else: return binarySearch(arr, mid + 1, high, x) else: return -1
Veri yapıları ve algoritmalar, programlamanın temel taşlarıdır ve herhangi bir programlama dilinde etkili kod yazmak için gereklidir. Bunları anlamak ve uygulamak, kodunuzun performansını ve verimliliğini büyük ölçüde artırabilir.
Zaman Karmaşıklığı ve Big O Gösterimi
Zaman karmaşıklığı, bir algoritmanın performansını ölçen bir kavramdır. Genellikle, bir algoritmanın çalışma süresi, girdi boyutu ile ilişkilendirilir. Big O gösterimi, algoritmanın zaman karmaşıklığını ifade etmek için kullanılır.
Big O gösterimi, algoritmanın en kötü durum çalışma süresini temsil eder. Örnek olarak, O(n) zaman karmaşıklığına sahip bir algoritma, girdi boyutu ile doğru orantılı olarak çalışma süresinin artacağı anlamına gelir.
Örnek Big O Gösterimi
- O(1): Sabit zaman karmaşıklığı (ör. Hash tablolarında arama)
- O(log n): Logaritmik zaman karmaşıklığı (ör. İkili arama)
- O(n): Doğrusal zaman karmaşıklığı (ör. Doğrusal arama)
- O(n log n): Log-lineer zaman karmaşıklığı (ör. Hızlı sıralama, Birleştirme sıralaması)
- O(n^2): Karesel zaman karmaşıklığı (ör. Kabarcık sıralaması, Seçim sıralaması)
- O(2^n): Üstel zaman karmaşıklığı (ör. Seyrek matris çarpımı)
Özyinelemeli (Recursive) Algoritmalar
Özyinelemeli algoritmalar, problemin daha küçük alt problemlere bölündüğü ve bu alt problemlerin çözümleri kullanılarak orijinal problem için çözüm üretildiği algoritmalardır. Özyinelemeli algoritmalar, fonksiyonlarının kendilerini tekrar çağırmalarıyla karakterize edilir.
Özyinelemeli algoritmaların tipik örnekleri arasında Fibonacci sayıları ve faktöriyel hesaplama bulunur.
Örnek: Fibonacci Sayıları
def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2)
Özyinelemeli algoritmalar, bazı durumlarda daha temiz ve anlaşılır kod sağlar, ancak dikkatli kullanılmalıdır, çünkü kötü tasarlanmış özyinelemeli algoritmalar performans sorunlarına yol açabilir.
Bu ek konular, veri yapıları ve algoritmalar hakkındaki bilgi birikiminizi daha da genişletir ve daha etkili kodlama stratejileri geliştirmenize yardımcı olur.