Junior
Hash tabloları ve temel çalışma prensipleri hakkında bilgi verin.
sobes.tech yapay zeka
AI'dan gelen yanıt
Hash tablosu (hash haritası), anahtarları değerlere eşleyen bir veri yapısıdır.
Çalışma prensibi:
- Hashleme: Her anahtar için, bir hash kodu hesaplanır — sabit boyutlu sayısal bir değer, bir hash fonksiyonu kullanılarak. İyi bir hash fonksiyonu, hash kodlarını çıktı aralığı boyunca eşit şekilde dağıtır.
- İndeksleme: Hesaplanan hash kodu, karşılık gelen değerin saklanacağı dizideki indeksi (pozisyonu) belirlemek için kullanılır. Sıkça,
hash(key) % array_sizeifadesi, nihai indeksi verir. - Depolama: Dizide, hesaplanan indekste, bir (anahtar, değer) çifti saklanır.
- Arama: Bir anahtarla değeri bulmak için, anahtarın hash kodu tekrar hesaplanır, indeks belirlenir ve bu indeksten değer alınır.
- Çakışmalar: Farklı anahtarların aynı hash koduna sahip olması durumudur. Çakışmaları çözmek için çeşitli yöntemler vardır:
- Kuyruk yöntemi (Separate Chaining): Her dizininde, o indekse gelen tüm (anahtar, değer) çiftlerini içeren bir liste (veya başka bir veri yapısı) tutulur.
- Açık adresleme (Open Addressing): Çakışma durumunda, belirli bir kurala göre dizide başka bir boş yer aranır (doğrusal sondalama, kare sondalama, çift hashleme).
Avantajlar:
- Ortalama olarak, ekleme, silme ve arama işlemleri O(1) karmaşıklığındadır, eğer hash fonksiyonu iyiyse ve çakışmalar nadirdir.
Dezavantajlar:
- En kötü durumda performans O(n) olabilir, eğer tüm anahtarlar aynı indekse hashlenmişse (örneğin, kötü bir hash fonksiyonu veya çok sayıda çakışma durumunda).
- Ekstra bellek gerektirir, diziyi ve muhtemelen çakışma çözümünü içerecek şekilde.
Swift'te, hash tabloları Dictionary tipiyle uygulanır.
// Swift'te Dictionary kullanım örneği
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Anahtar ile erişim
let value = myDictionary["banana"] // Optional(2) alır
// Ekleme/güncelleme
myDictionary["grape"] = 4 // Yeni bir çift ekler
myDictionary["apple"] = 10 // "apple" anahtarının değerini günceller
// Silme
myDictionary["orange"] = nil // "orange" anahtarına sahip çifti siler