You are on page 1of 3

Ad Soyad :

No : 1 2 3 4 5 6 7
Bilgisayar Müh. Bölümü Veri Yapıları Dersi Final sınavı sorularıdır.
10.08.2010
Soru 1: Kodlama ağacı nedir, kullanım amacı nedir? kısaca açıklayınız. (10 Puan)

N elemanlı alfabeye sahip bir kümede bulunan karakterlere sabit değil frekanslarına bağlı
olarak farklı uzunlukta kodlar atanması için oluşturulan ağaç şeklidir. Oluşturulan ağaçta kökten
başlanarak yapraklara kadar tüm düğümlere birer kod verilir. Bu kodlar birer bittir. Huffman
kodlama ağacı kullanılan önemli kodlama ağaçlarındandır. Huffman dahil diğer kodlama
ağaçlarınının kullanım amaçlarından en önemlisi veri sıkıştırmadır, burada amaç sık kullanılan yani
frekansı yüksek olan karakterlere kısa kodlar, frekansı düşük olan karakterlere daha uzun kodlar
atayarak veriyi daha düşük adet bit ile kodlayarak sıkıştırma sağlamaktır.

Soru 2: Kuyruk’a ekleme ve çıkarma algoritmalarını sözde kod(pseudo code) kullanarak yazınız. (10
Puan)

Kuyruğa Eleman Ekle Algoritması


Eğer(Kuyrukta yer yoksa){
MesajGöster(“Kuyruk Dolu ”) ; Dön();
}
Değilse{
KuyrukSonuPtr değişkeninin değerini 1 arttır; //ArkaPointer 1 arttır
Veriyi KuyrukSonuPtr değişkenin gösterdiği yere ekle;
Dön();
}

Kuyruktan Eleman Çıkarma Algoritması


Eğer(Kuyrukta veri yoksa){
MesajGöster(“Kuyruk Boş ”) ; Dön();
}
Değilse{
KuyrukBaşıPtr değişkeninin gösterdiği yerdeki veriyi al;
Bir sonraki veriyi KuyrukBaşıPtr değişkeni olarak ata;// Ön pointer 1 eksilt.
Dön();
}

Soru 3: 40-5-10-20-55-58-48-90-1-18 verilerinin sırasıyla ikili arama ağacına eklendiğinde oluşacak


ikili arama ağacını çiziniz. (10 puan)

1
Ad Soyad :
No : 1 2 3 4 5 6 7
Soru 4: İkili Arama ağıcında yada sıralı dizi üzerinde binarySearch (ikili arama) algoritmasını sözde
kod(pseudo code) kullanarak yazınız. (15 Puan)

İkiliAramaAğacında

void ikiliAramaAgac(agacdugum *agac, veriTürü aranan)


{ if(agac==NULL) return; /* Ağaç boş ise dön */

if(aranan==agac->anahtar) /* aranan kök düğümde ise bulundu */


yazEkrana(Agac); if(aranan < agac->anahtar) /* aranan hangi alt ağaçta? */
ikiliaramaAgac(agac->sol); /* sol altağaca dallan */
else ikiliaramaAgac(agac->sag); /* sağ altağaca dallan */
}

Sıralı Dizide

int ikiliArama(veriTürü D[], int N, veriTürü aranan)


{
int ortadaki, sol=0, sag=N-1;
while(sol<=sag) {
ortadaki=(sol+sag)/2; /* ortadaki elemanın indisi hesaplanıyor */
if(aranan == D[ortadaki])
return ortadaki; /* bulundu, indis gönderiliyor */
else if(aranan>D[ortadaki])
sol=ortadaki+1;
else
sag=ortadaki-1;
}

return -1; /* bulunamaz ise -1 değeri gönderiliyor */


}

Soru 5: Hash Function (Çırpı fonksiyonu) ne demektir, ne amaçla kullanılır, ne


tür sorunları vardır ve bu sorunlara çözüm yollarını açıklayınız. (15 puan)

Bir kayıt’ın temsilcisi olan anahtar veriyi girdi olarak alarak alan ve kayıt’ın saklanması yada
bulunması gereken yeri döndüren fonksiyonlardır. Veriler üzerinde arama yapmak için en hızlı yöntem
çırpı fonksiyonu kullanılmasıdır denilebilir; idealde, arama işlemi bir çırpıda yapıldığı için arama
karmaşıklığı O(1) olur. Ancak, uygulamada, çoğu zaman için ideal çırpı fonksiyonunu bulmak
mümkün değildir. Verilere etkin O(1) zaman karmaşıklığında erişmek için geliştirilmiş olan yöntemin
problemi ise farklı anahtar veriler için aynı adresi/slotu işaret etmesidir, bu probleme
collision/çakışma adı verilir. Çakışma problemini çözmek için;
 Açık Adresleme (open addressing)
 Bağlantılama (linking)
iki yöntem kullanılır.

Bağlantılamada, bağlantılı listelerden veya ağaç veri modellerinden yararlanılır. Çakışma sonucu
aynı adrese sahip ayrık veriler birbirine bağlantılı liste veya ikili ağaç şeklinde bağlanırlar.
Açık Adreslemede ise kendisinden sonra gelen, yani açık olan bir adres üretir. Böylece çakışmaya
neden olan sonuç yeniden hash fonksiyonundan geçirilerek veri boş bir göze kaydırılmış olunur.

2
Ad Soyad :
No : 1 2 3 4 5 6 7
Soru 6: “c:\veriler\veri.txt” isimli dosyada tamsayılar bulunmaktadır. Dosyadan bu verileri dosya
sonuna kadar okuyarak, dosyadan okunan sayıları dinamik bellek kullanarak bağlaçlı listeye ekleyen C
programı yazınız. (20 Puan)

#include <conio.h>
#include <stdlib.h>
typedef struct LinkList{
int sayi;
struct LinkList *Sonraki;
}BLISTE;
BLISTE *ilk='\0',*son='\0',*okunan='\0';
int main(void){
FILE *Dosya;
Dosya=fopen("c:\\Ders\\veri.txt","r");
while(!feof(Dosya)){
okunan=(BLISTE*)malloc(sizeof(LinkList));
fscanf(Dosya,"%d\n",&okunan->sayi);
okunan->Sonraki='\0';
if(ilk!=NULL){
son->Sonraki=okunan;
son=okunan;
son->Sonraki='\0';
}
else { /* ilk kayıt ise burası yürütülür */
ilk=okunan;
son=ilk;
ilk->Sonraki='\0';
}
}
return 0;
}

Soru 7: BubbleSort isimli fonksiyon Liste isimli dizinin başlangıç adresini ve n dizinin eleman sayısını
parametre olarak almaktadır. Başlangıç adresini aldığı diziyi kabarcık(bubble) sıralama algoritmasına
göre sıralayan C fonksiyonu yazınız. (20 puan)

BubbleSort(int *Liste, int n)


{ int gecici,i,j;
for(i=0; i<n; i++){
for(j=n-2; j>i;j--) {
if(Liste[j-1]>Liste[j]){
gecici=Liste[j-1];
Liste[j-1]=Liste[j];
Lİste[j]=gecici;
}
}
}
}

Süre : 90 Dakika Başarılar dilerim. Aydın CARUS

You might also like