1. Page 1 of 4
ლაბორატორიული მეცადინება 8
განსახილველი საკითხები:
ამოცანა /ჯაჭვებიანი ჰეშ-ცხრილის შექმნა და გასინჯვა/
ჯაჭვებიანი ჰეშ-ცხრილის კლასი >>>
პროგრამა-დრაივერი >>>
სავარჯიშოები >>>
ამოცანა: შევქმნათ ჯაჭვებიანი ჰეშ-ცხრილის კლასი, რომელსაც ექნება ელემენტის ჩამატების,
წაშლის, და ამ ცხრილში მოცემული ელემენტის მოძებნის ფუნქციები.
მთავარ ფუნქციაში:
შევქმნათ ამ კლასის ობიექტი მთელი რიცხვების შესანახად, რომელიც ელემენტების
ჩასამატებლად გამოიყენებს გაყოფის ჰეშ-ფუნქციას. ჩავწეროთ მასში 77 და შემდეგ
მიმდევრობით გასაღებები 0,1,...,24. დავბეჭდოთ ცხრილი და დავბეჭდოთ მისი ზომა.
შევქმნათ ამ კლასის ობიექტი მთელი რიცხვების შესანახად, რომელიც ელემენტების
ჩასამატებლად გამოიყენებს გაყოფის ჰეშ-ფუნქციას. ჩავწეროთ მასში 77 და შემდეგ
მიმდევრობით გასაღებები 0,1,...,44. დავბეჭდოთ ცხრილი, მოვძებნოთ ცხრილში
ელემენტები 777 და 21. დავბეჭდოთ ცხრილის ზომა. წავშალოთ 21.
დინამიკურად შევქმნათ ამ კლასის ობიექტი მთელი რიცხვების შესანახად, რომელიც
ელემენტების ჩასამატებლად გამოიყენებს გაყოფის ჰეშ-ფუნქციას. მიმდევრობით
ჩავამატოთ გასაღებები 0,1,...,14. დავბეჭდოთ ცხრილი და შემდეგ წავშალოთ.
ამოხსნა:
<<< ჯაჭვებიანი ჰეშ-ცხრილის კლასი
ამჯერად ჩვენ არ ვქმნით ტემპლიტიან კლასს, მაგრამ ადვილი გადასაკეთებელი რომ იყოს,
კლასს არ გავყოფთ ორ ფაილად (ტემპლიტიანი კლასის გაყოფა არ შეიძლება ორ ფაილად).
ასე რომ, გვაქვს მხოლოდ ერთი header ფაილი:
#pragma once
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
class ChainedHashTable
{
private:
list<int>* hTable;
int (*fPtr)(int, int);
int size;
int capacity;
public:
ChainedHashTable(void);
~ChainedHashTable(void);
ChainedHashTable(int m, int hashFunc(int, int));
void insert(int item);
int getSize(void);
3. Page 3 of 4
size--;
}
შევნიშნოთ, რომ ეს არაა სრულყოფილი კლასი, რადგან მხოლოდ მთელი რიცხვების შენახვის
საშუალებაა გათვალისწინებული. აგრეთვე, არაა გადატვირთული გამოტანის ოპერატორი,
მინიჭების ოპერატორი და ასლის გამკეთებელი კოსტრუქტორი (როდესაც მეხსიერების
დინამიკური გამოყოფა ხდება, ამათი, კონსტრუქტორის და დესტრუქტორის არსებობა
აუცილებელია).
აქ არის იგივე საინტერესო მომენტები, რაც შეგვხვდა წინა მეცადინეობაზე. კერძოდ, კლასის
ერთი კერძო ველი გათვალისწინებულია ფუნქციის დასამახსოვრებლად.
არის განსხვავებული მომენტი: ჩვენ გამოვიყენეთ მრავალგანზომილებიანი (შერერული)
კონტეინერი.
<<< პროგრამა დრაივერი:
#include "ChainedHashTable.h"
int hashByMod(int key, int M)
{
return key % M;
}
int hashByMultiply(int key, int M)
{
const double A=(sqrt(5.0)-1)/2;
return int(M*(A*key-floor(A*key)));
}
int main()
{
ChainedHashTable hash(11,hashByMod);
hash.insert(77);
for(int i=0; i<25; i++)
hash.insert( i );
cout << "Hash table "hash":" << endl;
hash.show();
cout << "hash.size()=" <<hash.getSize() <<endl<<endl;
int k = 21;
list<int>::iterator it;
list<int>* lstP;
lstP = hash.search(k,it);
if(it != lstP->end())
cout << "Found k =" << *it << endl;
else
cout << k << " Not found!" << endl;
k = 777;
lstP = hash.search(k,it);
if(it != lstP->end())
cout << "In hash found k =" << *it << endl;
else
cout << k << " Not found!" << endl << endl;