Bu bölümde bir dizi içerisinde istenen elemanı arayıp bulma yöntemleri anlatılacaktır.
Kullanılan belli başlı iki yöntem mevcuttur. Bunlar ;
1 – Sıralı arama ( Sequential search )
2 – İkiye bölerek ( ikili ) arama ( Binary search )
1- SIRALI ARAMA ( SEQUENTIAL SEARCH ) Dizinin sıralı ve sırasız olması önemli değildir. Daha önce DİZİLER bölümünde yazılan programlarda kullanılan arama yöntemidir. Yani dizinin ilk elemanından başlayarak aranan eleman bulununcaya kadar işlem devam eder. Dizide 1000 elemanın olması durumunda ve aranan eleman 900. Sırada ise bu durumda 900 adet test işleminin yapılması gerekir. Bu da zaman alıcı bir işlemdir. Şimdi bu sıralama yöntemi ile ilgili programı yazalım:
Program Sequential_Search;
Uses Crt ;
Type
Stip = Array[1..10] of Integer;
Const
S : Stip =( 27, 3, 4, 5, 32, 56, 33, 33, 63, 1 ) ;
N = 10 ;
Var
İ , yer , ara : Integer ;
Baction SiraliAra ( ara : Integer ; S : Stip ) : Integer ;
Begin
For i := 1 To n Do
If s [ i ] =ara Then
Begin
SiraliAra :=i ; Exit ;
End;
SiraliAra:=0 ;
End;
Begin
Write ( ; Aradiginiz Sayi : ` ) ; Readln (Ara ) ;
Yer : = SiraliAra ( Ara, S ) ;
If yer = 0 Then Writeln ( ara , ` Kayitli degil ` )
Else
Writeln (ara, ` sayisi dizinin `, yer ,` . elemani ` ) ;
Readln ;
End.
Bu programda sabit olarak 10 adet sayı S dizi değişkenine aktarılmıştır. Program kullanıcıdan bir sayı istemekte ve bu sayının olup olmadığını araştırmak için SiraliAra isimli fonction’a gitmektedir. Sayının bulunması durumunda, sayını adis numarası, bulunmaması durumunda ise 0 değeri gönderilmektedir.
2 – İKİLİ ARAMA ( BINARY SEARCH ) Bu arama yöntemi sıralı olan diziler arama yapar. Sıralama işleminin küçükten büyüğe doğru olması durumu için işlem anlatılacaktır. Arama işlemine dizinin ortasındaki eleman ile başlanmakta ve bir test işlemi ile sayının ortadaki elemandan önce veya sonra olduğu belirlenmektedir. Eğer aranan sayı ortadaki elemandan sonra ise, orta elemanın indis numarası alt değer, değilse üst değer olarak alınmaktadır. Bu üst ve alt değerin ortası bulunmakta ve buna göre karşılaştırma işlemine devam edilmektedir. Yani her defasında aralık ikiye bölünüyor. Buna göre bir alt ve üst değer belirleniyor. Bu alt ve üst değer arasında kalan alanda arama yapılmaktadır. Dizinin diğer kısmı için arama yapılmasına gerek kalmamaktadır. Binary Search yöntemine göre arama yapan program aşağıda verilmiştir.
Program Binary_Sort ;
Uses Crt ;
Teyp
Stip = Array [1..10] of Integer ;
Const
S : Stip = (3, 10, 24, 14, 37, 66, 63, 25, 80, 23 ) ;
N : 10 ;
Var
Yer , Ara : Integer ;
Procedure Selection ( Var S : Stip ; N : Integer ) ;
Var
İ , j : Integer ;
Procedure Degis ( Var a , b : Integer ) ;
Var
C : Integer ;
Begin
C : = A ; A : = B ; B : = C ;
End ;
Begin ( slection )
For i : = 1 To n – 1 Do
For j : = i + 1 To n Do
If S [ i ] > S [ j ] Then Degis ( s [ i ] , s [ j ] ) ;
End ;
Function İkiliAra ( Ara : Integer ; s : Stip ) : Integer ;
Var
Orta , alt , üst : Integer ;
Begin
Alt : = 1 ;
Üst : = N ;
İkiliAra : = 0 ;
While üst > alt + 1 Do
Begin
Orta : = ( Üst + Alt ) Div 2 ;
If ara = s [ orta ] Then
Begin
İkiliAra : = Orta ; Exit ;
End ;
If ara < s [ orta ] Then ust : = orta
Else alt : = orta ;
End ;
If ara = s [ üst ] Then İkiliara : = üst
Else
If ara = s [ alt ] Then ikiliara : = alt
Else ikiliara : = 0 ;
End ;
Begin
Selection ( s , n ) ;
Write ( ‘ Aradığınız Sayı ‘ ) ; readln ( Ara ) ;
Yer : = IkiliAra ( Ara , S ) ;
Write ( Ara , ‘ sayısı dizinin ‘ , yer , ‘ . elemanı ‘ ) ;
Readln ;
End .
Yukarıdaki programda ; dizi ilk önce sıralanmakta, dizi içerisinde aranacak eleman istenmekte ve arama işlemi için IkiliAra function ‘ ına gidilmektedir. Aranan sayının 63 olması durumu için işlemi algoritma olarak inceleyelim:
Alt Ust Orta S[orta]
1 10 5 24 = 63 ? hayır (alt :=orta)
5 10 7 37 = 63 ? hayır (alt :=orta)
7 10 8 63 = 63 ? Evet(sayıbulundu)(yer:=orta)
Linkback: https://www.buyuknet.com/bilgisayar-arama-yontemleri-t42611.0.html