En kötü durumda bile aramaların her zaman O (1) işlemi gerektireceğini garanti eden çeşitli teknikler vardır.
Karma tablonun O (1) işlem yapma şansına sahip olup olmadığını ve muhtemelen karma fonksiyonumda hangi teknikleri kullanacağımı nasıl belirleyebilirim?
En kötü durum, bazı kötü niyetli saldırganların (Mallory) size, Mallory nin sistemi yavaşlatmak için özellikle seçtiği verileri kasıtlı olarak vermesi durumunda olur.
Belirli bir hash fonksiyonunu seçtikten sonra, Mallory nin hangi hash fonksiyonunu seçtiğinizi asla bulamayacağını varsaymak muhtemelen çok iyimserdir. Mallory hangi hash fonksiyonunu seçtiğinizi öğrendikten sonra, Mallory'nin hash tablonuza bu hash fonksiyonunu kullanarak eklenecek çok fazla veri vermesine izin verirseniz, mahkum kalırsınız: Mallory, milyarlarca veri öğesini dahili olarak hızlı bir şekilde oluşturabilir, hash işlevi, hangi veri öğelerinin çarpışacağını bulmak ve daha sonra çarpışması muhtemel binde bir milyon veri öğesini beslemek ve O'dan çok daha yavaş çalışan aramalara yol açmaktır.
"En kötü durumda bile" O (1) aramalarını garanti eden tüm teknikler, gelecekte her olası aramanın O (1) zamanda başarılı olabileceğini garanti etmek için her bir ekleme üzerinde biraz fazladan çalışma yaparak bu sorunu önler. . Özellikle, Mallory nin er ya da geç hangi hash fonksiyonunu kullandığımızı keşfedeceğini (en kötü durumda) varsayarız; ancak farklı bir hash fonksiyonu seçmeden önce sadece birkaç veri öğesi ekleme şansı elde eder - tablo karma veya başka bir evrensel karma - şimdiye kadar sahip olduğumuz tüm verilerin 2'de aranabileceği şekilde özel olarak seçtiğimiz veya 3 prob - yani O (1). Bu fonksiyonu rastgele seçtiğimiz için, Mallory'nin bir süre için hangi işlevi seçtiğimizi bilmeyeceğinden oldukça emin olabiliriz. Mallory olsa bileHemen bize bu yeni hash işleviyle bile önceki verilerle çarpıştığında, başka bir yeni yeni hash fonksiyonu seçebiliriz, böylece yeniden şekillendirdikten sonra, o ve diğer herkesin bize beslediği tüm önceki veriler şimdi görünebilir en kötü durumda 2 veya 3 probda - yani en kötü durumda O (1) arama.
Yeni bir karma işlevini rasgele seçmek ve tüm tabloların her zaman O (1) olduğunu garanti etmek için yeterince sık yeniden yeniden şekillendirmek oldukça kolaydır. Bu, her aramanın her zaman O (1) olduğunu garanti etse de, bu teknikler, N'inci öğeyi zaten N-1 öğeleri içeren bir karma tabloya eklerken, bazen bu ekleme için O (N) zaman gerektirebilir. Bununla birlikte, sistemi, Mallory size kasıtlı olarak yeni karma işlevini kullanarak önceki verilerle çarpışacak yeni veriler verdiğinde bile, sistemin bir şey yapmadan önce Mallory ve diğerlerinden çok sayıda öğe kabul edebileceği şekilde tasarlamak mümkündür. tam O (N) yeniden oluşturma. En kötü durumda bile O (1) aramalarını garanti etmek için yeni bir işlev ve yeniden şekillendirme seçen karma tablo teknikleri şunları içerir:
- guguklu karma , her anahtar aramanın en fazla 2 karma hesaplaması ve 2 tablo araması ile başarılı olmasını garanti eder.
- seksek hashlemesi , her bir anahtar aramasının tablodaki küçük sayı H (belki de H = 32) ardışık girişlerini inceledikten sonra başarılı olmasını garanti eder.
- dinamik mükemmel karma - Dietzfelbinger'in 1994 makalesi, her bir anahtar aramanın her zaman 2 karma hesaplama ve 2 arama ile başarılı olmasını garanti etmek için "sık sık" yeniden şekillendirilmesine rağmen, okuduğum ilk makale. tam bir rehash o kadar nadiren yapılır ki, her bir tam rehash O (n) süresi kullansa da, beklenen ortalama yerleştirme ve silme maliyeti O (1) itfa edilir.
Veri Yapıları / Karma Tablolar