🔍 6.1: Lineer Arama (Linear Search)

En Basit Arama Algoritması

📌 Bu Bölümde Öğrenecekleriniz

🔍

Lineer Arama

Nasıl çalışır?

⏱️

Zaman Analizi

O(n) ne demek?

🎮

İnteraktif Demo

Adım adım gör

🐍

Python Kodu

Çalıştır ve öğren

🤔 Lineer Arama Nedir?

Lineer Arama (Linear Search), bir dizide aranan elemanı bulmak için baştan sona tüm elemanları tek tek kontrol eden en basit arama algoritmasıdır.

💡 Gerçek Hayat Analojisi

Kitaplığında bir kitap arıyorsun ama kitaplar karışık durumda (sıralı değil). Ne yaparsın?

  1. İlk kitaba bakarsın: "Bu mu?" - Hayır
  2. İkinci kitaba bakarsın: "Bu mu?" - Hayır
  3. Üçüncü kitaba bakarsın: "Bu mu?" - EVET! 🎉

İşte bu lineer arama! Baştan başla, tek tek kontrol et, bulana kadar devam et.

🎯 Algoritma Adımları

  1. Başla: Dizinin ilk elemanından (index 0) başla
  2. Karşılaştır: Mevcut elemanı aranan değerle karşılaştır
  3. Eşleşme varsa: Bu indeksi döndür (BULUNDU! 🎉)
  4. Eşleşme yoksa: Sonraki elemana geç (index + 1)
  5. Tekrarla: Dizi bitene kadar 2-4 adımlarını tekrarla
  6. Bulunamadı: Dizi bitti ama bulamadık → -1 döndür

👁️ Görsel Açıklama: Adım Adım İzleyelim

Aşağıdaki dizide 22 sayısını arayalım:

dizi = [64, 34, 25, 12, 22, 11, 90, 45]
Adım 1 arr[0] = 64 → 64 ≠ 22 ❌ Değil, devam
Adım 2 arr[1] = 34 → 34 ≠ 22 ❌ Değil, devam
Adım 3 arr[2] = 25 → 25 ≠ 22 ❌ Değil, devam
Adım 4 arr[3] = 12 → 12 ≠ 22 ❌ Değil, devam
Adım 5 arr[4] = 22 → 22 == 22 ✅ BULUNDU! İndeks = 4
Sonuç: 5 adımda bulduk! (indeks 4'te)

🎮 İnteraktif Lineer Arama Simülasyonu

🎯 Bir sayı girin ve "Ara" butonuna tıklayın...

📊 Zaman Karmaşıklığı Analizi

En İyi Durum

O(1)

Aranan eleman ilk sırada

Ortalama Durum

O(n/2) = O(n)

Ortalama ortada bulunur

En Kötü Durum

O(n)

Sonda veya hiç yok

🧮 Neden O(n)? Detaylı Açıklama

Big-O notasyonu, algoritmanın veri büyüdükçe nasıl yavaşladığını gösterir.

10 eleman
En kötü: 10 karşılaştırma
100 eleman
En kötü: 100 karşılaştırma
1,000,000 eleman
En kötü: 1,000,000 karşılaştırma 😰

Gördüğünüz gibi, veri n kat artınca, zaman da n kat artıyor. Bu yüzden lineer (doğrusal) diyoruz!

📚 Gerçek Hayat Örneği

Bir sınıftaki öğrencilerin listesinde "Ahmet" ismini arıyorsun:

  • 30 kişilik sınıf: En kötü 30 isim kontrol
  • 300 kişilik okul: En kötü 300 isim kontrol (10x sınıf = 10x zaman)
  • 3000 kişilik üniversite: En kötü 3000 isim kontrol (100x sınıf = 100x zaman)
💡 Alan Karmaşıklığı: O(1)

Sadece birkaç değişken kullanır (i, target). Dizi ne kadar büyük olursa olsun, ek bellek ihtiyacı sabittir!

✅ Lineer Arama Ne Zaman Uygundur?

👍 Uygun durumlar:
  • Dizi sıralı değilse
  • Küçük veri setleri (n < 100)
  • Tek seferlik aramalar
  • Linked List gibi yapılarda
👎 Uygun olmayan durumlar:
  • Büyük ve sıralı diziler
  • Çok sayıda arama yapılacaksa
  • Performans kritikse
  • → Binary Search kullan!

💻 Python Implementasyonu

📝 Kod Açıklaması

Aşağıdaki kodda lineer arama algoritmasının nasıl çalıştığını adım adım görebilirsiniz. Her adımda hangi elemanın kontrol edildiğini ve sonucu ekrana yazdırıyoruz.

Python Kodu
# ============================================
# LİNEER ARAMA ALGORİTMASI - Detaylı Açıklama
# ============================================

def linear_search(arr, target):
    """
    Lineer (Doğrusal) Arama Algoritması
    
    Bu algoritma diziyi baştan sona tarayarak
    aranan elemanı bulur.
    
    Parametreler:
    -------------
    arr    : Aranacak dizi/liste
    target : Aranan değer
    
    Dönüş Değeri:
    -------------
    int : Bulunursa elemanın indeksi
          Bulunamazsa -1
    
    Zaman Karmaşıklığı: O(n) - En kötü durumda tüm diziyi tarar
    Alan Karmaşıklığı : O(1) - Sadece birkaç değişken kullanır
    """
    
    # Dizinin her elemanını tek tek kontrol et
    # range(len(arr)) → 0, 1, 2, ..., len(arr)-1
    for i in range(len(arr)):
        
        # Şu anki elemanı göster (debug için)
        print(f"Adım {i+1}: arr[{i}] = {arr[i]}", end="")
        
        # Karşılaştırma: Bu eleman aranan değer mi?
        if arr[i] == target:
            # BULUNDU! Bu indeksi döndür ve fonksiyondan çık
            print(f" ✅ BULUNDU!")
            return i  # Fonksiyon burada biter, döngü devam etmez
        else:
            # Bu eleman değil, bir sonrakine bak
            print(f" ❌ {arr[i]} ≠ {target}")
    
    # Döngü bitti ama hiç eşleşme olmadı
    # Bu satıra sadece eleman bulunamadıysa ulaşılır
    print("Eleman dizide bulunamadı!")
    return -1  # -1 döndürmek "bulunamadı" anlamına gelir

# ========================
# TEST - Kodu deneyelim!
# ========================

dizi = [64, 34, 25, 12, 22, 11, 90, 45]
print(f"📋 Dizi: {dizi}")
print(f"🔍 Aranan: 22")
print("-" * 40)

sonuc = linear_search(dizi, 22)
print("-" * 40)
print(f"📍 Sonuç: İndeks = {sonuc}")

print("\n" + "=" * 50)
print("🔍 Olmayan bir eleman arayalım: 100")
print("-" * 40)

sonuc2 = linear_search(dizi, 100)
print("-" * 40)
print(f"📍 Sonuç: {sonuc2} (bulunamadı → -1)")
Çıktı bekleniyor...

🐍 Python'da Hazır Arama Fonksiyonları

💡 Bilmekte Fayda Var!

Python'da arama için kendin döngü yazman gerekmez! Liste (list) veri tipi, lineer arama yapan hazır fonksiyonlar sunar. Arka planda bunlar da O(n) karmaşıklığındadır - yani senin yazdığın fonksiyonla aynı performansa sahiptir.

Python Liste Arama Fonksiyonları
# =============================================
# PYTHON'DA HAZIR ARAMA FONKSİYONLARI
# =============================================

dizi = [64, 34, 25, 12, 22, 11, 90, 45]
print(f"📋 Dizi: {dizi}")
print("=" * 50)

# -------- 1. 'in' operatörü --------
# Eleman var mı yok mu? (True/False döner)
print("\n🔹 'in' Operatörü:")
print(f"  22 in dizi → {22 in dizi}")      # True
print(f"  100 in dizi → {100 in dizi}")    # False

# -------- 2. index() metodu --------
# Elemanın indeksini bulur (bulamazsa ValueError!)
print("\n🔹 index() Metodu:")
print(f"  dizi.index(22) → {dizi.index(22)}")  # 4

# Eleman yoksa hata verir - try/except ile yakala!
try:
    dizi.index(100)
except ValueError:
    print("  dizi.index(100) → ValueError! (eleman yok)")

# -------- 3. count() metodu --------
# Elemanın kaç kez göründüğünü sayar
print("\n🔹 count() Metodu:")
tekrarli = [5, 3, 7, 3, 8, 3, 2, 3]
print(f"  tekrarli = {tekrarli}")
print(f"  tekrarli.count(3) → {tekrarli.count(3)}")  # 4
print(f"  tekrarli.count(100) → {tekrarli.count(100)}")  # 0

# -------- 4. enumerate() ile arama --------
# Hem indeks hem değer ile döngü
print("\n🔹 enumerate() ile Tüm Eşleşmeleri Bulma:")
aranan = 3
indeksler = [i for i, x in enumerate(tekrarli) if x == aranan]
print(f"  {aranan} sayısının indeksleri: {indeksler}")

# -------- 5. filter() ile arama --------
# Koşula uyan tüm elemanları filtrele
print("\n🔹 filter() ile Koşullu Arama:")
# 50'den büyük sayıları bul
buyukler = list(filter(lambda x: x > 50, dizi))
print(f"  50'den büyük sayılar: {buyukler}")

# -------- PERFORMANS KARŞILAŞTIRMASI --------
print("\n" + "=" * 50)
print("⚡ PERFORMANS: Hepsi O(n)!")
print("=" * 50)
print("""
   Fonksiyon     │ Zaman      │ Ne Döner?
   ──────────────┼────────────┼─────────────
   x in liste    │ O(n)       │ True/False
   liste.index() │ O(n)       │ İndeks
   liste.count() │ O(n)       │ Sayı
   filter()      │ O(n)       │ Yeni liste
""")
Çıktı bekleniyor...

📊 Hangi Fonksiyonu Ne Zaman Kullanmalı?

✅ x in liste

Sadece "var mı?" sorusu için. En okunabilir ve Pythonic yol.

if 22 in dizi: ...
📍 liste.index(x)

İndeks lazımsa kullan. Ama önce if x in liste kontrolü yap!

idx = dizi.index(22)
🔢 liste.count(x)

Kaç tane var? Tekrar eden elemanları saymak için.

n = dizi.count(3)
🔄 enumerate()

Tüm indeksleri bulmak için. Döngü yazarken kullan.

[i for i,x in enumerate(d) if x==3]
⚠️ Dikkat: Bu fonksiyonların hepsi arka planda lineer arama yapar! Yani büyük dizilerde yavaş olabilirler. Sıralı dizilerde Binary Search'ü tercih et.

🌟 Arama Neden Bu Kadar Önemli?

Arama algoritmaları, bilgisayar biliminin temel yapı taşlarından biridir. Hemen hemen her program, bir şekilde arama yapar - veri tabanlarından sorgulama, dosya sistemlerinde dosya bulma, web'de arama, oyunlarda yol bulma...

Lineer arama basit görünse de, birçok ileri algoritmanın ön adımı veya alt rutinidir.

🏗️ Diğer Algoritmaların Temeli

Sorting, Graph, Hash Table... Birçok algoritma iç yapısında arama kullanır. Aramayı anlamadan ileri konulara geçmek zordur.

💼 İş Mülakatlarında

LeetCode, HackerRank problemlerinin büyük çoğunluğu arama tabanlıdır. FAANG mülakatlarında en çok sorulan konulardan biri!

🧠 Problem Çözme Yetisi

"Brute force" (kaba kuvvet) düşüncesi lineer aramadan gelir. Önce basit çözümü yaz, sonra optimize et!

🔄 Farklı Varyasyonlar

1. Tüm Eşleşmeleri Bulma

Python Kodu
def find_all(arr, target):
    """Tüm eşleşen indeksleri döndürür"""
    indices = []
    for i in range(len(arr)):
        if arr[i] == target:
            indices.append(i)
    return indices

# Test
dizi = [5, 3, 7, 3, 8, 3, 2, 3]
print(f"Dizi: {dizi}")
print(f"Aranan: 3")

sonuclar = find_all(dizi, 3)
print(f"Bulunan indeksler: {sonuclar}")
print(f"Toplam {len(sonuclar)} adet bulundu!")
Çıktı bekleniyor...

2. Minimum/Maksimum Bulma

Python Kodu
def find_min_max(arr):
    """Dizideki minimum ve maksimum değerleri bulur"""
    if len(arr) == 0:
        return None, None

    min_val = arr[0]
    max_val = arr[0]

    for i in range(1, len(arr)):
        if arr[i] < min_val:
            min_val = arr[i]
        if arr[i] > max_val:
            max_val = arr[i]

    return min_val, max_val

# Test
dizi = [64, 34, 25, 12, 22, 11, 90, 45]
print(f"Dizi: {dizi}")

minimum, maksimum = find_min_max(dizi)
print(f"Minimum: {minimum}")
print(f"Maksimum: {maksimum}")
Çıktı bekleniyor...

✅ Avantajları ve ❌ Dezavantajları

✅ Avantajları

  • Basit: Anlaması ve yazması çok kolay
  • Sıralama gerektirmez: Karışık dizilerde çalışır
  • Az bellek: O(1) ek alan
  • Küçük dizilerde hızlı: n < 100 için yeterli
  • Linked List'te çalışır: Rastgele erişim gerekmez

❌ Dezavantajları

  • Yavaş: Büyük dizilerde O(n) çok yavaş
  • Her seferinde tarama: Cache'leme yok
  • Verimsiz: Sıralı dizilerde bile O(n)

🌍 Ne Zaman Kullanılır?

📋 Bölüm Özeti

🔍 Algoritma

Baştan sona tek tek kontrol et

⏱️ Zaman

O(n) - Lineer/Doğrusal

💾 Alan

O(1) - Sabit

✨ Avantaj

Basit, sıralama gerektirmez

Sıralı ve büyük dizilerde daha hızlı arama mı istiyorsun?
👉 Binary Search (İkili Arama) sayfasına göz at!