Giriş
Algoritmalar, veriyi düzenlemek ve aramak için kullandığımız temel yapı taşlarıdır. Bu rehberde "Temel Algoritmalar" başlığı altında kısa açıklamalar ve çalıştırılabilir seviyede Python/JavaScript snippet'leri ile sıralama (sorting) ve arama (searching) yöntemlerini göreceksiniz. Temel kavramlar için üniversite dersleri ve geliştirici kaynakları yol göstericidir; örneğin Marmara Üniversitesi'nin algoritma ders notları ve sektör makaleleri giriş için faydalıdır (Marmara Üniversitesi, TechCareer).
Sıralama Algoritmaları — Temel Kavramlar
Sıralama algoritmaları, bir diziyi belirli bir düzene (ör. artan) koymak için kullanılır. En temel örnekler arasında Bubble Sort, Merge Sort ve Quick Sort bulunur. Bu yöntemlerin avantaj ve dezavantajları; çalışma zamanı (time complexity), bellek kullanımı ve kararlılık (stability) gibi ölçütlerle değerlendirilir (TechCareer, Marmara Üniversitesi).
Bubble Sort (Kabarcık Sıralama)
Açıklama: En basit karşılaştırmalı sıralama algoritmasıdır; komşu elemanları karşılaştırıp gerektiğinde takas eder. Küçük veri setlerinde öğrenme amaçlı yararlıdır ancak performansı düşüktür.
Zaman karmaşıklığı: genellikle O(n^2) (ortalama ve en kötü durum). Bellek: O(1).
Python (örnek):
def bubble_sort(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]
return arr
Merge Sort (Birleştirme Sıralaması)
Açıklama: Böl ve yönet (divide and conquer) yaklaşımı kullanır. Diziyi ikiye böler, her parçayı sıralar ve sonra iki sıralı parçayı birleştirir. Genellikle garantili O(n log n) zaman karmaşıklığı sağlar ve stabil bir sıralama yöntemidir.
Zaman karmaşıklığı: O(n log n) hem ortalama hem de en kötü durumda. Bellek: ekstra O(n) kullanır.
Python (örnek):
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr)//2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
i = j = 0
merged = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i]); i += 1
else:
merged.append(right[j]); j += 1
merged += left[i:] + right[j:]
return merged
Quick Sort (Ayrıştırmalı Sıralama)
Açıklama: Pivot seçip diziyi pivot'a göre küçük ve büyük olarak ayırır, sonra rekürsif olarak sıralar. Ortalama durumda O(n log n) hızındadır; doğru pivot seçimine bağlı olarak performansı değişir. Tipik uygulamalarda çok hızlıdır ve yerinde uygulanan versiyonlarda ek bellek gereksinimi düşüktür.
Zaman karmaşıklığı: ortalama O(n log n), en kötü durum O(n^2) olabilir (kötü pivot seçiminde). Stabil değildir (standart uygulama).
Python (basit örnek, pivot ile ayırma):
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
Arama Algoritmaları — Linear ve Binary
Arama algoritmaları; bir dizide belirli bir öğeyi bulmak için kullanılır. En temel iki yöntem Linear Search (doğrusal arama) ve Binary Search (ikili arama)dir. Binary Search kullanabilmek için dizi önceden sıralanmış olmalıdır (TechCareer).
Linear Search (Doğrusal Arama)
Açıklama: Dizideki elemanları baştan sona kontrol eder. Küçük veya sıralı olmayan veri setleri için basittir.
Zaman karmaşıklığı: O(n). Bellek: O(1).
Python:
def linear_search(arr, target):
for i, v in enumerate(arr):
if v == target:
return i
return -1
Binary Search (İkili Arama)
Açıklama: Sıralı bir dizide ortadaki elemanı kontrol ederek arama aralığını yarıya indirir. Bu yöntem, doğru uygulandığında çok daha hızlı sonuç verir (özellikle büyük veri setlerinde).
Zaman karmaşıklığı: O(log n). Gereksinim: aranan dizi daha önceden sıralanmış olmalıdır (aksi halde önce sıralama gerekir). Daha fazla teknik detay için referans dokümanlar ve ders notlarına bakabilirsiniz (Marmara Üniversitesi).
Iteratif Python örneği:
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
Kısa Snippetler: Python ve JavaScript Örnekleri
Aşağıda her iki dilde de kısa ve doğrudan çalıştırılabilecek snippet örnekleri yer alıyor. Bu snippet'ler öğrenme ve küçük uygulamalar için uygundur.
Binary Search — JavaScript (iteratif)
JavaScript:
function binarySearch(arr, target) {
let lo = 0, hi = arr.length - 1;
while (lo <= hi) {
const mid = Math.floor((lo + hi) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) lo = mid + 1; else hi = mid - 1;
}
return -1;
}
Linear Search — JavaScript
JavaScript:
function linearSearch(arr, target) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) return i;
}
return -1;
}
Pratik İpuçları ve Ne Zaman Hangi Yöntem?
- Küçük veri setleri: Basitlik tercih edilebilir — linear search ve basit sıralama yöntemleri yeterli olabilir.
- Büyük veri setleri: Genellikle O(n log n) davranışı veren Merge veya iyi uygulanmış Quick Sort tercih edilir.
- Arama sıklığı yüksekse: Eğer veriyi sık arıyorsanız, veriyi bir kez sıralamak ve sonra binary search kullanmak toplam maliyeti düşürebilir.
- Stability (kararlılık): Eğer eşit anahtarlı öğelerin sıralı kalması önemliyse Merge Sort gibi stabil yöntemleri tercih edin.
- Gerçek uygulamalarda: Çoğu dilin yerleşik sort fonksiyonları iyi optimizasyonlara sahiptir; önce hazır fonksiyonu değerlendirin ve profil sonuçlarına göre gerektiğinde özelleştirin.
Binary Search — Adım Adım Örnek
Dizi: [2, 3, 5, 7, 11, 13], aranan: 7
- Başlangıç: lo=0, hi=5 → mid=(0+5)//2=2 → arr[2]=5 (küçük) → lo=3
- Yeni aralık: lo=3, hi=5 → mid=4 → arr[4]=11 (büyük) → hi=3
- Yeni aralık: lo=3, hi=3 → mid=3 → arr[3]=7 → bulundu (index 3)
Bu örnek, her adımda arama aralığının yaklaşık yarıya indirildiğini gösterir; dolayısıyla logaritmik zaman kazancı elde edilir.
Kontrol Listesi (Quick Checklist)
- Dizi sıralı mı? (binary search için şart)
- Veri setinin büyüklüğü ve bellek kısıtları ne düzeyde?
- Sıralama kararlılığı gerekli mi?
- Dilinizin hazır fonksiyonları yeterli mi, yoksa özel bir uygulama mı gerekli?
- Algoritmayı test ederken farklı boyutlarda zaman/alan profilini ölçtünüz mü?
Sonuç
Temel sıralama ve arama algoritmalarını bilmek; hangi durumda hangi yöntemi seçmeniz gerektiğini anlamanızı sağlar. Kaynak dersler ve makaleler (örneğin Marmara Üniversitesi ve TechCareer) konunun teorik temelini sunar. Buradaki snippet'ler öğrenme ve hızlı prototipleme amaçlı hazırlıdır; gerçek dünya uygulamalarında profil ve testi unutmayın.