Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde, özellikle dosya yönetimi konusunun (file organization) kullandığı bir özetleme (hashing) çakışması (collision) çözüm algoritmasıdır. Basitçe bir özetleme fonksiyonu (hashing function) sonucunda, çalışma olması durumunda (collision), dizi üzerinde farklı bir adrese çakışan sayı konulur veya aranır. Bu farklı sayı için ikinci bir özetleme fonksiyonu kullanılır. Buraya kadar olan tanım, aslında doğrusal bölüm (linear quotient) yöntemi ile aynıdır. CCI yönteminin getirdiği en önemli farklılık ise sayıların asil yerlerinde bulunma önceliğidir. Yani bir adresleme alanında özetleme fonksiyonu sonucunda (hashing function) yerleştirilen sayılar ve çakışma sonucunda yerleştirilen sayılar bulunmaktadır. Çakışma sonucu yerleştirilen sayılar, asil yerlerinde değil de çakışma çözüm yönteminin gösterdiği yerlerdedir. CCI yöntemi, bu şekilde çakışmadan dolayı doğal adresinde olmayan sayıların bulunduğu sıraya, yeni ve asil yeri olarak bir sayı gelmesi durumunda bu yeni gelen sayının yazılmasını söyler.
Bu anlamda hesaplamalı zincir ekleme yöntemi (CCI), EISCH, LISCH veya doğrusal sondalama (linear probing) yöntemlerinin aksine hareketli bir yöntemdir (dynamic method) ve yerleşen sayıların yerlerini değiştirebilir.
Bu durumu bir örnek üzerinden anlamaya çalışalım.
Eklenecek olan sayılarımız 27, 18, 29, 28, 39, 13, 16, 38, 53, 49 olsun. Kullanacağımız özetleme fonksiyonu ise H : K mod 11 olarak verilsin.
Bu duruma mod 11 için 11 farklı alandan oluşan boş bir dizimiz bulunacaktır:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 | ||
10 |
Yukarıdaki boş tabloda, sıra sütunu, verilerin ekleneceği yeri, anahtar sütunu örnekte verilen sayıların nereye eklendiğini, adım sütunu ise, arama ve ekleme işlemleri sırasında bir sayının beklenen yerde bulunamadığında kaçar adım eklenerek aranacağıdır.
Bu anlamda CCI algoritması bağlantılı çakışma çözümü (collision with links) yapmaktadır. Yani bir çakışma durumunda, konulması gereken sıraya değil farklı bir sıraya, bir sayı konulduğunda, bu yer bağlantı bilgisinde durmaktadır.
Yukarıdaki örnekte bulunan sayıları sırasıyla ekleyelim. İlk sayımız 27 için sıra hesaplanır ve 27 mod 11 = 5 olarak bulunur ve çakışma olmadan sorunsuz bir şekilde eklenir:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | 2 |
6 | ||
7 | ||
8 | ||
9 | ||
10 |
Yukarıdaki ekleme işlemi sırasında 27 / 2 = 2 hesaplamasına göre adım değeri de yazılır.
Ardından eklenen sayımız 18 için sıra hesaplanır ve 18 mod 11 = 7 olarak bulunur ve 18/11 = 1 bölüm değeri, adım değeri olarak çakışma olmadan sorunsuz bir şekilde eklenir:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | 2 |
6 | ||
7 | 18 | 1 |
8 | ||
9 | ||
10 |
Ardından eklenen sayımız 29 için sıra hesaplanır ve 29 mod 11 = 7 olarak bulunur. Yukarıdaki görüldüğü üzere 7. Sıra doludur ve dolayısıyla bir çakışma durumu söz konusudur. Çakışma durumunda, sayının eklenmesi gereken sıradaki adım değeri kadar ilerlenir ve ilk bulunan boş yere bu yeni sayı eklenir. Yukarıdaki örnekte bu adım değeri, daha önceden 7. Sıraya konulan 18 sayısından dolayı 1’dir. Dolayısıyla sayımız 1 adım atlanarak ilk boş bulunan yere yani 8. Sıraya yerleştirilir:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | 2 |
6 | ||
7 | 18 | 1 |
8 | 29 | |
9 | ||
10 |
Sıradaki sayımı 28 mod 11 = 6. Sıraya problemsiz bir şekilde yerleşir:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | ||
10 |
Bir sonraki sayı olan 39 mod 11 = 6, yerleştirilirken çakışma Çakışma olan 6. Sıradaki adım değeri 2’dir dolayısıyla yeni sayımız 39, bu adım değeri kadar atlanarak ilk boş bulunan yere yerleştirilecektir. 2 adım atlandığında 8. Sıra bulunur ve burası doludur, tekrar 2 adım atlanır ve 10. Sırada bulunan boş yere 39 sayısı yerleştirilir.:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | ||
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | ||
10 | 39 |
13 sayısı sorunsuz bir şekilde 13 mod 11 = 2. Sıraya yerleştirilir:
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | 13 | 1 |
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | ||
10 | 39 |
16 sayısı ise 16mod11= 5. Sıra dolu olduğu için çakışır. 5. Sıradaki adım değeri 2’dir dolayısıyla 2 adım atlanarak ilk boş bulunan yere sayı yerleştirilecektir. 7. sıra doludur dolayısıyla 9. Sıraya yerleştirilir.
Sıra | Anahtar | Adım |
0 | ||
1 | ||
2 | 13 | 1 |
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | 16 | |
10 | 39 |
38 sayısı da benzer şekilde problemli bir sayıdır. 38 mod 11 = 5 sırası doludur. Çözüm olarak 5. Sıradaki adım miktarı kadar attırılarak boş yer aranır ve 5, 7, 9, 0. Sıralara bakılarak , boş bulunan 0. Sıraya yerleştirilir.
Sıra | Anahtar | Adım |
0 | 38 | |
1 | ||
2 | 13 | 1 |
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | 16 | |
10 | 39 |
Ardından gelen 53 sayısı için benzer şekilde çakışma olur çünkü 53 mod 11 = 9. Sıra doludur. Bu sayının, şimdiye kadar olan sayılardan farkı, çakıştığı ve daha önceden 9. Sıraya yerleşen sayı olan 16 sayısının doğal yerinde bulunmamasıdır. Yani 9. Sırada, daha önceden yerleşen 16 sayısı, aslında 9. Sıraya yerleşmesi gerekmeyen ancak 5. Sıra dolu olduğu için buraya yerleştirilmiş sayıdır.
Bu durumda, CCI algoritması, doğal olarak yerleşen sayıya, çakışmadan dolayı yerleştirilen sayıdan öncelik tanımaktadır. 16 sayısının yerine 53 sayısı öncelikli olarak yerleştirilir.
Sıra | Anahtar | Adım |
0 | 38 16 | 1 |
1 | 38 | |
2 | 13 | 1 |
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | 16 53 | 1 |
10 | 39 |
53 sayısının yerleştirilmesi üzerine 16 sayısı sıradaki adım değeri olan ve 1 adım sonrası olan 0. Sıraya taşınır. Burada bulunan 38 sayısı da bir sonraki boş sıraya taşınarak adım değerleri buna göre güncellenir.
Sıra | Anahtar | Adım |
0 | 16 | 1 |
1 | 38 | |
2 | 13 | 1 |
3 | ||
4 | ||
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | 53 | 1 |
10 | 39 |
Son olarak gelen 49 sayısı, yerleşmesi gereken 49 mod 11 = 5. Sıra dolu olduğu için 5. Sırada bulunan adım değeri kadar atlanarak boş yer aranır. Sırayla, 5, 7, 9,0,2 ve 4.. Sıralara bakılır. 4. Sırada boş yer bulunduğu için buraya yerleştirilir:
Sıra | Anahtar | Adım |
0 | 16 | 1 |
1 | 38 | |
2 | 13 | 1 |
3 | ||
4 | 49 | |
5 | 27 | 2 |
6 | 28 | 2 |
7 | 18 | 1 |
8 | 29 | |
9 | 53 | 1 |
10 | 39 |
Yukarıdaki örnekte sayıların nasıl yerleştirildiğini gördük. Bu yöntemi özetleyecek olursak:
- Yerleşecek sayının (anahtarın) özetleme fonksiyonu değerini (hashing function) hesapla ayrıca bölümden gelen adım değerini de hesaplayarak buraya yerleştir.
- Şayet burası doluysa, hesaplanan adım değeri kadar atlanarak boş olan ilk yere sayı yerleştirilir.
- Şayet sayının yerleşeceği yer doluysa ve buradaki sayı, normalde yerleşmesi gereken yer değilse o zaman yeni gelen sayı önceliğe sahip olup buradaki sayı ile yer değiştirilir.
Yukarıdaki bu 3 basit adım takip edilerek CCI algoritmasına göre yerleştirme işlemi yapılabilir.
brent yöntemine (Brent’s method) benzer şekilde, CCI yöntemi de sınıflandırma bakımından, hareketli metot (dynamic method) olarak kabul edilebilir. Bundan kasıt, bir sayı bir sıraya yerleştikten sonra buradan hareket edebilir, bu durum yukarıdaki örnekte 53 sayısının yerleştirilmesi sırasında açıkça görülmektedir.