En Basit Arama Algoritması
Nasıl çalışır?
O(n) ne demek?
Adım adım gör
Çalıştır ve öğren
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.
Kitaplığında bir kitap arıyorsun ama kitaplar karışık durumda (sıralı değil). Ne yaparsın?
İşte bu lineer arama! Baştan başla, tek tek kontrol et, bulana kadar devam et.
Aşağıdaki dizide 22 sayısını arayalım:
dizi = [64, 34, 25, 12, 22, 11, 90, 45]
O(1)
Aranan eleman ilk sırada
O(n/2) = O(n)
Ortalama ortada bulunur
O(n)
Sonda veya hiç yok
Big-O notasyonu, algoritmanın veri büyüdükçe nasıl yavaşladığını gösterir.
Gördüğünüz gibi, veri n kat artınca, zaman da n kat artıyor. Bu yüzden lineer (doğrusal) diyoruz!
Bir sınıftaki öğrencilerin listesinde "Ahmet" ismini arıyorsun:
Sadece birkaç değişken kullanır (i, target). Dizi ne kadar büyük olursa olsun, ek bellek ihtiyacı sabittir!
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.
# ============================================
# 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)")
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'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
""")
Sadece "var mı?" sorusu için. En okunabilir ve Pythonic yol.
if 22 in dizi: ...
İndeks lazımsa kullan. Ama önce if x in liste kontrolü yap!
idx = dizi.index(22)
Kaç tane var? Tekrar eden elemanları saymak için.
n = dizi.count(3)
Tüm indeksleri bulmak için. Döngü yazarken kullan.
[i for i,x in enumerate(d) if x==3]
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.
Sorting, Graph, Hash Table... Birçok algoritma iç yapısında arama kullanır. Aramayı anlamadan ileri konulara geçmek zordur.
LeetCode, HackerRank problemlerinin büyük çoğunluğu arama tabanlıdır. FAANG mülakatlarında en çok sorulan konulardan biri!
"Brute force" (kaba kuvvet) düşüncesi lineer aramadan gelir. Önce basit çözümü yaz, sonra optimize et!
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!")
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}")
Baştan sona tek tek kontrol et
O(n) - Lineer/Doğrusal
O(1) - Sabit
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!