Daha önce başlamış olduğumuz "collusion resolution" yöntemlerinden "bağlantı yöntemi ile çarpışma önleme" tekniğinin bir diğer konusundan devam ediyoruz. Şimdiki konumuz EISCH. Diğer anlattığım konuları okuduysanız şayet, bu isimden yanlışbir anlam çıkarmayın sakın. EISCH, collision olduğunda, kaydı başa ATMAZ!! Daha farklı bir durum söz konusu. Örnek üzerinde anlatayım.
Yine Alan Tharp'ın North Carolina State Üniversitesi için hazırladığı kitabındaki örneği yapalım:
SORU: 27-18-29-28-39-13-16-42-17
hash(key)=key mod11
ÇÖZÜM: Mod 11 dediği için tablomuzu yine 0-10 arasında çiziyoruz.
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 | ||
10 |
Ardından ilk elemanımızı yerleştirmeye başlıyoruz.
hash(27)=5 mod11
Artık bu işlemleri biliyorsunuz farz ediyorum çünkü diğer başlıklarımda bayağı anlatmıştım. O yüzden 27'yi direkt 5 numaralı göze yerleştirdim. 5 numaralı göz boş olduğundan sorunsuzca yerleştiririz.
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | |
6 | ||
7 | ||
8 | ||
9 | ||
10 |
Şimdi ikinci elemanımızı yerleştirelim.
hash(18)=7 mod 11
7 numaralı göz de boş olduğundan, 18'i de oraya sorunsuzca yerleştiririz.
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | |
6 | ||
7 | 18 | |
8 | ||
9 | ||
10 |
Sıra geldi 29'u yerleştirmeye.
hash(29)=7 mod 11
7 numaralı göz dolu! Orada 18 var. Bu yöntemde tıpkı LISCH yönteminde gösterdiğim gibi kaydı en sondaki müsait alana atıyoruz. Yani 10 numaralı göze... Yine R diye bir değer tutalım isterseniz, diğer tekniklerde yaptığımız gibi... R bize en alttaki müsait değeri versin. 10 numaralı göze 29'u koyuyoruz, artık 9 numaralı göz müsait. O yüzden R=9 oldu. 7 numaralı gözden de, 10 numaralı göze bir link attık. Sebebini bir kez daha açıklamış olayım: 29'u aramak isteyenler, doğal olarak 7 numaralı göze bakacaklar. Ancak orada 29 yok, 18 var. Dolayısıyla 29'un izini kaybetmememiz lazım. O yüzden de 7 numaralı gözden, bir link atmak zorundayız.
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | |
6 | ||
7 | 18 | 10 |
8 | ||
9 | ||
10 | 29 |
Şimdi de 28 var sırada.
hash(28)=6 mod11
6 numaralı göz boş olduğundan, 28'i sorunsuzca yerleştiririz. R=9 hala...
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | |
6 | 28 | |
7 | 18 | 10 |
8 | ||
9 | ||
10 | 29 |
39'a geldi sıra.
hash(39)=6 mod11
6 numaralı göze az önce 28'i yerleştirmiştik; yani orası dolu. O halde R değerinin işaret ettiği göze yerleştireceğiz. R=9 idi. Dolayısıyla 39'u 9 numaralı göze yerleştiriyoruz. R=8 oldu. 6 numaralı gözden, 9 numaralı göze link atarız. Çünkü 39 değerini aradıklarında önce 6 numaralı göze bakarlar... Tablo şu hale gelir:
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | |
6 | 28 | 9 |
7 | 18 | 10 |
8 | ||
9 | 39 | |
10 | 29 |
Şimdi bunun LISCH'ten farkı ne, diye soranlar vardır mutlaka. :) Az sabredin, farkı fark etmeye ramak kaldı. :)
13'ü yerleştiriyoruz şimdi de.
hash(13)=2 mod11
13 numaralı göz boş olduğundan, sorunsuzca yerleştiriyoruz. R=8 hala...
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | 13 | |
3 | ||
4 | ||
5 | 27 | |
6 | 28 | 9 |
7 | 18 | 10 |
8 | ||
9 | 39 | |
10 | 29 |
16'yı yerleştirelim hemen.
hash(16)=5 mod11
5 numaralı gözde 27 var. Dolayısıyla R değerinin işaret ettiği göze koyacağız 16'yı. R=8 olduğundan, 16'yı 8 numaralı göze yerleştiririz. 5 numaralı gözden de link atarız.. R=4 oldu artık. 7-6 ve 5 numaralı gözler dolu çünkü. En alttaki boş olan göz 4 olduğundan, R değeri de 4 oldu. :) Doğru dürüst anlatayım diye saçma sapan cümleler kuracağım yakında. :D Neyse. :)
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | 13 | |
3 | ||
4 | ||
5 | 27 | 8 |
6 | 28 | 9 |
7 | 18 | 10 |
8 | 16 | |
9 | 39 | |
10 | 29 |
42 değeri var sırada.
hash(42)=9 mod11
9 numaralı gözde39 var. (Eski bilgileri tazelemek isterseniz, şunu da belirtelim. 9 numaralı gözde home address'i[hashten dönen değeri] 6 olan 39 değeri var. Yani 39'un home addressi değil zaten orası. Dolayısıyla burada bir coalescing var)
R=4 idi en son. Dolayısıyla 42'yi 4 numaralı göze yerleştiriyoruz. R=3 oldu... 9 numaralı gözden de, 4 numaralı göze bir link atarız yine..
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | 13 | |
3 | ||
4 | 42 | |
5 | 27 | 8 |
6 | 28 | 9 |
7 | 18 | 10 |
8 | 16 | |
9 | 39 | 4 |
10 | 29 |
Veee.. :) Gelelim EISCH'in ne olduğunu anlayacağınız, 17'nin yerleştirilmesine. Aynı home address'ten en az 3 kere gelmesi lazımdı ki konuyu anlatabileyim. :) Benim suçum yok yani. :)
hash(17)=6 mod 11
6 numaralı gözde 28 var. Dolayısyla 17'yi R değerinin gösterdiği 3 numaralı göze yerleştireceğiz. Ancaaak.. Ancak 6 numaralı gözden zaten 9 numaralı göze link atılmış. LISCH olsaydı sorumuz, 6 numaralı göze giderdik. Ordan 9 numaralı göze link atılmış, 9'a giderdik; ordan da 4 numaralı göze link atılmış. 4 numaralı göze giderdik ve ordan da 17'nin bulunduğu 3 numaralı göze link atardık. Fakat EISCH böyle değil.. :)
EISCH yönteminde, yeni eklediğiniz elemanı, home address'inizdeki, yani hashten dönen değerdeki gözde bulunan elemandan sonraki ilk göze atarsınız. Örnekten devam edecek olursak: 17'nin home address'i 6 çıkmıştı. 6 numaralı gözde 28 var. İşte 17'yi hemen 28'ten sonraki eleman yapıyoruz. Bu EISCH yöntemindeki E(Early) harfinin esprisi de burada zaten. :) Yani 28'ten link direkt 17'nin bulunduğu göze atılır. Ordan da linkler eskisi gibi devam eder. Tablonun son hali şöyle olur:
Sıra | Anahtar Değeri | Link |
0 | ||
1 | ||
2 | 13 | |
3 | 17 | 9 |
4 | 42 | |
5 | 27 | 8 |
6 | 28 | 3 |
7 | 18 | 10 |
8 | 16 | |
9 | 39 | 4 |
10 | 29 |
Şimdi elemanlara kaçar adımda ulaştığımıza bakalım ve daha önceki yöntemlerde yaptığımız gibi average probe'u(ortalama olarak hedefe ulaşmadaki adım sayısı) hesaplayalım.
27 değerine 1 adımda ulaşıyoruz.
18 değerine 1 adımda ulaşıyoruz.
29 değerine 2 adımda ulaşıyoruz.
28 değerine 1 adımda ulaşıyoruz.
39 değerine 3 adımda ulaşıyoruz.
13 değerine 1 adımda ulaşıyoruz.
16 değerine 2 adımda ulaşıyoruz.
42 değerine 2 adımda ulaşıyoruz.
17 değerine 2 adımda ulaşıyoruz.
Toplamda 15 adımda 9 değere de ulaşabiliyoruz. 15/9=1.67 çıkıyor. LISCH'te bu değer 1.78 idi. Daha etkili bir yöntem imiş demek ki. :)
Bu yöntemin esprisi coalescing'i daha sonraki sıralara ötelemesidir. Yeni gelen değeri, home address'inden sonraki eleman yaptığınızda, bu yöntemi uygulamış oluyorsunuz.
Sonra görüşürüz..
12 yorum:
anlayamadığım bir yer var. bu algoritma da aynı adrese gelen sayılar var evet ama bu sayılar niye sona yerleştirilmiş, neden 10. adrese eklenmişte gerçek adresinden bir sonraki adrese eklenmemiş. çünkü eisch algoritmasının açılımını okuduğumda hemen altına ekleme yapması gerektiği yazıyor.
17'yi yerleştirirkenki açıklamamı tekrar okumanı öneririm. 2 tane zincir kurulmuş orda. 17yi yerleştirirken, 3ncü zinciri atıyoruz. Ama LISCH gibi en sona değil. EISCH'in mantığı da bu. İlk elemandan hemen sonraki yere...
Gürkan Hocam ben bu EISCH ile LISCH arasındaki farkı tam anlamadım.Yani EISCH zincirin başındaki elemandan hemen sonra. LISCH zincrin sonuna ekleme yapar ama...Yani sitedeki EISCH ile LISCH örneklerinde yerleştirmeden sonra tablo aynı.
Dostum ama zincir farklı. LISCH örneğine bakalım. http://gurkanalkan.blogspot.com/2010/11/lischlast-insertion-standart-colesced.html bağlantısında tablonun en son haline bakalım.
17'ye ulaşmak için mod11'de 6'ya gittik. 6'da yoktu, zinciri takip ettik(link kolonu), 9ncu agöze gittik, orda da yok. ORdan zinciri takip ettik 4ncü göze gittik, orda da yok. En son ordaki zinciri takip ettik ve 3e giderek 17'yi bulduk.
Ama bu EISCH'da 17'yi bulalım. mod11'de yine 6ncı göze gittik. Orda yok, ordaki zinciri takip ettik, 3ncü göze gittik. ORda 17 var. 2 adımda bulmuş olduk.
Bu 2 yöntemin average probeu da farklı zaten. Ve bu iki yöntem de linkler ile çalışıyor. Mantıkları farklı, ortalama adım sayıları da farklı çıkıyor. yani tabloada dizilişlerine çok takılma, her sayıyı bulmaya çalış, kaç adım tutuyor, ona dikkat et.
Tamam anladım Gürkan hocam çok sağol. BLISCH ve BEISCH bunlar hakkında örnek baktım ama bulamadım. Boş alanı 1 alttan 1üstten seçmesi dışında bir fark var mı?
Gaudeki ibrahim erkal ile bir alakan yoksa hash konusundaki yazılarını sırasıyla ders konusu yapıp çok pis aşırtmış dostum bilesin. sevgiler :))
O kimdir yahu :)
Yok alakam falan ama aranız yoksa basayım intihal davasını. :))
eisch de lischden farkı 3.çakışma olması lazım demişsiniz o zaman eich için de 3.çakışma lazım ama lich konusunda 3.çakışma olunca link bildirmede sorun oluşacağı için modu değişmemiz lazım demiştiniz. ne yapmamız gerekiyor.
4. çakışma olduğunda ne yapıyoruz peki?
Peki hocam 4. çakışma olduğunda nasıl bir yol izliyoruz?
Peki 4. çakışma olduğunda napıyoruz?
Table size dolmadığı sürece çakışma olması bir şey değiştirmez. mesela 50. yerleştirelim. 50%11=6, ama 6. adreste 28 var ve linki de 17 nin olduğu adresi gösteriyor yani 4.
yapacağın şey şu: 28 i 50 yi koyduğun adres ile linklendireceksin yani 28 den sonra 50 gelmiş olacak. 28 in linkini 1 yapıp. 51 in ise linkini 17 nin olduğu adres olan 4 yaparsın olay çözülür.
Yorum Gönder