5
ალგორითმებისა და მონაცემთა სტრუქტურების , მონაცემთა სტრუქტურების საკონტროლოს ერთ-ერთი ბილეთის ამოხსნა 14 Jun CountingSort – ის ალგორითმი void CountingSort (vector <int> & a , vector <int> & b ) { k = *max_element (a.begin() , a.end () ); k++; vector <int > c (k); for (int i=0 ; i < a.size (); i++ )

Sakontrolo amoxsnit monacemta struqturebi

Embed Size (px)

Citation preview

Page 1: Sakontrolo amoxsnit monacemta struqturebi

ალგორითმებისა და მონაცემთა სტრუქტურების , მონაცემთა სტრუქტურების

საკონტროლოს ერთ-ერთი ბილეთის ამოხსნა

14 Jun

CountingSort – ის ალგორითმი

void CountingSort (vector <int> & a , vector <int> & b )

{

k = *max_element (a.begin() , a.end () );

k++;

vector <int > c (k);

for (int i=0 ; i < a.size (); i++ )

Page 2: Sakontrolo amoxsnit monacemta struqturebi

c[a[i]]++;

for (int i=1; i < k ; i++ )

c[i] += c[i-1];

for (int i=a.size() – 1 ; i >=0; i– )

{

b[c[a[i]]-1] = a[i] ;

c[a[i]]–;

}

}

ოპერაციების რაოდენობა :

პირველ for ციკლის ოპერაციების მაქსიმალური რაოდენობა არის O(n) სადაც n არის a

ვექტორის ელემენტების რაოდენობა , მეორე for ციკლისა იქნება O(k-1) ხოლო მესამე for

ციკლისთვის ეს იქნება O(n) საბოლოო ჯამში იქნება O(k+n) ;

ალგორითმი კორექტულად მუშაობს არაუარყოფითი მთელი რიცხვების შემთხვევაში .

მეორე for -ის შემდეგ c[6] არ იარსებებს რადგან k არის 6 და ციკლი ტრიალებს 6-მდე ანუ

5-ის ჩათვლით , მეორე for გვიჩვენებს i(რაიმე კონკრეტულ მნიშვნელობაზე)-ზე

ნაკლები ან ტოლი ელემენტების რაოდენობას .

ღია მისამართებიანი ჰეშ- ცხრილის კლასის

მაგალითი

class OAHT {

private :

Page 3: Sakontrolo amoxsnit monacemta struqturebi

vector <int> * hTable ;

int capacity;

int size ;

int (*fPtr)(int , int);

public :

OAHT () ;

~OAHT ();

OAHT (int k , int hashFunc (int , int ));

int search (int k );

int get_capacity () ;

int get_size ();

void erase (int k );

int insert (int k);

};

void OAHT :: erase (int k )

{

int j=search (int k );

if ( j != capacity )

{

(*hTable)[j] = -1;

size –;

}

}

int OAHT :: search (int k)

Page 4: Sakontrolo amoxsnit monacemta struqturebi

{

int i=0;

while (1)

{

int j= ((*fPtr)(k,capacity)+i )% capacity;

if ( ( *hTable)[j] == k )

return j;

if ( ( *hTable)[j] == 0 || j == capacity )

{

cout<<”Hash Table Overflow ! “<<endl;

return capacity;

}

i++;

}

int HashByMultiply (int k, int m)

{

const int A= (sqrt(5)-1) /2;

return (int)(m*(k*A – floor(a*k)));

}

int main ()

{

OAHT ht (29,HashByMultiply);

—————————–

return 0;

Page 5: Sakontrolo amoxsnit monacemta struqturebi

}

მე-3 საკითხი

H(k,i) = (h1(k) + ih2(k))%capacity;

m = 9;

როცა k = 23 და i=0 ; insert (23) იმუშავებს j=H(23,0) =(5+0*(23%8))%9 = 5 ესეიგი T[5] = 23

როცა k=41 და i=0 ; insert (41) იმუშავებს j=H(41,0) =(5+0*(41%8))%9 = 5 ესეიგი i

გაიზრდება ,

insert (41) იმუშავებს j=H(41,1) =(5+1*(23%8))%9 =13%9 =4 ესეიგი T[4] = 41

როცა k = 50 და i=0 ; insert (50) იმუშავებს j=H(50,0) =(1+0*(50%8))%9 = 5 ესეიგი i

გაიზრდება ,

insert (50) იმუშავებს j=H(50,1) =(5+1*(50%8))%9 =7%9 =7 ესეიგი T[7] = 50