Professional Documents
Culture Documents
C - Fakepathstruktur Müh 681
C - Fakepathstruktur Müh 681
Giriş
Əsas anlayışlar.
2
Verilənin məntiqi strukturu onun kompüterdən kənardakı modeli və ya
təsviridir. Verilənlərin məntiqi strukturunun müəyyənləşdirilməsi, başqa
sözlə, verilənlərin əlverişli formada təsviri və onların strukturlaşdırılması
verilənlər bazalarının layihələndirilməsinin əsasını təşkil edir.
Verilənin fiziki strukturu informasiyanın kompüterin yaddaşında
yerləşdirilməsinin struktur sxemini təyin edir. Ümumi halda verilənlərin
fiziki və məntiqi strukturları bir-birindən fərqlənə bilər.
«Verilənlər» və «informasiya» məna baxımından bir-birinə çox yaxın
anlayışlardır. Lakin onlar arasındakı fərqi bilmək lazımdır. Verilənlər
üzərində əməliyyat aparılaraq informasiya alınır. İdarəetmə üçün qərarların
qəbul edilməsində əsasən bu üsulla alınan informasiyadan istifadə olunur.
Müxtəlif səviyyəli verilənlər ola bilər. Məsələn, müəssisənin bir ayda
istehsal etdiyi ümumi məhsulun miqdarını göstərən verilənlər ayrı-ayrı
məhsul növlərinə görə aylıq istehsal olunan məhsul miqdarlarının
verilənlərinin cəmindən, yəni həmin verilənlərin aqreqasiyasından alınır.
Aqreqasiyanın müəyyən səviyyəsində alınan verilənlər əhəmiyyət
dərəcəsinə görə informasiya xarakterli ola bilərlər. Beləliklə, müxtəlif
əhəmiyyətlə informasiya almaq üçün verilənləri emal etmək lazımdır. Buna
görə də ,əldə olunmuş hər bir informasiyanın itirilməməsi üçün informasiya
sistemi verilənlər bazasına malik olmalıdır. Aqreqasiya və müqayisənin
aşacı səviyyəsini verilənlər, yuxarı səviyyələrini isə informasiya əhatə edir.
Çox vaxt «verilənlər» və «informasiya» terminləri nisbi olaraq sinonim
kimi işlədilir, yəni onlar arasında göstərilən fərqlər nəzərə alınmır. Bizdə
sonrakı mülahizələrimizdə bu xətti tutacacıq. Bunun səbəbi budur ki,
kompüterdə emal olunan və saxlanan verilənlərin informasiyadaşıyıb-
daşımaması emal prosesi üçün əhəmiyyəti kəsb etmir. Nəticəvi verilənlərin
informasiya yükü isə istifadəçi maracından asılı olaraq qiymətləndirilir.
«Bilik» anlayışıda ifadə etdiyi mənaya görə məlumat, informasiya və
verilənlər anlayışlarına yaxındır. Biliyi digərlərindən ayıran əsas cəhət
onun müəyyən kontekstlə bağlı olması və həmin kontekstdə müəyyən
semantika (məna)daşımasıdır. «Bilik» anlayışından daha çox süni
intellektdə, eləcə də, ekspert sistemlərində geniş istifadə olunur.
Verilənlərin struktur təsnifatı
4
Şəkil 1.1.Əməli yaddaşın təsviri
ƏY aşağıdakı xarakteristikalarla təyin olunur:
Yaddaş tutumu. Minimal informasiya vahidi kimi bit (ingiliscə binary digit
sözündən) qəbul edilmişdir. Bit çox kiçik vahid olducundan, əsas
informasiya vahidi kimi 8 bitə bərabər olan baytdan istifadə olunur.
Kilobayt (Kb), meqabayt (Mb), qiqabayt (Qb) və terabayt (Tb) kimi
vahidlərin baytla ifadəsinə baxaq:
1Kb = 1024 bayt = 210bayt;
1Mb = 1024 Kb = 220bayt;
1Qb = 1024 Mb = 230 bayt;
1Tb = 1024 Qb = 240 bayt.
Bu ölçü vahidlərindən ən çox kompüter yaddaşının tutumunu göstərmək
üçün istifadə olunur.
Yaddaşa müraciət vaxtı.Bu vaxt yaddaşa müraciət əmri alınanda
verilənlərin yazılma və oxunması qurtarana kimi bir periodu təşkil edir.
Yaddaşın işləmə sürətinin göstəricisi bununla bağlıdır.
Müraciətin eni. Müraciət eni maşın sözü ilə təyin olunur. Maşın sözü
xananın enidir.
5
Mühazirə 2
Sadə strukturlar
мяртябяляри
н
0 1 2 нюмряляри 3
1 0 1 ... 0
Növbəti mərtəbələrdə isə tam ədədin ikilik kodu təsvir olunur (16 mərtəbəli
kompüterlərdə 15 mərtəbə, 32 mərtəbəli kompüterlərdə 31 mərtəbə) (şəkil
1.3). KompüterlərdəЯдядин 2-лик bilən
təsvir oluna коду tam ədədlərindiapazonu belə təyin
olunur:
16 mərtəbəli kompüterlərdə: - 32768÷+32767
32 mərtəbəli kompüterlərdə: - 147483648÷+2147483647.
6
Sabit nöqtəli ədədlərdə kəsr hissəni tam hissədən ayıran nöqtənin yeri
kompüter layihə olunarkə birdəfəlik qeyd olunur və məsələlərin həll
prosesindədəyişilmir. Tam ədədlərdəki kimi burada da ədədin işarəsi
mərtəbə şəbəkəsinin soldan 1-ci mərtəbəsində yazılır (mənfi – "1", müsbət
– "0"). Kompüterin quruluşunda mürəkkəbliyi və əməliyyatların icra
vaxtını azaltmaq məqsədilə sabit nöqtəli formada yalnız vahiddən kiçik
ədədlər təsvir olunur, yəni ki, nöqtənin yeri ədədin işarəsindən dərhal sonra
qeyd olunur və nöqtə işarəsi aşkar şəkildə yaddaşda yazılmır. Buna görə
də, sabit nöqtəli ədədlərin təsviri 2-lik say sistemində istifadə olunan tam
ədədlərin təsvirinə uycundur (şəkil 1.3).
Üstünlüklərinə baxmayaraq, sabit nöqtəli ədədlərlə işləyərkən hesablama
prosesi zamanı verilənlərin göstərilən aralıq və son nəticələrinin qəbul
olunmuşdiapazondan kənara çıxmaması tələb olunur. Digər halda mərtəbə
şəbəkəsinindolubdaşması baş verir, bu isə səhv nəticələrin alınmasına
səbəb olur. Bu catışmazlıqlardan azad olmaq üçün ədədlərin sürüşən
nöqtəli formasından istifadə olunur.
Sürüşən nöqtəli formada ədəd belə təsvir olunur:
x=±mq±p ,
burada ədədin mantissası - m ,
say sisteminin əsası –q,
tərtib isə – p ilə işarə edilib.
Istənilən həqiqi ədədi sürüşən nöqtəli formada təsvir etmək olar.
Misal. 18.5 ədədini sürüşən nöqtəli formada təsvir etməli.
18.5=18.5x100=1.85 x101=0.185 x 102
Göründüyü kimi, eyni ədədi müxtəlif cür yazmaq üçün sadəcə mantissada
nöqtənin yerini sürüşdürmək lazımdır. Bu zaman tərtibin qiyməti nöqtənin
yerinə uycun olaraqdəyişir.
Sürüşən nöqtəli ədədin kompüterdə birmənalı təsvirini almaq üçün ədədin
normallaşdırılmış formasından istifadə olunur. Normallaşdırılmış formada
olan ədəddə mantissa bu şərti ödəməlidir:
q-1m<1
Yəni nöqtənin yeri ədədin sıfırdan fərqli rəqəmindən əvvəl qeyd edilir.
Misalda verilən 18.5 ədədinin normallaşdırılmış forması 0.185 x102-dir.
Şəkil 1.4-də kompüterdə sürüşən ədədlərin təsvir sxemi verilib
7
мантиссанын мантисса тяртибин тяртиб
ишаряси ишаряси
A B A or B A xor B
0 0 0 0
0 1 1 1
9
1 0 1 1
1 1 1 0
Mühazirə 3
Xətti statik strukturlar.Əsas anlayışlar
Ardıcıl strukturlu verilənlər
Massiv. Massiv verilənlərin elə bir strukturudur ki, sabit ölçülü, bircins,
nömrələrinə görə nizamlanmış elementlərdən təşkil olunub. Massiv ölçüsü
və identifikatoru (adı) ilə təyin olunur.
Massiv hər bir elementi ayrıca bir vektor olan vektordur. Məsələn,
vektorlardan ibarət vektor- 2 ölçülü massiv, vektorlar vektorlarının vektoru
3 ölçülü massiv və s.
Massivin fiziki və məntiqi strukturu bir – birindən fərqlənir. Məsələn,
ikiölçülü massivin məntiqi strukturu matrisdir. Üçölçülü massivin məntiqi
strukturu isə kubdur.
11
Məntiqi strukturu fiziki struktura çevirmək üçün aşağıdakı düsturdan
istifadə olunur:
A = Ab + ( i – 1 ) n + j
Burada, n - sütunların sayı, i-sütunun , j-isə sətrin nömrəsi, A b –massivin
birinci elementinin yerləşdiyi yerdir.
Massivdə də vektorda olduğu kimi elementlər üzərində əməliyyatlar
və onların qiyməti elementin tipi ilə təyin olunur. Massivin hər bir
elementinə ayrıca müraciət massivin ölçüsündən asılı olaraq bir və ya bir
neçə(sətir və sütun rəqəmi ilə) indeksin köməyi ilə mümkündür. Indeks
kimi sabit vədəyişən sıra tipindən, tam ədədlərdən istifadə etmək olar.
Massivin elementləri isə istənilən tipdə- həm sadədəyişənin ixtiyari tipi,
həmdədəyişənin mürəkkəb tipi (sətir, yazı, massiv və s.) ola bilər.
Məsələlərin həllində adətən birölçülü, ikiölçülü və üçölcülü massivlərdən
istifadə olunur. Praktikada çox nadir hallardadaha böyük ölçülü massivlərə
rast gəlinir.
Yazı. Cədvəl
Yazı müxtəlif tipli elementərin toplusudur, məntiqi baxımdan nəzər
saldıqda hər hansı obyektin elementlərinin xarakteristikaları toplusudur.
Bildiyimiz kimi yazı müəyyən obyekti və ya obyektin elementini
xarakterizə edən müxtəlif tipli elementlər toplusudur.
Massiv, fayl və çoxluq öz tərkibinə bir tipdə elementləridaxil etdiyi halda
yazılar tərkibində ixtiyari sayda müxtəlif tipli verilənləri ( sadədəyişənlər,
çoxluqlar, massivlər və fayllar) birləşdirə bilər. Yazıyadaxil olan bu
verilənlər yazının sahələri adlanır. Yazı tipinin elan edilməsində record və
end açar sözlərindən istifadə olunur. Yazı tipinin ümumi yazılış strukturu
aşacıdakı kimidir:
type
<yazı tipinin identifikatı> =record A1:Q1; A2:Q2; . . . ;An:Qn; end;
Burada Si – yazı sahələrinin adları, Ti – sahələrin tipləridir.
Yazı iyerarxik (pilləvari) struktura malikdir:
12
Şəkil 1.7. Yazının iyerarxik strukturu
16
Stack’lər bir qayda olaraq ya Massivlər(Arrays) yada Əlaqəli
Siyahılar (Linked Lists) üzərində qurulurlar. Bu laboratoriya işi
çərçivəsində həm Massivlər həmdə Əlaqəli Siyahılar vasitəsilə Stack
strukturları inşa edəcək və bu strukturlar üzərində Push(), Pop() və
Top() funksiyalarını icra edəcəyik.
Kodlaşdırmaya keçməzdən əvvəl onuda qeyd edək ki, Stack
strukturlarını massivlərin köməyi ilə qurmaq əslində praktikada o
qədər də təsadüf olunan məsələ deyil. Sonradan kodda da
görəcəyimiz kimi, məsələn 4 elementə sahib bir massivə 5.ci
elementi əlavə etmək lazım gəldikdə bu massivdən iki dəfə böyük
olan başqa bir massiv yaradılır və əvvəlki massivin elementləri yeni
massivə kopyalandıqdan sonra massivə son olaraq yeni element
əlavə olunur. Buradan göründüyü kimi bu üsul RAM-da həddindən
artıq yer tutulmasına, əlavə kopyalanma ilə CPU-nun yorulmasına və
nəticə etibarilə performansı çox zəif olan bir əməliyyatın yerinə
yetirilməsinə səbəb olur. Üstəlik funksional proqramlaşdırma
dillərində (məsələn bizim nümunəmizdəki C dili kimi) Garbage
Collector olmadığından RAM-da istifadəsi mümkün olmayan əvvəlki
massivlərin yaddaşdan boşaldılması lazım gəlir( free() funksiyası ilə)
17
ki, bu da əlavə bir əməliyyat deməkdir. Odur ki, praktik məqsədlər
üçün Massivlər vasitəsilə Stack qurmaq tövsiyyə olunmur.
Yaddaş sahəsinin ölçüsünün yuxarı və aşağı sərhədləri təyin olunur.
Əgər ayrılmış sahədə növbəti elementin struktura daxil edilməsi üçün
boş yer ( slot ) yoxdursa, o zaman bu haqda istifadəçiyə strukturun “
dolub-daşması ” haqqında məlumat verilir.
20
ədədləri Push olunmalı və daha sonra isə Pop() funksiyası işə
düşərək son əlavə olunan elementi Pop etməlidir.
22
Mühazirə 5
Növbə
Adi növbədə
P2≤ P1 ; P2= P1+1
olur.
Dövrəvi növbədə isə aşağıdakı üç hal ola bilər.
P1>P2; P1 =P2 ; P1<P2
Əgər dövrəvi növbə üzərində əməliyyat aparan zaman elementin
növbəyə daxil edilmə əməliyyatlarının sayı elementin növbədən xaric
edilmə əməliyyatlarının sayından çox olarsa, sonun göstəricisinin
əvvəlin göstəricisini ötməsi vəziyyəti baş verə bilər. Bu vəziyyətdə
növbə tam dolduğu halda göstəricilər müqayisə olunur və növbə dolu
olduğu halda boş qeyd olunur.
Dövrəvi növbədə bu iki vəziyyəti -növbənin dolu və ya boş olması
vəziyyətini fərqləndirmək etmək üçün sonun və əvvəlin göstəricisi
arasında boş elementlərdən “aralıq” olmalıdır. Bu “aralıq “ 1 elementə
kimi azaldıqda növbə tamamilə dolmuş olur və növbəyə yeni
elementin daxil edilməsi mümkün olmur. Növbənin təmizlənməsi,
boşalldılması isə hər iki göstəricinin ( başlanğıc olması vacib deyil )
eyni qiymət daşıdığı yazıda uzlaşır. Dövrəvi növbədə ölçünün təyin
edilməsi göstəricilər fərqinin hesablanması ilə aparılır. Növbəti proqram
nümunəsində növbənin təşkil edilməsi və onun üzərindəki əməliyyatlar
təsvir edir:
unit Queue; { Dövrəvi FIFO növbəsi }
Interface
const SIZE=...;{növbənin son həddi }
type data = ...;{ elementlər istənilən tipə aid ola bilərlər}
Procesure QInit;
Procedure Qclr;
24
Function QCreate(a: data) : boolean;
Function QRead(var a: data) : boolean;
Function Qsize : integer;
Implementation {Dövrəvi növbə}
var QueueA : array[1..SIZE] of data; {Növbənin verilənləri}
top, bottom : integer;{ Başlanğıc və son}
Procedure QInit; {**təsvir - başlanğıc=son=1 }
begin top:=1; bottom:=1; end;
Procedure Qclr; {**təmizləmə - başlanğıc=son }
begin top:=bottom; end;
Function QCreate(a : data) : boolean; {**Sonda yazı }
begin
if bottom mod SIZE+1=top then { növbə dolub} QCreate:=false
else begin
Queue[bottom]:=a; bottom:=bottom mod SIZE+1; QCreate:=true;
end; end; { QCreate }
Function QRead(var a: data) : boolean; {** başlanğıcdan seçim }
begin
if top=bottom then QRead:=false else
begin a:=Queue[top]; top:=top mod SIZE + 1; QRead:=true;
end; end; { QRead }
Function QSize : integer; {**ölçünün təyin edilməsi }
begin
if top <= bottom then QSize:=bottom-top
else QSize:=bottom+SIZE-top;
end; { QSize }
END.
Növbədən kompüter resurslarının çatışmazlığı hallarında paralel
yerinə yetirməli olan məsələləri, məsələn idarəetmə üçün istifadə olunur.
Dek
25
Dek(double ended queue) elə ardıcıl siyahıdır ki, elementlərin daxil
və xaric edilməsi siyahının hər iki tərəfindən aparıla bilər. Dekin
strukturunu aşağıdakı kimidir:
Mühazirə 6
Xətti dinamik strukturlar. Siyahı strukturları
Dinamik strukturlarda elementlərin sayı dəyişkən olur.
Elementlər arasındakı əlaqə xətti ardıcıl, xətti əlaqələndirilmiş və
qeyri-xətti əlaqələndirilmiş olur.
Xətti əlaqələndirilmiş dinamik strukturlara aşağıdakılar
aiddir:
1) birəlaqəli siyahı strukturları;
2) ikiəlaqəli siyahı strukturları;
3) Sətr, mətn əlaqəli siyahı strukturları .
Üzərilərində daxil etmə və xaric etmə əməliyyatının
aparılması mümkün olan, dəyişən rəqəmli elementdən təşkil
26
olunan nizamlanmış çoxluq siyahı adlanır. Elementləri arasında
qonşuluq munasibəti təsvir olunan siyahı xətti adlanır. Məntiqi
siyahıya əvvəl ki, bölmədə nəzər saldıq. Ancaq orada söhbət
verilənlərin yarımstatik strukturundan gedirdi və siyahının
ölçüsünə məhdudiyyətlər qoyulurdu. Əgər siyahının
uzunluğuna məhdudiyyət qoyulmursa onda o, yaddaşda
əlaqəli struktur şəklində təsvir ediləcəkdir. Əlaqəli xətti
siyahılar verilənlərin dinamik strukturunun ən sadə təsvir
formasıdır.
Siyahılarda qrafiki əlaqələri oxların köməyi ilə təsvir
etmək daha asandır. Əgər element heç bir başqa elementlə
əlaqəli deyilsə, onda göstəricinin sahəsində heç bir elementi
göstərməyən qiymət yazılır. Belə istinad xüsusi adla - nil
adlanır.
Şəkil 5.1 – də birəlaqəli siyahının strukturu verilmişdir.
INF hissəsi verilənlərin informasiya sahəsinin, NEXT növbəti
elementin göstəricisidir. Hər bir siyahının xüsusi elementi
olmalıdır hansı ki, siyahının başlanğıcının göstəricisi və ya
digər elementlərdən adətən formatına görə fərqlənən siyahının
başlanğıcı olur.Sonuncu elementinin göstərici sahəsində xüsusi
nil göstəricisi var, hansı ki, siyahının sonunu bildirir.
29
Burada işlədilən malloc() (Memory Allocation) funksiyası verilmiş
struktura uyğun olaraq yaddaşda (RAM-da) düyüm üçün yer
ayrılmasını təmin edən C funksiyasıdır. Digər tərəfdən verilənlər
ekrana çıxardılarkən root-dan istifadə olunub. İlk anda root və
iterator eyni düyümü göstərdiyindən root->x yerinə iterator->x də
yaza bilərdik. Bu proqramın yekun nəticəsi aşağıdaki kimidir:
30
Tapşırığın davamı olaraq yaradılan əlaqəli listin sonuna yeni bir
düyüm əlavə edək və listin son halını ekrana çıxaran proqramı tərtib
edək;
Bunun üçün yuxarıda yazdığımız kodda dəyişiklik etməliyik. Əlaqəli
listin sonuna bir düyüm əlavə edəcəyimizdən ilk olaraq listin sonunu
tapmaq lazımdır. Listin sonunu tapmaq üçün bir dövr ifadəsi istifadə
edəcəyik. Əvvəlki iki düyümü manual olaraq yaratdığımıza görə
listin sonunun NULL olmasını da təmin etməliyik. Bu halda kod
aşağıdaki formaya düşür:
31
Nəticədən görüldüyü kimi dövr hər dəfəsində siyahıya yeni bir
element əlavə etmişdir.
32
İndi isə bu funkisyadan istifadə edərək və əvvəlcədən yaratdığımız
və elementləri 10 və 20 dəyərlərini saxlayan listdə 20 elementini
silməyə çalışaq;
33
Gözlədiyimiz nəticə:
İlk olaraq EkranaCixart() funksiyasi hər iki elementi ekrana
çıxartmalı;
Daha sonra sil() funkisyası ilə 20 dəyərinə malik düyüm listdən
silinməli;
Sonda isə Listin son halı yəni geriyə qalan 10 dəyəri ekrana
çıxarılmalıdır.
Proqramı başlatsaq aşağıdaki nəticəni alırıq:
34
Bununlada verilənlərin strukturu mövzusunda Əlaqəli Siyahılar
mövzusunu əhatə etmiş olduq.
40
p.setLinkNext(n);
n.setLinkPrev(p);
size-- ;
return;
}
ptr = ptr.getLinkNext();
}
}
public void display() /* siyahının dolu və ya boş olduğunu
göstərən funksiya */
{
System.out.print("\nDoubly Linked List = ");
if (size == 0)
{
System.out.print("empty\n");
return;
}
if (start.getLinkNext() == null)
{
System.out.println(start.getData() );
return;
}
Node ptr = start;
System.out.print(start.getData()+ " <-> ");
ptr = start.getLinkNext();
while (ptr.getLinkNext() != null)
{
System.out.print(ptr.getData()+ " <-> ");
ptr = ptr.getLinkNext();
}
System.out.print(ptr.getData()+ "\n");
}
////////////////////////////////////////////////////////////////////////////////////////////////////
41
class DoublyLinkedList<T> {
private int n; // siyahıdakı elementlərin sayı
private Node pre; // birinci elementin əvvəlki göstəricisi
private Node post; // sonuncu elementin göstəricisi
public DoublyLinkedList() {
pre = new Node();
post = new Node();
pre.next = post;
post.prev = pre;
}
private class Node { // siyahı elementinin tipi
private T item;
private Node next;
private Node prev;
}
public boolean isEmpty() { return n == 0; }
public int size() { return n; }
public void add(T item) { // asiyahıya elementin daxil edilməsi
Node last = post.prev;
Node x = new Node();
x.item = item;
x.next = post;
x.prev = last;
post.prev = x;
last.next = x;
n++;
}
public ListIterator<T> iterator() { return new
DoublyLinkedListIterator(); }
private class DoublyLinkedListIterator implements
ListIterator<T> {
private Node current = pre.next;
private Node lastAccessed = null;
private int index = 0;
42
private DoublyLinkedListIterator() {
throw new UnsupportedOperationException("Not supported
yet."); }
public boolean hasNext() { return index < n; }
public boolean hasPrevious() { return index > 0; }
public int previousIndex() { return index - 1; }
public int nextIndex() { return index; }
public T next() {
if (!hasNext()) throw new NoSuchElementException();
lastAccessed = current;
T item = current.item;
current = current.next;
index++;
return item;
}
public T previous() {
if (!hasPrevious()) throw new NoSuchElementException();
current = current.prev;
index--;
lastAccessed = current;
return current.item;
}
public void set(T item) {
if (lastAccessed == null) throw new IllegalStateException();
lastAccessed.item = item;
}
public void remove() {
if (lastAccessed == null) throw new IllegalStateException();
Node x = lastAccessed.prev;
Node y = lastAccessed.next;
x.next = y;
y.prev = x;
n--;
if (current == lastAccessed)
43
current = y;
else
index--;
lastAccessed = null;
}
public void add(T item) { // siyahıya elementin daxil
edilməsi
Node x = current.prev;
Node y = new Node();
Node z = current;
y.item = item;
x.next = y;
y.next = z;
z.prev = y;
y.prev = x;
n++;
index++;
lastAccessed = null;
} }
Mühazirə 7
QEYRİ-XƏTTİ DİNAMİKİ STRUKTURLAR
Çoxəlaqəli siyahı strukturları
Bir əlaqəli siyahı həmişə xəttidir. İki əlaqəli siyahı isə xətti
olmaya da bilər. Ümumi halda nəzər salsaq əlaqələndirilmiş
siyahının hər bir elementiləriningöstəriciləri istənilən sayda ola bilər.
Fərqli elementlərdə göstəricilərin sayı fərqli ola bilər. Nəticədə isə
çox əlaqəli siyahı strukturu alınır. Belə strukturda hər element
göstəricilərin sayı qədər bir əlaqəli siyahılara daxil olur. Ədəbiyyatda
çox əlaqəli siyahılara həmçinin multi siyahılar və ya plekslər da
deyilir. Bəzi ədəbiyyatda çox siyahılı assosiyativ strukturlar ifadəsi
işlədilir, belə siyahıların elementlərinə isə assosiyativ qovşaqlar
deyilir.
44
Sadə hal üçün çox əlaqəli siyahıların hər elementində eyni sayda
göstərici qeyd olunur. Amma praktiki olaraq bu göstəricilərdən
çoxları boş olur. Daha yığcam hal üçün elementlərin ölçüsü dəyişən
olur və burada hər bir elementin yalnız qiyməti olan göstəriciləri
yazılır. Bu hala baxsaq- göstərici 2 hissədən ibarət olur: elementin
başlanğıc və göstəricinin nisbi ünvanı.
Siyahının başlanğıc və son göstəriciləri onun aşlığında qeyd
olunur. Yeni elementlər başqa hallar olmadıqca siyahıların sonuna
birləşdirilir. Başlanğıc göstəricidən axtarış aparmaq üçün, son
göstəricidən isə yeni elementin daxil edilməsi üçün istifadə olunur.
46
2. Hər bir element ixtiyari sayda başqa elementlərlə əlaqə
saxlaya bilər.
3. Strukturda hər bir əlaqə yalnız istiqamətə deyil, həm də
çəkiyə malikdir.
Ağacvari strukturlar
48
Bu ağacın ilk şəkildəki ağacdan fərqli cəhəti balanslaşdırılmamış
olması və xüsusi olaraq hər düyümün bir uşağının olmasıdır. Əgər
tərifə fikir versək bu ağacında ikili ağac olaraq qəbul edilməli
olduğunu görərik.
İkili ağacların xüsusi bir halı olan ikili axtarış ağaclarındakı (Binary
Search Tree) düyümlərdə saxlanılan verilənlərin arasında böyükdür-
kiçikdir əlaqəsi olur. Məsələn tam ədədlərdən (integer) ibarət olan
verilənlər saxlanılırsa bu verilənlərin aralarında böyükdür-kiçikdir
əlaqəsi olmalıdır.
49
İkili axtarış ağacları olduqca populyardır və qanunauyğunluq
gözləndiyindən bu ağaclar üzərində əməliyyatlar aparmaq olar. Qeyd
edək ki, hər hansı bir əməliyyat aparıldıqdan sonra ikili axtarış
ağacının strukturu pozulmamış olaraq qalmalıdır.
Ağacın hər bir təpəsi bir açar üçün nəzərdə tutulur. Yəni hər bir təpədə bir
açar saxlanılır. A,B, C, D, E, F – açarlardır.
50
Şəkil 4.4. Ağacın fiziki strukturu
51
Şəkil 4.5. Binar ağac
Göstərilən ağacvari strukturda açarların axtarışı çox vaxt aparır.
Odur ki, səkildə onlardan praktikada istifadə olunmur. Praktikada əsas
etibarilə nizamlanmış və balanslaşmış ağaclardan istifadə olunur.
Nizamlanmış ağaclar
52
Şəkil 4.6. Nizamlanmış ağac
Balanslaşdırılmış ağac
54
B ağaclar
55
Trie ağaclar
Burada verilmiş ağacın axtarışı belə aparılır. 1-ci səviyyədə (baş təpədə) 1-
ci hərfə uyğun mövqe təyin olunur. Həmin mövqedəki göstəricisi 2-ci hərfə
uyğun mövqe təyin olunur. Bu proses açarın sonuncu hərfinə qədər davam
edirilir. Ola bilsin ki, axtarışın açarı ağacda olmasın. Bu halda P y yerinə Ø
işarəsi durur.
57
-əgər ikinci dəfədən sonra baş verirsə - onda bu soldan sağadır,
-əgər üçüncü dəfə baş verirsə - onda bu aşağıdan yuxarıdır.
Altağacın ləğv edilmə əməliyyatı
Bu məqsədlə ləğv olunan altağacın birləşəcəyi qovşağı və bu
altağacın kökünü göstərmək lazımdır.
Altağacın aradan götürülməsi ondan ibarət olur ki, ləğv olunan
altağacla olan əlaqə qırılır, yəni, ləğv olunan qovşaq-köklə əlaqəli
olan element göstəricisi “nil” vəziyyətinə quraşdırılır. Həmin
qovşağın çıxış dərəcəsi bir vahid kiçildilir.
Altağacın araya salınma əməliyyatı
Bu halda araya salınan altağacın kökünün göstəricisini və altağacın
asılı olacağı qovşağı bilmək lazımdır.
Bu qovşağın göstəricisini altağac kökünə quraşdırmaq, həmin
qovşağın çıxış dərəcəsini isə bir vahid artırmaq lazımdır.
Bu zaman, ümumi halda, altağacın asıldığı qovşaq oğullarını yenidən
nömrələmək lazım olacaqdır.
Binar axtarış ağacının yaradılması
Fərz edək ki, aşağıdakı açarlara malik olan elementlər verilmişdir:
14, 18, 6, 21, 1, 13, 15.
Bu açarlar üzrə nizamlanmış binar ağacı quraq.
Yaradılma alqoritmi belə olacaqdır:
read (key, rec)
tree = maketree (key, rec)
while not eof do
p = tree
q = tree
read (key, rec)
v = maketree (key, rec)
while p <> nil do
q = p
if key < k(p) then
p = left(p)
else
p = right(p)
58
endif
endwhile
if key < k(q) then
left(q) = v
else
right(q) = v
endif
endwhile
return
59
Şək.Ağaclardan yan keçməyin növləri
60
3. print info (tree)
4. intrave (right (tree))
5.endif
6.return
Mühazirə 8
61
FAYL STRUKTURLARI
62
Mövcud proqramlaşdırmadillərinin hamısında fayllarla işləmək üçün
lazımlı elementlər nəzərə alınmışdır. Proqramlaşdırmadilində faylın yalnız
bir təsvirindən istifadə olunur. O, faylın həm fiziki , həmdə məntiqi
səviyyədə təsvirini əvəz edir. Verilənlərin istifadəçi səviyyəsində yəni
xarici təsviri, lazımi yazıların seçilməsi və verilənlərin həmin yazılardan
götürülməsi üçündilin uycun operatorları vasitəsilə aparılır.
Ayrı fayllarla işləyərkən istər-istəməz aşacıdakı çatışmazlıqlarla rastlaşmaq
olar:
-bir çox ümumi əlamətlərə malik olan oxşar obyektləri xarakterizə edən
müxtəlif təyinatlı fayllarda verilənlərin dəfələrlə təkrarlanması baş verir və
bunun qarşısını almaq mümkündeyil. Faylın həcmi (yazıların sayı) böyük
olduqda təkrarlanan verilənlərin sayı artır, bu isə öz növbəsində yaddaş
sərfini artırır;
-faylın hər üç səviyyədə (xarici, məntiqi və fiziki) təsviri proqramda
aparıldıgından, həm məntiqi səviyyədə faylda aparılandəyişikliklər, həmdə
fiziki səviyyədə aparılandəyişikliklər proqramda uycundəyişikliklər
edilməsinə səbəb olur. Yəni verilənlərlə proqram arasında asılılıq yaranır:
1-ci halda-məntiqi asılılıq, 2-ci halda-fiziki asılılıq;
- verilənlər mərkəzləşdirilməmiş şəkildə, yəni hər bir fayl ayrıca idarə
olunur. Faylla işləmək üçün ən azı 3 proqram olmalıdır: 1) faylı yaradan və
ona yeni yazı əlavə edən proqram; 2) fayldadəyişikliklər edən proqram; 3)
lazımi yazıları tapıb emal edən proqram. Əslində bu proqramlar kiçik
həcmli olur və əsas proqramın tərkib hissələri (prosedurlar) kimi tərtib
olunurlar. Həmin proqramların sayı əsas proqramda faylların sayına
mütənasib olaraq artır;
-verilənlərdə ziddiyyətliliyin mümkünlüyü. Verilənlərin təkrarlanmasına
yol verildiyindən, müxtəlif fayllarda eyni verilənlər arasında uycunsuzluq
yarana bilər. Bu, o vaxt baş verir ki, müəyyən faylda
verilənlərdəyişdirilir,digər faylda isə hansı səbəbdənsə həmin
verilənlərdəyişdirilmir;
-verilənlərin mühafizəsinin lazımi səviyyədə təmin olunmaması və
verilənlərə icazəsiz müraciətin qarşısının alınmasında çətinliklərin olması;
-verilənlərin tamlıcının qorunmaması. Kompüterdə və sistemdə qəzalar baş
verdikdə və ya proqram xətaları yarandıqda verilənlərin itkisiz bərpa
olunması vacib şərtlərdən biri hesab olunur. Xüsusi tədbirlər görülmədikdə
buna nail olmaq çətin olur.
Maqnit disk yaddaşının (MDY)strukturu:
63
Maqnit disk yaddaşı ünvanlaşdırıla bilən başqa sözlə desək, birbaşa
müraciətli yaddaşdır. Fərdi kompüterlərdə 2 tip MDY-dan istifadə olunur:
1) Floppy disk (dəyişdirilə bilən) və ya disket (FD);
2) Hard(Sərt dik) disk (HD).
Yaddaş qurğusuna isə FDD, HDD deyilir. Burada D=draver.
Maqnit diskdə ünvanlar 3 komponentdən ibarətdir:
1) Tərəfin nömrəsi (TN);
2) Cığırın (silindrin) nömrəsi (SN);
3) Sektorun nömrəsi (SeN)
Məntiqi disk disket, ya da HD-nin bir bölməsidir. Disketin adı A və ya B
ilə işarələnib. HD C,D,E,F kimi qəbul olunur.
Y1 Y2 Y3 ..........
- Tərəf səviyyəsi:
- Sektorun indeksi:
67
Bu halda yazı ünvanları aşağıdakı düsturla hesablanır:
Ak = Ab +(k+1)*l
Bu üsuldan ardicil təşkil üsulu ilə yaradılmış yazılar daşıyıcıda
yerləşdirildiyi halda istifadə olunur.
1) İndeks üsulu- İndeks cədvəlindən açarın ünvana çevrilməsi üçün
istifadə olunur. İndeks 2 sütundan ibarət olan cədvəldir. İlk sütunda açar,
növbəti sütunda ünvan yerləşdirilir.
Axtarış üçün verilmiş açar indeks faylından tapılır sonra isə uyğun
ünvana əsasən yazı seçilir. Sadə halda cədvəldə axtarış ardıcıl aparılır.
Bu üsullardan əlavə rondonlaşdırma adı ilə məlum olan bir neçə üsul
da mövcuddur.
Randomlaşdırma üsulları.
Randomlaşdırma üsulları nəticəsində açar hər hansı təsadüfi bir ədədə
çevrilir və bu ədəddən ünvan kimi istifadə olunur.
Randomlaşdırmanın aşağıdakı üsulları mövcuddur:
1) Say sisteminin əsasının dəyişdirilməsi;
2) Qalıqla bölmə-verilmiş açarın bütün açarların ümumi sayına yaxın
olan sadə ədədə nisbəti tapılır. Əməldən alınan qalıq ədədi açarlar üçün
ünvan kimi istifadə edilir;
Bükmə (sıxlaşdırma-hərf tipli açarlarda da istifadə ounur)-verilmiş açar bir
neçə hissəyə bölünür. Bu hissələrin rəqəm kodları üzərində əməliyyat
aparılır. Nəticədən ünvan kimi istifadə edilir.Nümunəyə baxaq-
Fərz edək ki, verilmiş açar simvol tiplidir:
Abbasov_Abbas_Abbas_oğlu_ _ _ _
68
3) Açarda təkrarlanan hərflər və ya rəqəmlər silinir.
69
Muhazirə 9
Verilənlər bazası
Verilənlər bazası və modellər
Iyerarxik model
73
Belə modelli VBIS-lərin sayı çoxdeyil. Onlara misal olaraq PC/Focus,
Team-Up,data Edge, IMS və
onun əsasında yaradılmış OKA sistemlərini göstərmək olar.
Şəbəkə modeli
Relyasiya modeli
77
dekart hasilinin hər biri n sayda elementdən ibarət olan
d=(d1,d2,…,dn), di∈Di,i-1,2,…n
nizamlanmış kortejlər çoxluğudur. Dekart hasili ilkin
çoxluqların (domenlərin) elementlərinin mümkün olan
bütün kombinasiyalarını almağa imkan verir.
D1,D2,…Dn çoxluğunda təyin edilmiş Rn nisbəti
D=D1xD2x…xDn dekart hasilinin altçoxluğudur:
Rn⊆ D
n ədədi nisbətin dərəcəsini və ya arlığını təyin edir. n=1
olduqda nisbət unar, n=2 olduqda-binar, n=3 olduqda-
ternar adlanır. Rn nisbətini təşkil edən müxtəlif kortejlərin
d=(d1,d2,…,dn) sayına həmin nisbətin kardinal ədədi
deyilir. Nisbətdə eyni kortejlər ola bilməz.
Misal 1.
D1=A, B, D2=C, D, D3=E, F domenlərinin
dekart hasilinin:
D=D1xD2xD3=(A,C,E), (A,C,F), (A,D,E), (A,D,F),
(B,C,E), (B,C,F),
(B,D,E), (B,D,F)
78
R1=(A, C,E), (A,C,F)
R2=(A, D,E)
R3=(B, C,E), (B,C,F), (B,D,E, (B,D,F)
R4=⌀
altçoxluqları nisbətlərdir.
Ümumi halda kortejlərin nisbətdə yerləşmə
ardıcıllığının əhəmiyyəti yoxdur. Lakin emal edilmənin
rahatlığı üçün kortejlər müəyyən atributun qiymətlərinə
görə nizamlanır. Həmin atributun qiymətlərinin artma və
ya azalma ardıcıllıçına görə relasiya modelli VBIS
kortejləri nizamlayır. Əgər istifadəçi nizamlanma
atributunu təyin etmirsə, sistem avtomatik olaraq
kortejlərə, onların xronoloji (VB-yə daxil edilmə)
ardıcıllığına uyğun nömrələr qoyur.
Şəkil 3.10- da IŞÇI nisbətinin təsviri verilmişdir.
Formal olaraq nisbətdə atributların yerlərinin
dəyişdirilməsi yeni nisbətə gətirib çıxarmalıdır. Lakin
relasiya verilənlər bazasında atributların yerlərinin
dəyişdirilməsi yeni nisbət yaratmır.
79
Nisbətin adı (R) və onun atributlarının siyahısı (A1,
A2, . . ., An,) birlikdə nisbətin sxemi adlanır:
R(A1, A2, . . ., An)
84
- cədvəldə sətirlər ixtiyari ardıcıllıqla yerləşdirilə
bilərlər.
Verilənlər cədvəli adətən xarici yaddaşda əməliyyat
sisteminin ayrıca faylında saxlanır. Odur ki, onun adına
məhdudluqlar qoyula bilər. Sahələrin adları cədvəlin
içərisində saxlanır. Onların tərtibatı VBIS tərəfindən
aparılır. Sahələrin adlarına və istifadə edilən əlifbaya
məhdudluq qoyulmur.
Əgər nisbət açara malikdirsə, ona uyğun cədvəlin də
açarı olmalıdır. Bu cür cədvələ açarlı və ya açar sahəli
cədvəl deyilir.
VBIS-lərin çoxunda cədvəlin faylı idarəetmə
hissəsindən (sahələrin adlarının, tiplərinin təsviri və s.) və
yazıların yerləşdikləri sahədən ibarət olur.
Postrelyasiya modeli
b) SELECT
SN, SOYAD, AD, VƏZIFƏ, UŞAQ, YAŞI
FROM
IŞÇI-VƏ- UŞAQLAR;
Cədvəldə sahələrin sayının və uzunlucunundəyişdirilməsinə tələb
qoyulmur. Bu odeməkdir ki, cədvəlin və verilənlərin strukturu yüksək
çevikliyə malik olur.
Burada verilənlərin tamlıcı və ziddiyyətsizliyi probleminin həlli qarşıya
çıxır. Buna səbəb postrelyasiya modelinin normallaşdırılmamış
cədvəlləridəstəkləməsidir. Kliyent-server sistemlərində saxlanan
prosedurlara oxşar mexanizmləri VBIS-ədaxil etməklə bu problemi həll
etmək olur . Verilənlərə müraciətdən əvvəl və ya sonra cədvəlin
sahələrindəki qiymətlərə nəzarət edən funksiyaların təsviri üçün avtomatik
çacrılan korrelyasiya və konversiya prosedurlarını qurmaca imkan var.
Korrelyasiya prosedurları verilənlər oxunandandərhal sonra yəni,
verilənlərin emalından əvvəl, konversiya prosedurları isə verilənlərin
emalından sonra həyata keçirilir.
Postrelyasiya modelinin üstünlüyü əlaqəli relyasiya cədvəllərini bir
postrelyasiya cədvəli ilə təsvir etmək imkanının olmasıdır. Bununla
informasiyanın təsvirinin yüksək əyaniliyi təmin edilir və onun emalının
səmərəliliyi artır. Modelin çatışmazlıcı isə saxlanan verilənlərin
ziddiyyətsizliyinin və tamlıcının təmininin mürəkkəbliyindən ibarətdir.
86
Postrelyasiya modelinidəstəkləyən VBIS-lərə misal olaraqdasdb, Bubba və
UniVers sistemlərini göstərmək olar .
Çoxölçülü model
а)
87
Cəlvəl 6.1. Zavod üzrə məhsul istehsalı
Məhsulun markası Il Miqdarı (min ton)
AI-83 2003 19
AI-83 2004 25
AI-83 2005 27
AI-93 2003 32
AI-93 2004 35
AI-93 2005 36
AI-95 2004 15
AI-95 2005 16
b)
Məhsulun markası 2003 2004 2005
AI-83 20 25 28
AI-93 30 35 37
AI-95 Nul 15 17
Şəkil 6.3. Verilənlərin relyasiya (a ) və çoxölçülü (b) təsviri
88
Əgər iki ölçüdən daha artıq çoxölçülü modeldən söhbət gedirsə,
informasiyanın vizual olaraq çoxölçülü obyektlər formasında (üç,dörd
vədaha böyük ölçülü hiperkublarla) təsviri vacibdeyil. Belə hallarda
istifadəçiyə yalnız ikiölçülü qrafiklər və ya cədvəllərlə işləməkdaha
əlverişlidir. Bu zaman verilənləri müxtəlifdetallaşdırmadərəcəsi ilə
hazırlanan «kəsiklər»lə təsvir etmək olar.
Verilənlərin çoxölçülü modellərinin əsas anlayışlarına baxaq.
Ölçü (Dimension)-hiperkubun bir üzünü təşkil edən eyni tipli verilənlər
çoxlucudur. Ən çox istifadə edilən zamanla əlaqəli ölçülərinə misal olaraq
Günləri, Ayları, Kvartalları və Illəri göstərmək olar. Cocrafi ölçülər kimi
Rayonlar, Şəhərlər, Ölkələr, Ərazilər geniş tətbiq olunur. Çoxölçülü
modeldə ölçü hiperkubun xanalarındakı konkret qiymətləri təyin edən
indeks rolunu oynayırlar.
Obyektyönümlü model
Mühazirə 10
Əsas alqoritmlər
Alqoritmlər nəzəriyyəsi
Alqoritm — verilmiş məsələni həll etmək üçün ilkin verilənlərlə
icra olunan hesabi və məntiqi əməliyyatların sonlu sayda
ardıcıllığıdır.
Latınca qayda-qanun deməkdir.
Alqoritm 783 - 850-ci illərdə Xarəzmdə (indiki Özbəkistanda
şəhər) yaşamış IX əsrin məşhur fars riyaziyyatçısı Məhəmməd İbn
Musa əl-Xarəzminin (yəni Xarəzmli Musa oğlu Məhəmmədin)
adının latın hərflərilə olan "alqoritmi" yazılışıyla bağlıdır.
Əl-Xarəzminin yazdığı traktatın XII əsrdə latın dilinə tərcümə
olunması sayəsində avropalılar mövqeli say sistemi ilə tanış olmuş,
onluq say sistemini və onun hesab qaydalarını alqoritm
adlandırmışlar.
Ümumiyyətlə, alqoritm-verilmiş məsələnin həlli üçün lazım olan
əməliyyatları müəyyən edən və onların hansı ardıcıllıqla yerinə
yetirilməsini göstərən formal yazılışdır. Hesablama maşınlarının
əsas fərqləndirici xüsusiyyətlərindən biri də onun proqramla idarə
olunmasıdır. Yəni, istər sadə, istərsə də mürəkkəb məsələni
maşının həll etməsi üçün proqram tərtib edilməlidir.
Alqoritmik problemlərdə ümumiliyi pozmadan həmişə
arqumentləri mənfi, olmayan tam qiymətlər alan funksiyanın mənfi
olmayan tam qiymətlərinin tapılmasından söhbət gedir. Ümumiliyi
pozmadan bunu həmişə qəbul etmək olar. Qiyməti müəyyən
alqoritm vasitəsilə tapılan funksiyalara hesablanan funksiyalar
deyilir. Bu tərif intuitivdir. Dəqiq riyazi deyil. Çünki burada
alqoritm anlayışından istifadə olunur. Arqumentlərinin heç də
hamısında təyin olunmayan funksiyalar, yəni arqumentlərinin
müəyyən hissəsində təyin olunmuş funksiyalara qismən funksiyalar
deyilir. Qiyməti hər hansı alqoritmin tətbiqi ilə tapıla bilən qismən
funksiyalara hesablanan qismən funksiyalar deyilir. Bu vaxta qədər
məlum bütün hesablanan qismən funksiyalar məlum olmuşdur ki,
92
qismən rekursiv funksiyalardır. Rekursiv funksiyaların isə ciddi
riyazi tərifi var. Bundan sonra biz funksiya dedikdə ilkin verilənlər
üzərində müəyyən əməllər ardıcıllığı, yığımı başa düşəcəyik.
Deməli, bizə məlum olan alqoritmin hər birinə biz müəyyən
funksiya kimi baxa bilərik. Klini belə bir tezisi irəli sürmüşdür ki,
alqoritmik hesablanan qismən funksiyalar sinfi ilə qismən rekursiv
funksiyalar sinfi üst-üstə düşür. Qeyd edək ki, hesablanan qismən
funksiyaların tərifi intuitiv olduğu halda qismən rekursiv
funksiyaların tərifi dəqiq riyazi şəkildə verilir. Klinidən bir qədər
əvvəl Çerç belə bir tezis vermişdir ki, hər yerdə təyin olunmuş
hesablanan qismən funksiyalar sinfi ilə qismən rekursiv funksiyalar
sinfi eynidir. Bu iki tezis birləşdirilib Klini-Çerç tezisi adı ilə
verilir. Tezisin əhəmiyyəti ondan ibarətdir ki, hər hansı problemi
əks etdirən funksiyaların rekursiv funksiyalar tərifini ödədiyini
bilsək onun həll alqoritminin olduğu birbaşa aydındır. Lakin o,
problemi əks etdirən funksiya rekursiv funksiya tərifini
ödəmədikdə deyirik ki, Klini-Çerç tezisinə görə həmin məsələnin
həll alqoritmi yoxdur. Beləliklə, rekursiv funksiya anlayışını
verməliyik. Onun tərifini və xassələrini göstərməklə, alqoritmin
tərifini dəqiqləşdirmək olar. Alqoritmin tərifini dəqiqiləşdirmək
üçün yuxarıdakı birinci yanaşmadır.
Əsas Alqoritmlər
Axtarış və Sıralama Alqoritmləri
Ədədlər Nəzəriyyəsi
Sadə Ədədlər üçün alqoritmlər
Qraflar
ƏBOB-ƏKOB hesablanması
Dinamik Proqramlaşdırma
Ağac, Stek, Növbə, siyahı və s.
94
Bu üsul çeşidləmənin ən sadə üsulu hesab olunur. Bu üsulda
yazıların içərisində açarın qiyməti ən kiçik olanı tapılır. Həmin yazı
tapılandan sonra o cədvəlin 1-ci yazısının yeri ilə dəyişdirilir ( hamin
yazı 1-ci yazının yerinə, 1- ci yazı isə həmin yazının yerinə köçürülür
). Sonra 2-ci elementdən başlayaraq açarının qiyməti ən kiçik olan
yazı tapılır və cədvəldə 2-ci yazının yerinə köçürülür. Bu proses
bütün yazıların nizamlanması başa çatanadək davam etdirilir.
n-1
MS= (n-i)= ½ n(n-1)
95
i=1
3. Müqayisə və yerdəyişmə
j=1,2,.....,n-j üçün aşağıdakıları yerinə yetirməli.
Əgər Kj+1<Kj, onda AL:=1
L:=Rj Rj:=Rj+1 Rj+1:=L
96
4. Yerdəyişmə əlamətinin yoxlanması.
Əgər AL=0 olarsa alqoritmi bitirməli.
1/2n(n-1)-ə bərabərdir.
MS=(1+2+….N)2=N/4 olur.
Mühazirə 11
Düz seçim üsulu ilə çeşidləmə
DAXİLİ VƏ XARİCİ ÇEŞİDLƏMƏ
100
Şək.63.Ünvanlar cədvəlinin çeşidləmə üsulu
Şək.66.Şell çeşidləməsi
108
üçün 1000 elementlərdən ibarət olan massiv kifayət edər. Bu massiv
0-dan 999 daxil olmaqla tam ədədlə indeksləşdirilir.
Detallar barəsində yazılar
Qeyd edək ki, ədədlər kimi bir-birinə yaxın olan iki açarlar (4618396
və 4618996 kimi), ədədlər kimi bir-birindən əhəmiyyətli dərəcədə
fərqlənən (0000991 və 9846995 kimi) iki açardan fərqli olaraq,
həmin cədvəldə bir - birindən uzaqda yerləşə bilərlər (şək.68). Bu
ondan irəli gəlir ki, yazının mövqeini təyin etmək üçün açarın yalnız
axırıncı 3 rəqəmlərindən istifadə edirlər.
Xeşləmə - bu, bir böyük çoxluğun kiçiyə doğru və ya “çoxlu
qiymətlərin bir qiymətə” endirilmə üsuludur .
Çevirmə funksiyasının seçilməsi.
Açarı cədvəldəki müəyyən bir indeksə transformasiya edən funksiya
xeş-funksiya adlanır.
Bizim halda h(key) = key mod 1000;
Xeş-cədvəl – bu, xeş-funksiya tərəfindən verilən qeyri-adi
ünvanlaşdırılmalı adi massivdir.
Xeş-cədvəlin yaradılmasının baxdığımız üsulu bir mənfi cəhətə
malikdir.
Tutaq ki, elə bir k1 və k2 kimi iki açar mövcuddur ki, orada
h(k1)=h(k2) olur. K1 açarlı yazı cədvələ daxil edildikdə, o, h(k1)
mövqeinə salınır. Amma k2 açarı xeşləndikdə, alınmış mövqe k1
açarlı yazının saxlandığı həmin mövqe olacaqdır. Aydındır ki, iki
yazı eyni bir mövqeni məşğul edə bilməzlər. Bu cür vəziyyət
xeşləmə zamanı kolliziya və ya toqquşma adlanır.
Qeyd etmək lazımdır ki, yaxşı xeş funksiya elə bir funksiya olmalıdır
ki, o kolliziyaları minimum etmiş olsun və bütün cədvəl üzrə yazıları
bir bərabərdə paylamış olsun.
Mükəmməl xeş-funksiya – bu kolliziyaları yaratmayan funksiyadır.
Xeşləmə zamanı kolliziyaları iki üsulla aradan qaldırmaq olar:
-Açıq ünvanlaşdırma üsulu ilə;
-Zəncir üsulu ilə.
109
Açarların çevrilməsi ilə əlaqədar olan əsas çətinlik ondan ibarət olur
ki, mümkün ola bilən qiymətlər çoxluğu yaddaş ünvanla-rının
buraxıla bilən çoxluqlarından (massivin indekslərindən) əhəmiyyətli
dərəcədə geniş olur. Misal kimi 16 - ya qədər hərfdən ibarət olan və
minlərlərlə heyətin içərisindən ayrı-ayrı fərdiləri identifikasiya edən
açarlardan ibarət adları götürək. Bu halda biz 216 açarlar
mümkünlükləri ilə işləməli olmalıyıq ki, bunu da 10 3 indekslər
mümkünlükləri ilə əks etdirmək lazım gələcəkdir. Buna görə də,
funksiyası “çoxlu qiymətlər bir qiymətdə” sinifli funksiya kimi
olacaqdır. Əgər hər hansı bir k açarı verilmişsə, o zaman axtarış
əməliyyatının birinci addımı – onunla əlaqəli olan h = H(k)
indeksinin hesablanması, ikinci addım isə (tamamilə vacibdir) -
doğrudanmı h-ın T massivində k açarlı elementi identifikasiya
etməsinin yoxlanılması olacaqdır.
Axtarışın təşkil olunduğu yazı müəyyən bir cədvəldə saxlanılır.
Tələb olunan yazını tapmamışdan əvvəl müəyyəm sayda açarlara
baxış keçirtməyi təşkil etmək lazımdır.
Mühazirə 15
Xeşləmə alqoritmləri. Xeşləmə zamanı kolliziyaların aradan qaldırılma üsulları
110
Əgər h(key) massivinin xanası digər açarın yazısı ilə artıq məşğul
olarsa, o zaman “rh” funksiyası həmin yazının yerləşdirilə biləcəyi
digər xananı tapmaq üçün h(key) qiymətinə tətbiq olunur. Əgər
rh(h(key) xanası da məşğul olarsa, o zaman xeşləmə bir də yerinə
yetirilir və rh(rh(h(key) xanası yoxlanılır və i.a.
Açıq ünvanlaşdırma üsulunun alqoritmi
Function h(key) – xeş-funksiya
h = key mod n
return
Function rh(i) - təkrar xeşləmə funksiyası
rh = i+1 mod n
return
Procedure insert(key) – açarın xeş-cədvələ salınma proseduru
i = h(key) {açarı xeşləyirik}
while ((k(i)< >key) and (k(i)< > nullkey )) do
i = rh(i) { təkrarən xeşləmə}
if k(i) = nullkey then {açarı boş mövqeyə salırıq}
k(i) = key
endwhile
return
Subroutine heshtable – xeş-cədvəlin yaradılma funksiyası
while not eof do
read key
insert(key)
endwhile
return
112
Zəncirlər üsulu ilə xeşləmədə kolliziyaların aradan qaldırılması
Bu üsul ondan ibarət olur ki, açarları eyni bir qiymətlə xeşləndirilən
bütün yazılardan əlaqəli siyahılar təşkil olunurlar.
Tutaq ki, xeş-funksiya 0-dan (n-1)-ə qədər olan diapazonda
qiymətləri çıxışa verir. Bu zaman n ölçülü və başlıqlar
qovşaqlarından ibarət olan müəyyən bir “bucket” massivi təsvir
olunur. Bucket (i) elementi açarları i-də xeşlənən bütün yazıların
siyahısını göstərir. Yazının axtarışında qovşaqlar massivində i
mövqeini tutan siyahı başlığına müraciət həyata keçirilir. Əgər yazı
tapılmamışsa, o zaman onu siyahının sonuna salırlar.
Fərz edək ki, 10 elementlərdən ibarət olan massiv vardır və xeş-
funksiya (key mod 10)-a bərabərdir. Açarlr açağıdakı ardıcıllıqda
yerləşmişlər:
75 66 42 192 91 40 49 87 67 16 417 130 372 227
Uyğun bir əlaqəli siyahılı başlıqlar qovşaqlarının massivi aşağıda
verilmişdir (şək69).
Zəncirlər üsulunun həyata keçirilmə alqoritmi
i = h(key)
q = nil
р = bucket (i)
while p < >nil do
if k(p) = key
then search = p
return
endif
q=p
p = nxt(p)
endwhile
{açar tapılmamışdır, yeni yazını araya salırıq}
s = getnode
k(s) = key
nxt(s) = nil
if q = nil
113
then bucket (i) = s
else nxt(q) = s
endif
search = s
return