Sunteți pe pagina 1din 515

ALGORITMI S¸I STRUCTURI DE DATE

Note de curs

(uz intern - draft v2.2)

Prefat¸˘a

Cˆand dorim s˘a reprezent˘am obiectele din lumea real˘a ˆıntr-un program pe calculator, trebuie s˘a avem ˆın vedere:

modelarea obiectelor din lumea real˘a sub forma unor entit˘at¸i matematice abstracte ¸si tipuri de date,

operat¸iile pentru ˆınregistrarea, accesul ¸si utilizarea acestor entit˘at¸i,

reprezentarea acestor entit˘at¸i ˆın memoria calculatorului, ¸si

algoritmii pentru efectuarea acestor operat¸ii.

Primele dou˘a elemente sunt ˆın esent¸˘a de natur˘a matematic˘a ¸si se refer˘a l a ”ce” structuri de date ¸si operat¸ii trebuie s˘a folosim, iar ultimile dou˘a elemente implic˘a faza de implementare ¸si se refer˘a la ”cum” s˘a realiz˘am structuril e de date ¸si operat¸iile. Algoritmica ¸si structurile de date nu pot fi separate. De¸si algoritmica ¸si programarea pot fi separate, noi nu vom face acest lucru, ci vom implementa algoritmii ˆıntr-un limbaj de programare (Pascal, C/C++, Java). Din aceast˘a cauz˘a acest curs este ¸si o init¸iere ˆın algoritmic˘a ¸si programare. Scopul cursului este subordonat scopului specializ˘arii (informatic˘a, ˆın cazul nostru) care este s˘a preg˘ateasc˘a speciali¸sti competent¸i , cu ˆınalt˘a calificare ˆın domeniul informaticii, cadre didactice competente ˆın acest domeniu (profesor de informatic˘a ˆın gimnaziu ¸si liceu), informaticieni ˆın diverse domenii cu profil tehnic, economic, etc. ce pot ˆıncepe lucrul imediat dup˘a absolvirea facult˘at¸ii.Dezideratul final este deci competent¸a . Competent¸a ˆıntr-un domeniu de activitate implic˘a experient¸˘a ˆın rezolvarea problemelor din acel domeniu de activitate. Atˆat competent¸a cˆat ¸si experient¸a ˆın rezolvarea problemelor se pot obt¸ine numai dac˘a permanent se ˆıntreprind eforturi pentru ˆınsu¸sirea de noi cuno¸stint¸e. De exemplu, orice informatician (programator sau profesor) care elaboreaz˘a programe pentru rezolvarea unor probleme diverse, trebuie s˘a aib˘a competent¸e conform schemei 1 :

PROBLEMA (model fizic) ALGORITMICA PROGRAMARE (model virtual) Gandire algoritmica Experienta (rezolvarea de
PROBLEMA
(model fizic)
ALGORITMICA
PROGRAMARE
(model virtual)
Gandire algoritmica
Experienta
(rezolvarea de probleme)

Cursul de Algoritmi ¸si structuri de date este util (¸si chiar necesar) pentru formarea competent¸elor ¸si abilit˘at¸ilor unui bun programator sau profesor de informatic˘a. Pentru a vedea care sunt aceste competent¸e ¸si abilit˘at¸i putem , de

ˆ

1 M. Vlada; E-Learning ¸si Software educat¸ional; Conferint¸a Nat¸ional˘a de Inv˘at¸˘amˆant Virtual,

Bucure¸sti, 2003

exemplu, s˘a citim Programa pentru informatic˘a - Concursul nat¸ional unic pentru

ocuparea posturilor didactice declarate vacante ˆın ˆınv˘at¸˘amˆantul preuniversitar. 2

ˆ

Intr-un fel, primul semestru al cursului Algoritmi ¸si structuri de date este echivalent cu ceea ce se pred˘a la informatic˘a ˆın clasa a IX-a iar al doilea semest ru cu clasa a X-a (specializarea: matematic˘a-informatic˘a, intensiv informatic˘a). Diferent¸a este dat˘a ˆın primul rˆand de dificultatea problemelor abordate de c˘atre noi ˆın cadrul acestui curs. Din aceast˘a cauz˘a vom avea ˆın vedere ¸si ce prevede Pograma ¸solar˘a pentru clasa a IX-a, Profil real, Specializarea: Matematic˘a-informatic˘a, intensiv informatic˘a. De asemenea, merit˘a s˘a vedem ce p˘areri au cei care au terminat de curˆand o facultate cu un profil de informatic˘a ¸si care au un ˆınceput de carier˘a reu¸sit. Vom ˆınt¸elege de ce acest curs este orientat pe rezolvarea de probleme. Alegerea limbajului Java pentru prezentarea implement˘arilor algoritmilor a fost f˘acut˘a din cˆateva considerente. Java verific˘a validitatea indicilor tablourilor (programele nu se pot termina printr-o violare de memorie sau eroare de sistem). Java realizeaz˘a gestiunea automat˘a a memoriei (recupereaz˘a automat memoria care nu mai este necesar˘a programului) ceea ce simplific˘a scrierea programelor ¸si permite programatorului s˘a se concentreze asupra esent¸ei algoritmului. Exist˘a documentat¸ie pe internet. Compilatorul de Java este gratuit. Un program scris ˆın Java poate fi executat pe orice calculator (indiferent de arhitectur˘a sau sistem de operare). Student¸ii nu sunt obligat¸i s˘a realizeze implement˘arile algoritmilor ˆın Java; ei pot folosi Pascal sau C/C++. Algoritmii prezentat¸i ˆın curs sunt descri¸si ˆın limbaj natural sau ˆın limbaj algoritmic iar implement˘arile sunt ˆın limbajul de programare Java. Java este un limbaj orientat-obiect, dar noi vom utiliza foarte put¸in aceast˘a particularitate. Sunt prezentate toate elementele limbajului de programare Java necesare pentru acest curs dar ecesta nu este un curs de programare ˆın Java. Cuno¸stint¸ele minimale acceptate la sfˆar¸situl cursului rezult˘a din Legea nr. 288 din 24 iunie 2004 privind organizarea studiilor universitare ¸si, de exemplu, din Ghidul calit˘at¸ii ˆın ˆınv˘at¸˘amˆantul superior 3 . Aici se precizeaz˘a faptul c˘a diploma de licent¸˘a se acord˘a unui absolvent al programului de studii care: demonstreaz˘a acumulare de cuno¸stint¸e ¸si capacitatea de a ˆınt¸elege aspecte din domeniul de studii ˆın care s-a format, poate folosi atˆat cuno¸stint¸ele acumulate precum ¸si capacitatea lui de ˆınt¸elegere a fenomenelor printr-o abordare profesional˘a ˆın domeniul de activitate, a acumulat competent¸e necesare demonstr˘arii , argument˘arii ¸si rezolv˘arii problemelor din domeniul de studii considerat, ¸si-a dezvoltat deprinderi de ˆınv˘at¸are necesare procesului de educat¸ie continu˘a.

2 Aprobat˘a prin O.M:Ed.C. nr.5287/15.11.2004 3 Editura Universit˘at¸ii din Bucure¸sti, 2004; Capitolul 4, Calitatea programelor de studii uni- versitare, Prof.univ.dr. Gabriela M. Atanasiu - Universitatea Tehni c˘a ”Gh.Asachi” din Ia¸si

Cuprins

1 Not¸iuni fundamentale

 

1

1.1 Programe ciudate .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

1

1.1.1 Un program ciudat ˆın Pascal

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

1

1.1.2 Un program ciudat ˆın C++

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.1.3 Un program ciudat ˆın Java

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3

1.1.4 Structura unui program Java

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.2 Conversii ale datelor numerice

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.2.1 Conversia din baza 10 ˆın baza 2

 

5

1.2.2 Conversia din baza 2 ˆın baza 10

6

1.2.3 Conversii ˆıntre bazele 2 ¸si 2 r

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

2 Structuri de date

 

7

2.1 Date ¸si structuri de date .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

2.1.1 Date .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

2.1.2 Structuri de date

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

9

2.2 Structuri ¸si tipuri de date abstracte

 

10

2.2.1 Structuri de date abstracte

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

10

2.2.2 Tipuri de date abstracte .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

10

2.3 Structuri de date elementare

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

11

2.3.1 Liste .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

11

2.3.2 Stive ¸si cozi

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

12

2.3.3 Grafuri

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

13

2.3.4 Arbori binari

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

14

2.3.5 Heap-uri .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

2.3.6 Structuri de mult¸imi disjuncte

 

16

3 Algoritmi

17

3.1 Etape ˆın rezolvarea problemelor

 

17

3.2 Algoritmi

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

3.2.1 Ce este un algoritm?

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

3.2.2 Propriet˘at¸ile algoritmilor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

3.2.3 Tipuri de prelucr˘ari

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

v

 

3.3 Descrierea algoritmilor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

3.3.1 Limbaj natural

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

21

3.3.2 Scheme logice .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

3.3.3 Pseudocod

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

3.4 Limbaj algoritmic .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

3.4.1 Declararea datelor

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

3.4.2 Operat¸ii de intrare/ie¸sire

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

3.4.3 Prelucr˘ari liniare

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

24

3.4.4 Prelucr˘ari alternative

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

24

3.4.5 Prelucr˘ari repetitive

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

25

3.4.6 Subalgoritm .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

26

3.4.7 Probleme rezolvate .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

27

3.4.8 Probleme propuse

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

30

3.5 Instruct¸iuni corespondente limbajului algoritmic

 

32

3.5.1 Declararea datelor

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

32

3.5.2 Operat¸ii de intrare/ie¸sire

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

34

3.5.3 Prelucr˘ari liniare

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

35

3.5.4 Prelucr˘ari alternative

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

35

3.5.5 Prelucr˘ari repetitive

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

35

3.5.6 Subprograme

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

36

3.5.7 Probleme rezolvate .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

3.5.8 Probleme propuse

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

52

4

Analiza complexit˘at¸ii algoritmilor

 

55

4.1 Scopul analizei complexit˘at¸ii .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

4.1.1 Complexitatea spat¸iu

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

57

4.1.2 Complexitatea timp

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

57

4.2 Notat¸ia asimptotic˘a

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

58

4.2.1 Definire ¸si propriet˘at¸i

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

58

4.2.2 Clase de complexitate

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

60

4.2.3 Cazul mediu ¸si cazul cel mai defavorabil

 

61

4.2.4 Analiza asimptotic˘a a structurilor fundamentale

 

62

4.3 Exemple

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

62

4.3.1 Calcularea maximului

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

62

4.3.2 Sortarea prin select¸ia maximului

 

62

4.3.3 Sortarea prin insert¸ie

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

63

4.3.4 Sortarea rapid˘a (quicksort)

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

64

4.3.5 Problema celebrit˘at¸ii .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

66

4.4 Probleme

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

67

4.4.1 Probleme rezolvate .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

67

4.4.2 Probleme propuse

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

69

5 Recursivitate

71

5.1 Funct¸ii recursive

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

71

5.1.1 Funct¸ii numerice

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

71

5.1.2 Funct¸ia lui Ackerman

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

74

5.1.3 Recursii imbricate

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

74

5.2 Proceduri recursive .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

75

6 Analiza algoritmilor recursivi

 

77

6.1 Relat¸ii de recurent¸˘a

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

77

6.1.1 Ecuat¸ia caracteristic˘a

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

78

6.1.2 Solut¸ia general˘a

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

78

6.2 Ecuat¸ii recurente neomogene

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

80

6.2.1 O form˘a simpl˘a .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

80

6.2.2 O form˘a mai general˘a

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

81

6.2.3 Teorema master

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

82

6.2.4 Transformarea recurent¸elor

 

84

6.3 Probleme rezolvate

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

87

7 Algoritmi elementari

93

7.1 Operat¸ii cu numere .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

93

7.1.1 Minim ¸si maxim

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

93

7.1.2 Divizori

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

94

7.1.3 Numere prime

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

7.2 Algoritmul lui Euclid .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

7.2.1 Algoritmul clasic

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.