Cuprins

Prefata

1. Preliminarii
  1.1 Ce este un algoritm?
  1.2 Eficienta algoritmilor
  1.3 Cazul mediu si cazul cel mai nefavorabil
  1.4 Operatie elementara
  1.5 De ce avem nevoie de algoritmi eficienti?
  1.6 Exemple
    1.6.1 Sortare
    1.6.2 Calculul determinantilor
    1.6.3 Cel mai mare divizor comun
    1.6.4 Numerele lui Fibonacci
  1.7 Exercitii

2. Programare orientata pe obiect
  2.1 Conceptul de obiect
  2.2 Limbajul C++
    2.2.1 Diferentele dintre limbajele C si C++
    2.2.2 Intrari/iesiri in limbajul C++
  2.3 Clase in limbajul C++
    2.3.1 Tipul intErval in limbajul C
    2.3.2 Tipul intErval in limbajul C++
  2.4 Exercitii

3. Structuri elementare de date
  3.1 Liste
    3.1.1 Stive
    3.1.2 Cozi
  3.2 Grafuri
  3.3 Arbori cu radacina
  3.4 Heap-uri
  3.5 Structuri de multimi disjuncte
  3.6 Exercitii

4. Tipuri abstracte de date
  4.1 Tablouri
    4.1.1 Alocarea dinamica a memoriei
    4.1.2 Clasa tablou
    4.1.3 Clasa parametrica tablou<T>
  4.2 Stive, cozi, heap-uri
    4.2.1 Clasele stiva<T> si coada<T>
    4.2.2 Clasa heap<T>
  4.3 Clasa lista<E>
  4.4 Exercitii

5. Analiza eficientei algoritmilor
  5.1 Notatia asimptotica
    5.1.1 O notatie pentru “ordinul lui”
    5.1.2 Notatia asimptotica conditionata
  5.2 Tehnici de analiza a algoritmilor
    5.2.1 Sortarea prin selectie
    5.2.2 Sortarea prin insertie
    5.2.3 Heapsort
    5.2.4 Turnurile din Hanoi
  5.3 Analiza algoritmilor recursivi
    5.3.1 Metoda iteratiei
    5.3.2 Inductia constructiva
    5.3.3 Recurente liniare omogene
    5.3.4 Recurente liniare neomogene
    5.3.5 Schimbarea variabilei
  5.4 Exercitii

6. Algoritmi greedy
  6.1 Tehnica greedy
  6.2 Minimizarea timpului mediu de asteptare
  6.3 Interclasarea optima a sirurilor ordonate
  6.4 Implementarea arborilor de interclasare
  6.5 Coduri Huffman
  6.6 Arbori partiali de cost minim
    6.6.1 Algoritmul lui Kruskal
    6.6.2 Algoritmul lui Prim
  6.7 Implementarea algoritmului lui Kruskal
  6.8 Cele mai scurte drumuri care pleaca din acelasi punct
  6.9 Implementarea algoritmului lui Dijkstra
  6.10 Euristica greedy
    6.10.1 Colorarea unui graf
    6.10.2 Problema comis-voiajorului
  6.11 Exercitii

7. Algoritmi divide et impera
  7.1 Tehnica divide et impera
  7.2 Cautarea binara
  7.3 Mergesort (sortarea prin interclasare)
  7.4 Mergesort in clasele tablou<T> si lista<E>
    7.4.1 O solutie neinspirata
    7.4.2 Tablouri sortabile si liste sortabile
  7.5 Quicksort (sortarea rapida)
  7.6 Selectia unui element dintr-un tablou
  7.7 O problema de criptologie
  7.8 Inmultirea matricilor
  7.9 Inmultirea numerelor intregi mari
  7.10 Exercitii

8. Algoritmi de programare dinamica
  8.1 Trei principii fundamentale ale programarii dinamice
  8.2 O competitie
  8.3 Inmultirea inlantuita a matricilor
  8.4 Tablouri multidimensionale
  8.5 Determinarea celor mai scurte drumuri intr-un graf
  8.6 Arbori binari optimi de cautare
  8.7 Arborii binari de cautare ca tip de data
    8.7.1 Arborele optim
    8.7.2 Cautarea in arbore
    8.7.3 Modificarea arborelui
  8.8 Programarea dinamica comparata cu tehnica greedy
  8.9 Exercitii

9. Explorari in grafuri
  9.1 Parcurgerea arborilor
  9.2 Operatii de parcurgere in clasa arbore<E>
  9.3 Parcurgerea grafurilor in adancime
    9.3.1 Puncte de articulare
    9.3.2 Sortarea topologica
  9.4 Parcurgerea grafurilor in latime
  9.5 Salvarea si restaurarea arborilor binari de cautare
  9.6 Backtracking
  9.7 Grafuri si jocuri
    9.7.1 Jocul nim
    9.7.2 Sahul si tehnica minimax
  9.8 Grafuri AND/OR
  9.9 Exercitii

10. Derivare publica, functii virtuale
  10.1 Ciurul lui Eratostene
  10.2 Tablouri initializate virtual
    10.2.1 Structura
    10.2.2 Implementarea (o varianta de nota sase)
    10.2.3 tablouVI<T> ca subtip al tipului tablou<T>
  10.3 Exercitii

Epilog

Bibliografie