HASH(KARMA) TABLOSU VERİ YAPISI

Benzer belgeler
İlgili Konular: Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

Arama metodlarında temel işlem anahtarları karşılaştırmaktır.

YZM VERİ YAPILARI DERS#9: HASH FONKSİYONLARI

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

Class LinkedHashMap. Class LinkedHashMap java.lang.object java.util.abstractmap java.util.hashmap java.util.linkedhashmap. Kılgıladığı arayüzler:

Veri Yapıları. Öğr.Gör.Günay TEMÜR Düzce Üniversitesi Teknolojis Fakültesi

BMB204. Veri Yapıları Ders 9. B+ Ağacı, Hash, Heap. Erdinç Uzun NKÜ Çorlu Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

YZM 2116 Veri Yapıları

6.Hafta Kıyım Fonksiyonu (Hashing), BST. Doğrudan erişim tabloları Çarpışmaları ilmekleme ile çözmek Kıyım fonksiyonu seçimi Açık adresleme

Class HashMap. Class HashMap java.lang.object java.util.abstractmap java.util.hashmap. Kılgıladığı Arayüzler: Cloneable, Map, Serializable

VERİ YAPILARI. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ HASH TABLOLARI.

Kılgılayan Sınıflar: AbstractMap, Attributes, HashMap, Hashtable, IdentityHashMap, RenderingHints, TreeMap, WeakHashMap

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

Class HashSet. Metotlar. Class HashSet java.lang.object java.util.abstractcollection java.util.abstractset java.util.hashset

Görsel Programlama DERS 04. Görsel Programlama - Ders04/ 1

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

Final Sınavı Örnek Soruları Bahar 2018

I Java Veri Yapıları 1

BAĞLAÇLI LİSTELER LINKED LISTS

Dosya Yapıları. (Başlangıçtan itibaren izlenen yaklaşımlar)

HashMap O rnekleri. Örnek: /* U : Uranyum Au : Altın Ag : Gümüş Li : Lityum H : Hidrojen Altın Yeni değer : Radyum */

ArrayList(int initialcapacity) Sığası (capacity) parametrenin belirlediği sayıda olan bir dizi oluşturur.

İST 264 VERİ YAPILARI Bitirme Sınavı A Grubu

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

ArrayList Uygulamaları

BAĞLAÇLI LİSTELER LINKED LISTS

HACETTEPE ÜNİVERSİTESİ BAHAR DÖNEMİ

Programlama Dilleri 3

Class LinkedHashSet. Class LinkedHashSet java.lang.object java.util.abstractcollection java.util.abstractset java.util.hashset java.util.

D İ Z İ L E R A R R A Y S

JAVADA DİZİ İŞLEMLERİ

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

C++ Dersi: Nesne Tabanlı Programlama 2. Baskı

DOSYA ORGANİZASYONU. Çarpışma çözümleme yöntemleri ÖZLEM AYDIN TRAKYA ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Đlgili konular: Collection, Set, HashSet, Comparable, Comparator, TreeMap, Collections.synchronizedSortedSet(SortedSet), Serialized Form

HACETTEPE ÜNİVERSİTESİ BAHAR DÖNEMİ

HSancak Nesne Tabanlı Programlama I Ders Notları

Özyineleme (Recursion)

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Hash Tablosu. Barış Şimşek simsek ~ enderunix. org

Sınav Dağılım & IMKB Endeks

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

YMT219 VERİ YAPILARI ÖDEV-1

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

KUYRUKLAR. Doç. Dr. Aybars UĞUR

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

Class Vector. Class Vector java.lang.object java.util.abstractcollection java.util.abstractlist java.util.vector. Kılgıladığı arayüzler:

Max - Min Heap Tree (Max ve Min Yığıt Ağaçları) Veri Yapıları ve Algoritmalar 2 - Mustafa EGE Ders Notları

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

F(A, N, K) // A dizi; N, K integer if N<0 then return K; if A[N]>K then K = A[N]; return F(A, N-1, K);

ALGORİTMA VE PROGRAMLAMA I

Class LinkedList java.lang.object java.util.abstractcollection java.util.abstractlist java.util.abstractsequentiallist java.util.

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Veri Yapıları Laboratuvarı

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

YZM 2116 Veri Yapıları

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

ALGORİTMA VE PROGRAMLAMA I

VERİ YAPILARI LİSTELER. Yrd. Doç. Dr. Murat GÖK Bilgisayar Mühendisliği Bölümü YALOVA ÜNİVERSİTESİ

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

BİL1001 Bilgisayar Bilimlerine Giriş 1

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Yrd. Doç. Dr. Ümit ATİLA

Yrd. Doç. Dr. Caner ÖZCAN

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Final Sınavı Soruları Bahar 2018

Yrd. Doç. Dr. Caner ÖZCAN

SIRALAMA SORTING. Yrd. Doç. Dr. Aybars UĞUR

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Veri Yapıları ve Algoritmalar dönem

AĞAÇLAR. Doç. Dr. Aybars UĞUR

Programlama Dilleri 1. Ders 4: Diziler

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

6.046J/18.401J DERS 7 Kıyım Fonksiyonu (Hashing I) Prof. Charles E. Leiserson

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

YZM 2116 Veri Yapıları

Dr. Fatih AY Tel: fatihay@fatihay.net

Veri Modelleri. Ağaç Veri Modeli. Ağaç Veri Modeli

Programlama Dillerinde Kullanılan Veri Tipleri

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

YZM 2116 Veri Yapıları

Bölüm 5. Ağaç. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 73

Nesne Yönelimli Programlama

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-7 Sıralama Algoritmaları

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

Transkript:

HASH(KARMA) TABLOSU VERİ YAPISI Niçin Hash Tablosu? Arama algoritmaları, güncel ve sıkça başvurulan algoritmalardan birisidir. Bilgisayar ortamı veya diğer sayısal ortamlara kaydedilmiş bir bilginin daha sonra geri alınması pek çok uygulamada gerekli olmaktadır. Örneğin veri tabanı uygulamalarında arama işlemleri, web üzerinde arama motorları, ansiklopedi yada e-sözlük tarzı web siteleri vb hizmetler arama algoritmalarını yoğun olarak kullanan bazı uygulamalardır. Arama işlemi için bir anahtar değer kullanılır. İşlem sonucunda o anahtara ilişkin bilgiler elde edilir ya da aranılan bulunamaz. Arama algoritmalarının etkinliği kullanılan veri yapısı ile yakından ilişkilidir. Örneğin; N elemanlı bir Dizi ve Bağlı Liste Veri yapısı için arama işleminin çalışma süresi(maliyeti) O(N), İkili Arama Ağaçlarında ise O(logN) ile ifade edilmektedir. Hash(Karma) Tablosu; özellikle arama işleminin etkinliği açısından diğer veri yapılarına göre avantajlı olan bir veri yapısı olup, Arama, ekleme, silme gibi temel işlemlerin O(1) zamanda gerçekleştirilmesini sağlar. Hash Tablosu özellikle arama algoritmasının etkinliği açısından diğer veri yapılarına üstünlük sağlar. Arama işleminin yanı sıra ekleme, silme gibi temel işlemlerin de O(1) sürede gerçekleşmesini sağlayan önemli bir veri yapısıdır. İşlem Veri Yapısı Dizi Bağlı Liste İkili Arama Hash Tablosu Ağacı Ekleme O(N) O(1) O(logN) O(1) Silme O(N) O(1) O(logN) O(1) TANIM-HASH(KARMA) TABLOSU: Bir dizi elemandan oluşan basit bir veri yapısıdır. Elemanlar; sayısal(tc kimlik no.su, telefon no.su gibi), string(ad, Soyad gibi) veya özel tanımlı topluluk yapısı tipinden(ogrenci, Personel gibi) olabilir. N adet elemandan oluşan tablonun büyüklüğü N dir ve elemanlar 0 ile N-1 arasında normal bir dizideki gibi adreslenirler. Hash(Karma) Tablosunun özelliği; elemanlar ile adreslerini birbirine bağlayan birebir bir fonksiyon kullanmasıdır. Bu fonksiyona hash(karma) fonksiyonu denilir. Bu fonksiyon sayesinde elemanların bulundukları konumlar(indeksler), fonksiyonun hesaplanma zamanı kadar zamanda (genellikle sabit zamanda) belirlenebilir. Veri Toplulukları/Kayıtlar 1111 Ali Can 2220 Veli Can 3335 Ayşe Can 4444 Oya Can Key Key Hash Fonksiyonu Hash Tablosu 2220 Veli Can 1111 Ali Can 4444 Oya Can 3335 Ayşe Can 0 1 2 3 4 5 6 1

Yukarıdaki şekilde de görüldüğü gibi Hash Tablosu; verinin(yani elemanın) hash fonksiyonuyla hesaplanan konumda(indekste) tutulduğu veri yapısıdır. Bu veri yapısı veriye bir anahtar (key) yardımı ile erişilen basit bir dizi üzerine inşa edilmiştir. Anahtar(key) kullanılarak hash fonksiyonu yardımıyla bir indeks üretilir ve bu indeks ile dizideki istenen veriye ulaşılır. Anahtar tekildir(uniqe), yani bir başka kayıtta aynı anahtar olamaz. Ancak veri aynı olabilir. Bir sınıftaki öğrencilere ait kayıtlar bu duruma bir örnektir. Her öğrencinin sadece kendine ait bir numarası vardır. Ancak aynı isme sahip iki öğrenci olması muhtemeldir. Burada öğrenci numarası anahtardır(key), öğrenci ismi ise bu anahtara ait veridir. Hash Tablosu veri yapısı, yorumlayıcı (interpreter) ve derleyici (compiler) tasarımlarında, veritabanı (database) uygulamalarında, şifreleme (cryptography) yöntemlerinde yoğun olarak kullanılmakta ve doğrusal arama, ikili arama gibi diğer arama yöntemlerine göre daha hızlı sonuç vermektedir. Tamsayı elemanlardan oluşan bir Hash Tablosunun Java ile kodlanması: public class Karma{ Ornek[] tablo; boolean silindi; int N; public Karma(int N){ tablo=new Ornek[]; silindi=new boolean[n]; this.n=n; }} Hash Fonksiyonu-h(x): Bu fonksiyonun görevi; kendisine verilen bir değerden (value), benzersiz bir tamsayı (key) üretmektir. Fakat uygulama alanında her zaman benzersiz bir sayı üretecek uygun fonksiyonu bulmak çok zor hatta bazı durumlarda imkânsızdır. Eğer farklı iki değerden aynı sayı üretilirse bu duruma çakışma/çatışma (collision) denir. Hash fonksiyonu; her bir veriyi ayırt edebilecek bir anahtar değer(genellikle sayısal) var olduğu durumlarda anahtar verinin yerleştirileceği konumu(indeksi) belirlemede ve bu konum vasıtasıyla veriye hızlı bir şekilde ulaşmada kullanılır. Elemanların Hash Tablosuna yerleşeceği konumu belirlemede kullanılan iyi bir Hash(karma) fonksiyonu; hem elemanları hash tablosuna iyi serpiştirmeli, hem de mümkünse iki farklı elemanı aynı konuma(pozisyona) adreslememelidir. Bir hashing fonksiyonundan beklenenler: Herhangi bir uzunlukta değer alabilmelidir. Çıktı olarak belirlenen uzunlukta anahtar (key) üretebilmelidir. Tek yönlü olmalıdır. Fonksiyon tarafından üretilen anahtardan fonksiyona verilen değer elde edilmemelidir. Çatışmalara fırsat vermemelidir. 2

Örnek: 25, 129, 35, 2501, 47, 36 tamsayılarının N=15 olan bir Hash Tablosuna yerleştirilmesi; Boyutu N olan bir tabloda, hash fonksiyonu (h(x)) bir x anahtarını 0 ile N-1 arasında bir değerle eşleştirir. Örneğin N=15 olan bir tablo için hash fonksiyonu; h(x) = x % 15 olarak belirlenebilir. Bu durumda; x=25 için h(25)=25%15=10 olur. Bu 25 sayısının hash tablosunda 10. Konuma-indekse yerleşeceği anlamına gelir. Diğer x anahtarlarının h(x)=x%15 fonksiyonu ile hesaplanması sonucunda Hash tablosundaki konumları(indeksleri) aşağıdaki tabloda yer almaktadır: x 25 129 35 2501 47 36 h(x) 10 9 5 11 2 6 Bu durumda anahtar verilerin Hash Tablosu içindeki yerleri şu şekilde olur: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 47 35 36 129 25 2501 SORU: x=66 anahtarının hash tablosundaki konumu-indisi ne olur? Hash Tablosu veri yapısındaki temel problemler; Hangi hash fonksiyonun adreslemede kullanılacağı, Hash Tablosunun büyüklüğünün nasıl seçileceği, Eğer hash fonksiyonu birden fazla elemanı aynı konuma-indekse adreslerse(yani çakışma olursa) ne yapılacağıdır. Hash (Karma) fonksiyonun Java dilinde kodlanması: Hash (Karma) fonksiyonun anahtarları tamsayılar ise yani N elemanlı hash tablosu tamsayı elemanlardan oluşuyorsa en ilkel hash fonksiyonu anahtar%n şeklinde olabilir. Böyle bir hash fonksiyonun Java dilinde kodları: int karma(int anahtar){ return anahtar %N; } Bu fonksiyonun kullanılmasıyla ilgili olarak çıkabilecek sorun, anahtarın belli değerleri daha fazla, diğer değerleri hiç almamasıdır. Örneğin anahtar çoğunlukla 10 a bölünen sayılardan oluşuyorsa(banka hesabında bulunan para gibi) N yi 10 veya 10 a bölünen sayılardan seçmek uygun olmayacaktır. Böyle durumlarda önerilen çözüm N yi asal sayılardan seçmektir. Soru:Katar(String) ler için kullanılabilecek bir hash fonksiyonu nasıl kodlanabilir? 3

Hash fonksiyonları ve Çakışma(collision) Problemi için Stratejiler: Bir Hash fonksiyonu iki farklı anahtar değer için aynı konum/indeks adresliyorsa buna çakışma/çatışma(collision) denir. Örnek: Hash fonksiyonu h(x)=x%10 olsun. Bu fonksiyon; x=35 için h(35)=35%10=5 x=65 için h(65)=65%10=5 olacaktır. Yani 35 ve 65 key değerlerinin Hash tablosundaki konumları her ikisin de 5 olacaktır. Hash tabloları için önemli bir kısıtlayıcı durum olan bu problemin çözümü için literatürde bazı stratejiler önerilmektedir. Aşağıda bu stratejiler açıklanmaktadır. Strateji-1: Çakışma(collision) probleminin giderilmesi için kullanılabilecek stratejilerden birisi; Aynı konuma/indekse adreslenen elemanları bir bağlı liste ile tutmaktır. Bu strateji literatürde ayrı zincir oluşturma (seperate chaining) olarak adlandırılır. Aşağıdaki şekilde her elemanı bir bağlı liste olan Hash tablosu verilmiştir. Bu hash tablosunun oluşturulmasında: hash fonksiyonu h(x)=x%n (N=15)olarak alınmış, Hash tablosuna yerleştirilen elemanlar 16, 47, 35, 36, 127, 99, 25, 2501, 129, 65, 29, 14. Ayrı zincir oluşturma (seperate chaining-bağlı Liste kullanarak) yöntemi ile çakışma problemini çözmede temel varsayım, aynı pozisyona adreslenen eleman sayısının az olmasıdır. (Literatürde, aynı pozisyona adreslenen bağlı liste eleman sayısı 10 u geçmedikçe bu stratejinin en uygun çözüm olacağı 4

belirtilmektedir. Bu durumda örneğin 10000 elemanın yerleştirileceği tahmin edilen bir tablonun 1000 lik açılması yeterli olacaktır). Bağlı liste ile çakışma probleminin çözümünde aynı konuma adreslenen her yeni eleman bağlı listenin başına ekleneceğinden, her ekleme(sona) işlemi için çalışma süresi O(1) zamanda gerçekleşecektir. Ayrı zincir oluşturma stratejisinde eğer sisteme çok fazla eleman eklenirse yapı doğrusal arama yöntemine benzemeye başlar. Sisteme çok az eleman eklenirse sistem rastgele erişimli bir sistem gibi olur. Bu sistemde ortalama olarak sisteme kaç eleman geleceği konusunda bir öngörüde bulunulmalıdır. Hash Tablosu daha sonra büyütülebilirse de bunun doğal olarak bir maliyeti olacaktır. Aşağıdaki Java kodları Bağlı Liste veri yapısından yararlanarak bir Hash Tablosu tanımlamayı sağlar. public class Karma{ Liste[] tablo; /*Liste veri yapısının tanımı ders kitabı Sayfa 22 Tablo 2.5 te verilmektedir.*/ int N; public Karma(int N){ tablo=new Liste[N]; for(int i=0;i<n;i++) tablo[]=new Liste(); this.n=n; }} Strateji-2: Çakışma probleminin çözümü için bağlı liste kullanmak her ne kadar problemi çözse de; i). Yeni bir veri yapısını kullanmak zorunda olma, ii). Her yeni eleman eklendiğinde hafızada yer açmanın getirdiği yavaşlama nedenleriyle dezavantajlıdır. Çakışma probleminin çözümü için önerilen bir diğer strateji açık adresleme (open addressing)dir. Açık adreslemede bir çakışma meydana geldiğinde sırayla karma fonksiyonu h(x)+f(1)%n, h(x)+f(2)%n, h(x)+f(1)%n, h(x)+f(3)%n, Burada f fonksiyonu çakışma giderme fonksiyonu olarak adlandırılmakta ve değişik stratejiler ile değişik adreslemeler yapılabilmektedir. Strateji-2.1.Doğrusal strateji(sıralı Yoklama Yöntemi -Linear Probing ):Doğrusal stratejide f ; f(i)=i gibi doğrusal bir fonksiyondur. Bu yolla i. Konumda bir çakışma varsa bir sonrakine, orada da çakışma varsa bir sonraki konuma adresleme mümkün olabilmektedir. Diğer deyişle, Sıralı Yoklama Yöntemi (Linear Probing) yönteminde hash fonksiyonları ile elde edilen indekse değer yerleştirilmeye çalışılır. İlgili indeks dolu ise ilk boş indekse yerleştirme yapılır. 5

Örnek : Tablo N=15 eleman uzunluğunda olsun. Yerleştirilecek eleman 65 olsun. Hash fonksiyonu h(x)=x%n kullanıldığını düşünelim. Tablonun 5 nolu konumu dolu olduğundan 6 nolu indekse geçilir,6 nolu indeks de dolu bu şekilde devam ederken ilk boş indeks 7. Konum olduğundan 65 değeri 7nolu konuma yerleştirilir. Benzer şekilde yeni bir eleman ekleme işlemi ilk boş bulunan yere yapılır, Silme işlemi de ilk boş alan bulunana kadar devam eder. Avantaj/Dezavantajlar: Bağlı listeler gibi ayrı bir veri yapısına ihtiyaç duyulmaz. Kayıtların yığın şeklinde öbeklenmesine neden olur. Silme ve arama işlemleri için gereken zaman aynı hash değeri sayısı arttıkça artar. Sıralamalı yoklama yönteminin en önemli dezavantajı arama sırasında başarısız aramalarda (unsucsessful search) tablonun sonuna kadar gitme zorunluluğudur. Strateji-2.2.İkinci Derece strateji(quadratic Probing): Bu stratejiye göre çakışmanın olduğu adrese gelen ikinci kayıt, Karesel (Quadratic) fonksiyonla sonraki adrese yerleştirilir. En çok kullanılan fonksiyon: f(i) = h(x)+ i 2 Yeni pozisyon için sırasıyla (h(x)+1 ), (h(x)+2 ),..., (h(x)+n ) değerlerine karşılık gelen pozisyonlara bakılır ve ilk boş olana yerleştirilir. 6

Örnek: Tablo N=15 eleman uzunluğunda ve yerleştirilecek eleman 65 olsun. Hash fonksiyonu h(x)=x%n kullanıldığını düşünelim. Tablonun 5 nolu konumu dolu olduğundan bir sonraki adres h(65)+ 1 yani 6 nolu indekse geçilir, 6 nolu indeks de dolu bu durumda h(65)+2 yani 9 nolu indekse geçilir, bu indeks de dolu olduğundan h(65)+3 = 14.konuma geçilir, Tabloda 14. konum boş olduğundan 65 sayısı 14 konuma yerleştirilir. Avantaj/Dezavantajlar: Anahtar değerlerini Sıralı Yoklama Yöntemi (linear probing) metoduna göre daha düzgün dağıtır. Yeni eleman eklemede tablo boyutuna dikkat edilmezse sonsuza kadar çalışma riski vardır. Örneğin; Boyutu 16 (0-15) olan bir tabloda 0, 1, 4 ve 9 pozisyonlarının dolu olduğu durumda 16 değerini eklemeye çalıştığımız zaman sonsuz döngüye girer. Strateji-2.3.Çift Karma (Double Hashing) Stratejisi: Çift Karma stratejisinde aynı pozisyona gelen ikinci kayıt için ikinci bir hash fonksiyonu kullanılır. İkinci hash fonksiyonu 0 değerini alamaz. En çok kullanılan fonksiyon: hash(x) = hash1(x) + i * hash2(x) hash2(x)= R ( x % R ), Burada R Tablo boyutundan küçük ilk asal sayı seçilebilir. hash(x) = hash1(x) hash(x) = hash1(x) + 1 * hash2(x) hash(x) = hash1(x) + 2 * hash2(x) 7

hash(x) = hash1(x) + 3 * hash2(x) Örnek: 65 değerinin eklenmesi hash1(x)= x % 15 hash2(x)=11 ( x % 11 ) (11 asal sayısı 14 ten küçük olan ilk asal sayıdır.) hash(65) = hash1(65) hash(65) =5 dolu hash(65) = hash1(5) + 1 * hash2(65) hash(65) =5 +(11-10)=6 dolu hash(65) = hash1(5) + 2 * hash2(65) hash(65) =5 +2=7 Avantaj/Dezavantajlar: Anahtar değerlerini Sıralı Yoklama Yöntemi (linear probing) metoduna göre daha düzgün dağıtır ve öbekler oluşmaz. İkinci Derece (quadratic probing) stratejiye göre daha yavaştır. Çünkü ikinci bir hash fonksiyonu hesaplanır. ÖZET Hash Tablo veri yapısı ile veri arama, ekleme ve silme işlemleri sabit zamanda(o(1)) gerçekleşir. Bununla beraber tablo içindeki elemanların sıralanması, en büyük ve en küçük elemanların bulunması gibi işlemlerde verimli değildir. Hash tablolarının en büyük kısıtı diziler ile oluşturulmalarıdır. 8

JAVA COLLECTION FRAMEWORK(JFC) VE HASH TABLE SINIFI Hashtable sınıfı Java Collections Framework un bir üyesidir. java.util Class Hashtable<K,V> java.lang.object java.util.dictionary<k,v> java.util.hashtable<k,v> Bu sınıf anahtarları değerlere göndererek bir hash table yaratır. Null olmayan her nesne anahtar yada değer olarak kullanılabilir. Bir Hashtable yapısına nesneleri depolamak ve onlara erişimi sağlamak için, anahtar olarak kullanılan nesnelerin hashcode() metodu ile equals() metodunu kılgılıyor olması gerekir. Bir Hastable yapısının performansını etkileyen iki parametre vardır: başlangıç sığası ve yükleme katsayısı. Hashtable içindeki eleman sayısı onun kapasitesidir. Başlangıç sığası; Hashtable yaratılırken belirlenen bileşen sayısıdır. Yükleme katsayısı ise, sığasının ne kadarı dolduğunda otomatik olarak sığa artımına geçeceğini belirleyen orandır. Genellikle, yükleme katsayısı 0,75 dir. Bu demektir ki, Hashtable bileşenleri %75 oranında dolduğunda, sığa otomatik olarak artar. Bir Hashtable kurulurken, gerektiğinde sığası ve yükleme katsayısı belirlenebilir. JCF HashTable sınıfının işlevleri: Hashtable Sınıfının Kurucuları(Constructor) Hashtable() Başlangıç kapasitesi 11 ve yükleme katsayısı 0,75 olan boş bir Hashtable yaratır. Hashtable(int initialcapacity) Başlangıç kapasitesi parametrenin belirlediği sayı ve yükleme katsayısı 0,75 olan boş bir Hashtable yaratır. Hashtable(int initialcapacity, float loadfactor) Başlangıç sığası ve yükleme katsayısı parametrelerle belirlenen sayılar olan boş bir Hashtable yaratır. clear() Hiçbir anahtar içermeyecek biçimde Hashtable yapısını temizler. clone() Hashtable nesnesinin boş bir kopyasını yaratır. Anahtarları ve değerleri kopyalamaz contains(object value) Verilen öğeye eşleşen bir ya da birden çok anahtar varsa true değeri verir. containskey(object key) Verilen anahtara eşleşen bir gönderim varsa true değerini verir. elements() Hashtable içindeki değerleri numaralar. equals(object o) 9

Verilen nesnenin, parametredeki nesneye eşit olup olmadığını bulur. get(object key) Verilen anahtara eşleşen değeri verir. Eğer verilen anahtara eşleşen öğe yoksa null verir. hashcode() Map in hash kodunu verir. isempty() Hashtable in boş olup olmadığını denetler. keys() Hashtable içindeki anahtarları sıralar. put(k key, V value) Verilen anahtarı verilen öğeye eşler. remove(object key) Verilen anahtarı ve ona eşlenen değeri siler. tostring() Hashtable içindeki nesnelerin bir string temsilini verir. Bu temsil, değerleri metin olarak yazar ve onları küme simgesi ([]) içinde verir. Örnek: import java.util.hashtable; import java.util.enumeration; public class HashtableDemo { public static void main(string[] args) { Hashtable<Integer, String> htable = new Hashtable<Integer,String>(); // Hashtable nesnesine oğe ekleme htable.put(new Integer(474), "Kars"); htable.put(new Integer(376), "Balıkesir"); htable.put(new Integer(322), "Ankara"); htable.put(new Integer(232), "İzmir"); htable.put(new Integer(284), "Edirne"); // Hashtable oğelerini yazdır System.out.println(hTable); // anahtar ve değerlere erismek icin Hashtable sıralaması Enumeration em = htable.keys(); while (em.hasmoreelements()) { // Hashtable'ın oğelerine erisim int key = (Integer) em.nextelement(); // değere erisim String value = (String) htable.get(key); System.out.println("Anahtar :" + key + " değer :" + value);} 10

Program Ekran Çıktısı: {284=Edirne, 322=Ankara, 376=Balıkesir, 232=İzmir, 474=Kars} Anahtar :284 değer :Edirne Anahtar :322 değer :Ankara Anahtar :376 değer :Balıkesir Anahtar :232 değer :İzmir Anahtar :474 değer :Kars Örnek: import java.util.enumeration; import java.util.iterator; import java.util.hashtable; import java.util.collection; public class HashtableDemo { public static void main(string[] args) { // Hashtable nesnesi yarat Hashtable ht = new Hashtable(); // Hashtable nesnesine oğe ekle ht.put("1", "Merve"); ht.put("2", "Derya"); ht.put("3", "Ufuk"); Collection c = ht.values(); System.out.println("Hashtable'in oğeleri :"); // koleksiyon uzerinde Iterator Iterator itr = c.iterator(); while (itr.hasnext()) System.out.println(itr.next()); // koleksiyondan sil c.remove("merve"); // Hashtable oğeleri System.out.println("Silme işleminden sonra Hashtable geri kalan oğeleri :"); Enumeration e = ht.elements(); while (e.hasmoreelements()) System.out.println(e.nextElement());}} Program Ekran Çıktısı: Hashtable'in oğeleri : Ufuk Derya Merve Silme işleminden sonra Hashtable geri kalan oğeleri : 11

Ufuk Derya 12