Documente Academic
Documente Profesional
Documente Cultură
Nr. de
puncte
Să se creeze un fişier textual care conţine cel puţin 50 de înregistrări, cel puţin 5 cîmpuri
şi are cel puţin 2 tipuri de date, iar cîmpul cheie trebuie să fie unic şi neordonat.
Să fie implementat şi dezvoltat programul prezentat în suportul de curs „Structuri de
date (în baza C++)”, autor dr.conf. Pereteatcu Sergiu
Să se implementeze cîteva metode de căutare în tabele şi să se efectueze căutarea după
cîmpul cheie din fişierul textual şi pentru fiecare metodă de efectuat următoarele:
- Să se analizeze lungimea medie teoretică şi lungimea practică de căutare.
- De descris algoritmul metodei de căutare pe paşi.
1 Metoda secvenţială de căutare
2 Metoda de căutarea în tabele neordonate structurate arborescent
2 Metoda binară de căutare
2 Metoda Fibonacci de căutare
2 Metoda de căutare în tabele ordonate
1 Un referat la tema „Metode de căutare”, prezentat în faţa colegilor
Descrtiere metode:
Metoda secvenţială de căutare
Cautarea secvenţială este unul dintre cei mai simpli algoritmi studiaţi. El urmăreşte să verifice
apartenenţa unui element la un şir de elemente de aceeaşi natură, în spetă a unui număr la un şir
de numere. Pentru aceasta se parcurge şirul de la un capăt la celălalt şi se compară numărul de
căutat cu fiecare număr din şir. În cazul în care s-a găsit corespondenţă (egalitate), un indicator
flag este poziţionat. La sfârşitul parcurgerii şirului, indicatorul ne va arăta dacă numărul căutat
aparţine sau nu şirului.
Metoda binară de căutare
Algoritmul de căutare binară oferă performanţe mai bune decât algoritmul de că utare secvenţială.
El funcţionează astfel: se compară numărul de căutat cu elementul aflat la mijlocul şirului (element
care se mai numeşte şi pivot). În cazul în care cele două elemente coincid căutarea s-a încheiat cu
succes. Dacă numărul de căutat este mai mare decât pivotul, se continua căutarea în aceeaşi
manieră în subşirul delimitat de pivot şi capătul şirului iniţial. Dacă numărul de căutat este mai
mic decât pivotul se continua căutarea în aceeaşi manieră
în subşirul delimitat de pivot şi începutul şirului iniţial.
Algoritmul prezentat se încadrează în clasa algoritmilor elaboraţi conform tehnicii de programare
Divide et Impera.
Unul din dezavantajele acestui algoritm este că şirul în care se face căutarea trebuie săfie iniţial
sortat.
Metoda de căutarea în tabele neordonate structurate arborescent
Căutarea unei valori este foarte asemănătoare cu operația adunare. Algoritmul de căutare
traversează copacul "în profunzime", alegând in mod adecvat parcurgerea, ca urmare a proprietăți
de căutare arborescente secompară valoarea fiecărui nod vizitat cu unul, căutăm. Algoritmul se
oprește în două cazuri:
-un nod cu o valoare necesară este găsit;
- algoritmul nu are nici o modalitate de a merge.
Algoritmul de căutare în detaliu:
class elem {
public:
virtual int fscanf_el(FILE * f) = 0;
virtual int show(const char * opening, const char * ending) = 0;
virtual int free() = 0;
class MobiasBanca {
public:
int id;
char prenume[20];
char nume[20];
char functia[20];
char oras[20];
long tel;
int st;
int dr;
MobiasBanca() {
id = 0;
strcpy(prenume, "");
strcpy(nume, "");
strcpy(functia, "");
strcpy(oras, "");
tel = 0;
st = -1;
dr = -1;
}
void setId(int i) {
id = i;
}
void setPrenume(char* n) {
strcpy(prenume, n);
}
void setNume(char* a) {
strcpy(nume, a);
}
void setFunctia(char* b) {
strcpy(functia, b);
}
void setOras(char* d) {
strcpy(oras, d);
}
void setTel(long j) {
tel = j;
}
int getId() {
return id;
}
int set_st(int new_st) {
st = new_st;
return st;
}
int get_st() {
return st;
}
int get_dr() {
return dr;
}
char* getPrenume() {
return prenume;
}
char* getNume() {
return nume;
}
int getTel() {
return tel;
}
char* getFunctia() {
return functia;
}
char* getOras() {
return oras;
}
int fscanf_el(FILE * f) {
return fscanf(f, "%i %s %s %s %s %li", &id, prenume, nume, functia, oras, &tel);
}
tabel() {
n = 0;
}
tabel(char * file);
void search(int c);
void searchbin(int c);
int fib_search(el initial);
int searchtree(MobiasBanca tmp);
void createtree();
void killtree();
void sort();
protected:
template
<class el>
tabel<el>::tabel(char * file) {
FILE *pf;
pf = fopen(file, "rt");
n = 0;
while (!feof(pf))
if (t[n].fscanf_el(pf) > 0)
n++;
fclose(pf);
}
template
<class el>
void tabel<el>::search(int c) {
int position = -1, a, j;
template
<class el>
int tabel<el>::fib_search(el initial) {
int position = -1, contor = 0, i = 0, q = 0, p = 0;
double durata;
int fib[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765};
for (int j = 0;; j++) {
if (i > n) {
i = fib[j - 2];
p = fib[j - 3];
q = fib[j - 4];
break;
} else i = fib[j];
}
while (2 < 3) {
contor++;
if (initial == t[i]) {
position = i;
break;
}
if (initial < t[i]) {
if (q == 0) break;
else {
int v = p;
i = i - q;
p = q;
q = v - q;
}
}
if (initial > t[i]) {
if (p == 1) break;
else {
i = i + q;
p = p - q;
q = q - p;
}
}
}
if (position == -1) {
cout << endl;
cout << "Error!Error!" << endl;
} else {
cout << endl;
t[position].show();
cout << endl << "Lungimea practica de cautare:" << " " << contor << endl;
float caut;
caut = log(n) / log(2);
cout << "Lungimea teoretica de cautare:" << " " << caut << endl;
}
return position;
}
template
<class el>
void tabel<el>::show(const char *opening, const char *ending) {
cout << opening;
for (int i = 0; i < n; i++) {
t[i].show();
if (i % 20 == 0 && i != 0) {
cout << "\n" << "Tasteaza pentru a vedea tot...";
cin.get();
system("clr");
}
cout << ending;
cout << "\n ";
}
}
template
<class el>
void tabel<el>::sort() {
int j, count = 0;
el aux;
for (int i = 0; i < n - 1; i++)
for (j = i; j < n; j++) {
if (t[i].getId() > t[j].getId()) {
aux = t[i];
t[i] = t[j];
t[j] = aux;
count++;
}
}
cout << "Sortare finisata!" << endl;
cin.get();
;
}
template
<class el>
void tabel<el>::searchbin(int c) {
if (!n) {
cout << "ERROR! Introduceti datele";
cin.get();
;
return;
}
int s = 0, f = n - 1, count = 1, j;
int m = (s + f) / 2;
template
<class el>
void tabel<el>::createtree() {
for (int i = 1; i < n; i++) {
int forw = 1, j = 0;
while (forw) {
if (t[i] < t[j]) {
if (t[j].get_st() == -1) {
t[j].set_st(i);
forw = 0;
} else
j = t[j].get_st();
} else
if (t[i] > t[j]) {
if (t[j].get_dr() == -1) {
t[j].set_dr(i);
forw = 0;
}
j = t[j].get_dr();
}
}
}
}
template
<class el>
void tabel<el>::killtree() {
for (int i = 0; i < n; i++) {
t[i].set_st(-1);
t[i].set_dr(-1);
}
}
template
<class el>
int tabel<el>::searchtree(MobiasBanca tmp) {
int i = 0, count = 0, forw = 1;
while (forw) {
if (tmp == t[i]) {
t[i].show();
cout << t[i].st << " " << t[i].dr << endl;
cout << "Lungimea practica de cautare:" << count << endl;
cout << "Lungimea teoretica MAX de cautare:" << n / 2 << endl;
cout << "Lungimea teoretica MIN de cautare:" << log(n) / log(2.0)*2.0;
forw = 0;
} else {
if (tmp < t[i])
i = t[i].get_st();
else
i = t[i].get_dr();
if (i == -1) {
forw = 0;
cout << "Elementul nu a fost gasit" << endl;
}
}
count++;
}
return 0;
}
int main() {
system("clr");
MobiasBanca pl, tmp;
tabel <MobiasBanca> gr("D:\\oleg.txt");
char ch, c;
int iden;
do {
system("clr");
cout << "Menu:" << endl;
cout << "*****************************************" << endl;
cout << "0)Avisare tabel" << endl;
cout << "1)Metoda secventiala" << endl;
cout << "2)Metoda arborescenta" << endl;
cout << "3)Sortare tabel" << endl;
cout << "4)Metoda binara" << endl;
cout << "5)Metoda fibonacci" << endl;
cout << "6)End" << endl;
c = cin.get();
;
switch (c) {
case '0':
ch = 'n';
while (ch != 'y') {
system("clr");
gr.show("Continutul tabelului:\n", " ");
cout << endl << "Atit?(Y/N)";
ch = cin.get();
;
}
break;
case '1':
ch = 'n';
while (ch != 'y') {
system("clr");
cout << "Introduceti id de cautare:" << endl;
cin>>iden;
cout << endl;
gr.search(iden);
cout << endl;
cout << endl << "Atit?(Y/N)";
ch = cin.get();
;
}
break;
case '2':
ch = 'n';
while (ch != 'y') {
system("clr");
cout << "Introduceti id de cautare:" << endl;
cin>>iden;
cout << endl;
tmp.setId(iden);
gr.createtree();
gr.searchtree(tmp);
cout << endl;
cout << endl << "Atit?(Y/N)";
gr.killtree();
ch = cin.get();
;
}
break;
case '3':
system("clr");
gr.sort();
cin.get();
;
break;
case '4':
ch = 'n';
while (ch != 'y') {
system("clr");
cout << "Introduceti id de cautare:" << endl;
cin>>iden;
cout << endl;
gr.searchbin(iden);
cout << endl;
cout << endl << "Atit?(Y/N)";
ch = cin.get();
;
}
break;
case '5':
ch = 'n';
while (ch != 'y') {
system("clr");
cout << "Introduceti id de cautare:" << endl;
cin >> pl.id;
cout << endl;
if (gr.fib_search(pl) == -1) cout << endl << "Eroare! Parcurgeti sortarea!" << endl;
cin.ignore();
cout << endl;
cout << endl << "Atit?(Y/N)";
ch = cin.get();
;
}
break;
}
} while (c != '6');
return 0;
}
Rezultatul:
Căutarea Secventiala
Metoda arborescenta
Căutarea Binară
Căutarea Fibonacci
Concluzie: