🤖 Yapay Zeka Kodlama Dersleri: Algoritma ve Veri Yapıları Temelleri
Algoritmalar ve veri yapıları, yazılım geliştirmenin ve özellikle yapay zeka uygulamalarının temel taşlarıdır. Bu ders notlarında, bu iki önemli kavramı temelden başlayarak inceleyeceğiz.
🧮 Algoritma Nedir?
Algoritma, belirli bir problemi çözmek veya bir görevi yerine getirmek için tasarlanmış, sonlu sayıda adımdan oluşan bir dizi talimattır.
- 🔑 Tanım: Bir algoritma, girdileri alır, belirli adımları izler ve çıktılar üretir.
- ⚙️ Özellikler:
- Kesinlik: Her adım açık ve net bir şekilde tanımlanmalıdır.
- Sonluluk: Algoritma, sonlu sayıda adımda tamamlanmalıdır.
- Etkililik: Her adım, temel işlemler kullanılarak uygulanabilir olmalıdır.
- ✏️ Örnek: İki sayıyı toplama algoritması:
- Başla
- İlk sayıyı al (A)
- İkinci sayıyı al (B)
- A ve B'yi topla (C = A + B)
- C'yi çıktı olarak ver
- Bitir
📊 Veri Yapıları Nedir?
Veri yapıları, verilerin bilgisayarda nasıl organize edileceğini ve saklanacağını belirleyen yapılardır. Verimli erişim ve değişiklik için farklı veri yapıları farklı avantajlar sunar.
- 🗄️ Tanım: Veri yapıları, verileri düzenli bir şekilde saklamak ve yönetmek için kullanılan yöntemlerdir.
- 🧰 Temel Veri Yapıları:
- Diziler (Arrays): Aynı türden verilerin sıralı bir koleksiyonudur.
- Bağlı Listeler (Linked Lists): Her elemanın bir sonraki elemanın adresini tuttuğu doğrusal veri yapılarıdır.
- Yığınlar (Stacks): Son giren ilk çıkar (LIFO) prensibine göre çalışır.
- Kuyruklar (Queues): İlk giren ilk çıkar (FIFO) prensibine göre çalışır.
- Ağaçlar (Trees): Hiyerarşik veri yapılarıdır.
- Graflar (Graphs): Düğümler ve kenarlar arasındaki ilişkileri temsil eden veri yapılarıdır.
🧭 Algoritma Analizi ve Karmaşıklık
Bir algoritmanın verimliliğini değerlendirmek için zaman ve bellek karmaşıklığı analiz edilir.
- ⏱️ Zaman Karmaşıklığı: Algoritmanın girdi boyutuna bağlı olarak çalışma süresinin nasıl arttığını gösterir. Genellikle Büyük O notasyonu (Big O notation) ile ifade edilir (örneğin, O(n), O(log n), O(n^2)).
- 💾 Bellek Karmaşıklığı: Algoritmanın girdi boyutuna bağlı olarak kullandığı bellek miktarının nasıl arttığını gösterir.
- 📈 Büyük O Notasyonu: Bir algoritmanın en kötü senaryodaki performansını tanımlamak için kullanılır.
🔑 Temel Algoritma Türleri
- 🔍 Arama Algoritmaları:
- Doğrusal Arama (Linear Search): Bir dizideki her elemanı tek tek kontrol ederek aranan değeri bulmaya çalışır.
- İkili Arama (Binary Search): Sıralı bir dizide, aranan değeri ortadaki elemanla karşılaştırarak arama aralığını sürekli olarak daraltır.
- 🗂️ Sıralama Algoritmaları:
- Kabarcık Sıralaması (Bubble Sort): Ardışık elemanları karşılaştırarak ve gerekirse yerlerini değiştirerek sıralama yapar.
- Seçmeli Sıralama (Selection Sort): En küçük elemanı bulup başa taşıyarak sıralama yapar.
- Birleştirmeli Sıralama (Merge Sort): Diziyi küçük parçalara ayırıp sonra birleştirerek sıralama yapar.
- Hızlı Sıralama (Quick Sort): Bir pivot eleman seçip diziyi pivot etrafında bölerek sıralama yapar.
🧬 Veri Yapıları ve Algoritmaların Yapay Zekadaki Rolü
Yapay zeka uygulamalarında, verimli algoritmalar ve uygun veri yapıları kullanmak, performansı önemli ölçüde etkiler.
- 🤖 Makine Öğrenmesi: Eğitim verilerini saklamak ve işlemek için diziler, matrisler ve ağaçlar kullanılır.
- 🕸️ Derin Öğrenme: Sinir ağları, graflar ve tensörler gibi karmaşık veri yapılarını kullanır.
- 🧠 Doğal Dil İşleme: Metin verilerini işlemek için diziler, ağaçlar ve graflar kullanılır.
- 🎮 Oyun Geliştirme: Oyun dünyasını ve karakterlerin hareketlerini modellemek için graflar ve ağaçlar kullanılır.
✍️ Örnek Uygulama: Basit Bir Yapay Zeka Algoritması
Aşağıdaki örnek, basit bir karar ağacı algoritmasının nasıl uygulanabileceğini göstermektedir.
python
class KararAgaci:
def __init__(self, soru, evet_kolu=None, hayir_kolu=None):
self.soru = soru
self.evet_kolu = evet_kolu
self.hayir_kolu = hayir_kolu
def tahmin_et(self, girdi):
if self.soru(girdi):
if self.evet_kolu:
return self.evet_kolu.tahmin_et(girdi)
else:
return True # Yaprak düğümü: Evet
else:
if self.hayir_kolu:
return self.hayir_kolu.tahmin_et(girdi)
else:
return False # Yaprak düğümü: Hayır
# Örnek bir karar ağacı
def hava_guzel_mi(girdi):
return girdi["hava"] == "gunesli"
def nem_yuksek_mi(girdi):
return girdi["nem"] == "yuksek"
kok_dugum = KararAgaci(hava_guzel_mi,
evet_kolu=KararAgaci(nem_yuksek_mi,
evet_kolu=None, # Yaprak: Hayir
hayir_kolu=None), # Yaprak: Evet
hayir_kolu=None) # Yaprak: Hayir
# Test
girdi1 = {"hava": "gunesli", "nem": "dusuk"}
girdi2 = {"hava": "gunesli", "nem": "yuksek"}
girdi3 = {"hava": "bulutlu", "nem": "dusuk"}
print(f"Girdi 1 için tahmin: {kok_dugum.tahmin_et(girdi1)}")
print(f"Girdi 2 için tahmin: {kok_dugum.tahmin_et(girdi2)}")
print(f"Girdi 3 için tahmin: {kok_dugum.tahmin_et(girdi3)}")
Bu örnek, temel bir karar ağacının nasıl oluşturulabileceğini ve kullanılabileceğini göstermektedir. Daha karmaşık yapay zeka algoritmaları, daha gelişmiş veri yapıları ve algoritmalar gerektirebilir.