Escolar Documentos
Profissional Documentos
Cultura Documentos
Dorel Lucanu
Faculty of Computer Science
Alexandru Ioan Cuza University, Iasi, Romania
dlucanu@info.uaic.ro
PA 2014/2015
Limbajul Algoritmic
PA 2014/2015
1 / 57
Outline
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
2 / 57
Introducere
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
3 / 57
Introducere
Ce este un algoritm
Nu exista o definitie standard pentru notiunea de algorithm.
Cambridge Dictionary:
A set of mathematical instructions that must be followed in a fixed order, and that,
especially if given to a computer, will help to calculate an answer to a mathematical
problem.
Limbajul Algoritmic
PA 2014/2015
4 / 57
Introducere
Ce este un algoritm?
Wikipedia:
In mathematics and computer science, an algorithm is a step-by-step procedure for
calculations. Algorithms are used for calculation, data processing, and automated
reasoning.
An algorithm is an effective method expressed as a finite list of well-defined instructions
for calculating a function. Starting from an initial state and initial input (perhaps
empty), the instructions describe a computation that, when executed, proceeds through
a finite number of well-defined successive states, eventually producing output and
terminating at a final ending state. The transition from one state to the next is not
necessarily deterministic; some algorithms, known as randomized algorithms, incorporate
random input.
Limbajul Algoritmic
PA 2014/2015
5 / 57
Introducere
Limbajul Algoritmic
PA 2014/2015
6 / 57
Introducere
semiformal
pseudo-cod: combina notatia formala a limbajelor de prgramare cu
limbajul natural
notatie grafica: scheme logice, automate (state machines), diagrame
de activitati
Limbajul Algoritmic
PA 2014/2015
7 / 57
Introducere
De ce nevoie de formalizare?
Limbajul Algoritmic
PA 2014/2015
8 / 57
Introducere
De ce nevoie de formalizare?
Limbajul Algoritmic
PA 2014/2015
9 / 57
Introducere
Limbajul Algoritmic
PA 2014/2015
10 / 57
Introducere
Teza Church-Turing
Turing a afirmat (Teza lui Turing) ca orice functie a carei valoare poate fi
obtinuta printr-o metoda efectiva (?), poate fi calculta de o masina Turing.
Forma cea mai accesibila formulata de Turing:
LCMs [logical computing machines: Turings expression for Turing machines] can
do anything that could be described as rule of thumb or purely mechanical.
(Turing 1948)
Teza lui Church:
A function of positive integers is effectively calculable only if recursive.
Modelul de calcul al functiilor recursive a fost definit de de Godel si Herbrand
(1932-1934) si este echivalent cu lambda-calculul (Kleene, Church, 1936).
Kleene (1967) este cel care a introdus termenul de Teza Church-Turing:
So Turings and Churchs theses are equivalent. We shall usually refer to them
both as Churchs thesis, or in connection with that one of its . . . versions which
deals with Turing machines as the Church-Turing thesis.
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
11 / 57
Introducere
Nivelul de formalizare
Care este cel mai potrivit limbaj formal de prezentare a algoritmilor?
masinile Turing, lambda-calculul, functiile recursive au avantajul ca
sunt usor de definit matematic, dar sunt greu de utilizat n practica
limbajele de programare sunt usor de utilizat n practica dar dificil de
manevrat n demonstratii datorita detaliilor de implementare
cel mai simplu limbaj de programare echivalent cu masinile Turing:
modelul de memorie: multime de variabile ce pot lua valori ntregi
instructiuni: goto conditionala si neconditionala, incrementarea si
decrementarea variabilelor
este cunoscut sub numele de counting machines
o variant structurata (modelul programelor while):
modelul de memorie: multime de variabile ce pot lua valori ntregi
instructiuni: atribuirea, if, while, si compunerea secventiala
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
12 / 57
Limbajul Alk
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
13 / 57
Limbajul Alk
Motivatie
Scopul nostru este de a avea un limbaj care este
destul de simplu pentru a fi nteles
suficient de expresiv pentru a descrie toti algoritmii prezentati
abstract: descrierea algoritmului face abstractie de detaliile de
implementare (specifice unui limbaj de programare real), avantajand
astfel focalizarea pe gandirea algoritmica
sa ofere un model de calcul riguros definit si potrivit pentru analiza
algoritmilor (corectitudine si eficienta)
executabil: algoritmii pot testati si executiile lor analizate cu diverse
mijloace (executie pas cu pas, executie simbolica, etc)
intrarile si iesirile sunt reprezentate abstract, ca obiecte matematice.
astfel ncat detaliile de implementare sunt omise total
Un candidat care satisface aceste cerinte este Alk (limbaj specific acestui
curs).
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
14 / 57
Limbajul Alk
Modelul de memorie
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
15 / 57
Limbajul Alk
Modelul de memorie
Modelul de memorie
memoria este data de o multime de variabile
variabilele nu sunt altceva decat locatii de memorie care stocheaza
valori si care sunt accesta prin nume simbolice n loc de adrese
astfel o varibila este o pereche:
notatie matematica nume-variabila 7 valoare
valoare
notatie grafica
nume-variabila
o valoare va fi un obiect al unui tip de date abstract
exemple de tipuri de valori:
scalare
tablouri
structuri
liste
...
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
16 / 57
Limbajul Alk
Modelul de memorie
Tip de date
Tip de data = valori (obiecte) + operatii
Fiecare valoare (obiect) este reprezentata pe un spatiu de memorie.
Pentru fiecare tip trebuie precizata lungimea (dimensiunea) reprezentarii
obiectelor.
Exista doua moduri de a defini lungimea reprezentarii:
uniform: lungimea reprezentarii valorilor scalare = 1, pentru obiectele
conpuse = numarul obiectelor scalare componente;
logaritmic: pentru obiectele scalare se presupune reprezentarea binara,
pentru obiectele compuse se ia suma reprezentarilor obiectelor
componente.
Limbajul Algoritmic
PA 2014/2015
17 / 57
Limbajul Alk
Modelul de memorie
Scalari
aici sunt incluse tipurile primitive: valorile boolene, algebra ntregilor,
algebra numerelor rationale (virgula mobila), siruri
notatie matematica
b 7 true
i 7 5
notatie grafica
true
b
5
i
C++
bool b = true;
int i = 5;
Limbajul Algoritmic
PA 2014/2015
18 / 57
Limbajul Alk
Modelul de memorie
Scalari (cont.)
ntregi:
Int = {. . . , 2, 1, 0, 1, 2, . . .}
booleeni:
Bool = {false, true}
rationale:
Float = numerele rationale
O caracteristica importanta pentru valorile scalare: admit reprezentari
finite
Intrebare: ce se poate spune despre numerele irationale, de exemplu
Limbajul Algoritmic
PA 2014/2015
2?
19 / 57
Limbajul Alk
Modelul de memorie
Tablouri (unidimensionale)
Un tablou (unidimensional) poate fi abstractizat ca o functie de la
multimea (finita) de indici la multimea de valori. O astfel de functie poate
fi reprezentata de o multime de perechi indice 7 valoare. Vom considera
ca multimea indicilor este {0, 1, . . . , n 1} (la fel ca n C++):
notatie matematica
notatie grafica
a 7 {0 7 a0 1 7 a1 2 7 a2 }
0
a0
a
1
a1
2
a2
int a[3];
for (i=0; i<3;++i)
cin >> a[i];
C++
or
int a = {a0, a1, a2};
Limbajul Algoritmic
PA 2014/2015
20 / 57
Limbajul Alk
Modelul de memorie
Limbajul Algoritmic
PA 2014/2015
21 / 57
Limbajul Alk
Modelul de memorie
Structuri
Structurile sunt reprezentate ntr-un mod similar celui de la tablouri,
numai ca acum domeniul functiilor este multimea numelor de campuri n
loc de cea a indicilor.
De exemplu, o structura p reprezentand puncte n plan are doua campuri:
x si y:
notatie matematica
notatie grafica
C++
p 7 {x 7 2 y 7 7}
x
2
p
y
7
struct Point {
int x;
int y;
} p;
p.x = 2; p.y = 7;
Limbajul Algoritmic
PA 2014/2015
22 / 57
Limbajul Alk
Modelul de memorie
Structuri (cont.)
Limbajul Algoritmic
PA 2014/2015
23 / 57
Limbajul Alk
Modelul de memorie
Liste liniare
ll 7 [2, 7, 4, 2, 8]
notatie grafica
2, 7, 4, 2, 8
ll
list<int> ll;
C++
(pot exista diferite implementari)
Limbajul Algoritmic
PA 2014/2015
24 / 57
Limbajul Alk
Modelul de memorie
Limbajul Algoritmic
PA 2014/2015
25 / 57
Limbajul Alk
Modelul de memorie
2
[0, 1]
C++
struct Graph {
int n;
vector<list<int>> a;
} G;
D. Lucanu (FII - UAIC)
G.n = 3;
G.a[0].push_front(1);
...
Limbajul Algoritmic
PA 2014/2015
26 / 57
Limbajul Alk
Operatii
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
27 / 57
Limbajul Alk
Operatii
Limbajul Algoritmic
PA 2014/2015
28 / 57
Limbajul Alk
Operatii
Operatii cu scalari
Intregi:
Operatie
a +Int b
a Int b
time(Operatie)
Cost uniform Cost logaritmic
O(1)
O(max(log a, log b))
O(log a log b)
O(1)
O(max(log a, log b)1.545 )
...
Limbajul Algoritmic
PA 2014/2015
29 / 57
Limbajul Alk
Operatii
Tablouri
Operatie
A.lookup(i)
A.update(i, v )
time(Operatie)
Cost uniform Cost logaritmic
O(1)
O(i + log ai )
O(1)
O(i + log v )
Limbajul Algoritmic
PA 2014/2015
30 / 57
Limbajul Alk
Operatii
Structuri
Operatie
S.lookup(x)
S.update(x, v )
time(Operatie)
Cost uniform Cost logarithmic
O(1)
O(log sx )
O(1)
O(log v )
unde am presupus S 7 {. . . x 7 sx , . . .}
Limbajul Algoritmic
PA 2014/2015
31 / 57
Limbajul Alk
Operatii
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
ntoarce
lista vida []
v0
vn1
vi
[. . . vi1 , x, vi , . . .]
[. . . vi1 , vi+1 , . . .]
n
[v1 , . . . , vn1 ]
[v0 , . . . , vn2 ]
[x, v0 , . . . , vn1 ]
[v0 , . . . , vn1 , x]
[. . . vi1 , x, vi+1 , . . .]
Limbajul Algoritmic
PA 2014/2015
32 / 57
Limbajul Alk
Operatii
Limbajul Algoritmic
PA 2014/2015
33 / 57
Limbajul Alk
Operatii
Limbajul Algoritmic
PA 2014/2015
34 / 57
Limbajul Alk
Operatii
Limbajul Algoritmic
PA 2014/2015
35 / 57
Limbajul Alk
Expresii si instructiuni
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
36 / 57
Limbajul Alk
Expresii si instructiuni
Expresii: sintaxa
Sintaxa este foarte apropiata de cea limbajului C++:
Varianta recursiva
Notatia Backus-Naur
Limbajul Algoritmic
PA 2014/2015
37 / 57
Limbajul Alk
Expresii si instructiuni
Instructiuni: sintaxa
syntax Stmt ::= Exp "=" Exp ";"
| Exp ";"
| "{" "}"
| "{" Stmts "}"
| "while" "(" Exp ")" Stmt
| "return" Exps ";"
| Exp "(" Ids ")" "{" Stmts "}"
| "if" "(" Exp ")" Stmt "else" Stmt
| "if" "(" Exp ")" Stmt
...
syntax Stmts ::= List{Stmt,""}
Alk este extensibil: pot fi adaugate noi expresii si instructiuni, cu precizaari
pentru costul timp
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
38 / 57
Limbajul Alk
Expresii si instructiuni
Tipuri de date
Limbajul Algoritmic
PA 2014/2015
39 / 57
Limbajul Alk
Expresii si instructiuni
Exemplu de program
/*
This example includes the recursive version of the DFS algorithm.
@input: a digraf D and a vertex i0
@output: the list S of the verices reachable from i0
*/
// the recursive function
dfsRec(i) {
if (S[i] == 0) {
// visit i
S[i] = 1;
p = D.a[i];
while (p.size() > 0) {
j = p.topFront();
p.popFront();
dfsRec(j);
}
}
}
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
40 / 57
Limbajul Alk
Expresii si instructiuni
Evaluarea expresiilor
Consideram o functie [[ ]]( ) : Expresii (Stare Valori), unde [[E ]]() ntoarce
valoarea expresiei E calculata n starea .
Exemplu: [[a + b 2]](a 7 3 b 7 6) = 15.
Reguli de calcul pentru [[ ]]( ):
[[x]](. . . x 7 v . . .) = v
[[v ]]( ) = v
Limbajul Algoritmic
PA 2014/2015
41 / 57
Limbajul Alk
Expresii si instructiuni
Configuratii
Limbajul Algoritmic
PA 2014/2015
42 / 57
Limbajul Alk
Expresii si instructiuni
Pasi de executie
Limbajul Algoritmic
PA 2014/2015
43 / 57
Limbajul Alk
Expresii si instructiuni
Instructiuni: semantica
atribuirea: x = E ;
informal: se evalueaza E si rezultatul este atribuit ca noua valoare a
variabilei x
formal:
hx = E ;S, (x 7 v )}i hS, (x 7 [[E ]]( (x 7 v ))}i
time(hx = E ;S, i hS, 0 i) = time([[E ]]()) + 1, cost uniform
time(hx = E ;S, i hS, 0 i) = time([[E ]]() + log[[E ]]()), cost
logaritmic
Limbajul Algoritmic
PA 2014/2015
44 / 57
Limbajul Alk
Expresii si instructiuni
Instructiuni: semantica
Limbajul Algoritmic
PA 2014/2015
45 / 57
Limbajul Alk
Expresii si instructiuni
Instructiuni: semantica
while: while (E ) S
informal: se evalueaza e; daca rezultatul obtinut este true, atunci se
executa S, dupa care se evalueaza din nou e si . . . ; altfel executia
instructiunii se termina
formal: se exprima cu ajutorul lui if:
hwhile (e) S y S 0 , i
hif (e) { S ; while (e) S } else { }S 0 , i
time(hwhile (E ) then S else S 0 S, i hif (e) ...S, i) = 0,
pentru ambele costuri
Limbajul Algoritmic
PA 2014/2015
46 / 57
Limbajul Alk
Expresii si instructiuni
Apelul de functie
Operatie mai complexa ce include mai multe activitati:
se evalueaza argumentele actuale
legarea parametrilor formali la valorile date de argumentele actuale
(parametrii functiei devin variabile cu valorile date de evaluarea
argumentelor actuale)
salvarea starii curente n lista de actvitati
construirea starii de start pentru executia corpului functiei formata
din variabilele globale, parametrii si variabilele locale ale functiei
dupa executia corpului functiei, se restaureaza starea de dinainte de
apel
Functiile sunt memorate ca variabile speciale
f 7 (parametri@{corpul functiei})
Presupunere: costul unui apel este suma dintre costul evaluarii
argumentelor actuale si costul executiei corpului functiei.
D. Lucanu (FII - UAIC)
Limbajul Algoritmic
PA 2014/2015
47 / 57
Limbajul Alk
Expresii si instructiuni
Calcul (executie)
Un calcul (o executie) este o secventa de pasi:
hS1 , 1 i hS2 , 2 i hS3 , 3 i . . .
Exemplu:
hif (x > 3) x = x + y; else x = 0; y = 4; skip, x 7 7 y 7 12i
hx = x + y; y = 4; skip, x 7 7 y 7 12i
hy = 4; skip, x 7 19 y 7 12i
hskip, x 7 19 y 7 4i
[[x > 0]](x 7 7 y 7 12) = true
[[x + y]](x 7 7 y 7 12) = 19
[[4]](x 7 19 y 7 12) = 4
cost uniform: 4
cost logaritmic: log 7 + log 7 + log 12 + log 19 + log 4
Limbajul Algoritmic
PA 2014/2015
48 / 57
Plan
Introducere
Limbajul Alk
Modelul de memorie
Operatii
Expresii si instructiuni
Sintaxa
Semantica
Limbajul Algoritmic
PA 2014/2015
49 / 57
Limbajul Algoritmic
PA 2014/2015
50 / 57
Limbajul Algoritmic
PA 2014/2015
51 / 57
Limbajul Algoritmic
PA 2014/2015
52 / 57
i = 0;
while (i < D.n) {
p[i] = D.a[i];
S[i] = 0;
i = i + 1;
}
SB = empty();
SB.pushFront(i0);
S[i0] = 1;
// visit i0
while (SB.size() > 0) {
i = SB.topFront();
if (p[i].size() == 0) {
SB.popFront();
}
else {
j = p[i].topFront();
p[i].popFront();
if (S[j] == 0) {
// visit j;
S[j] = 1;
SB.pushFront(j);
}
}
}
Limbajul Algoritmic
PA 2014/2015
53 / 57
Limbajul Algoritmic
PA 2014/2015
54 / 57
Limbajul Algoritmic
PA 2014/2015
55 / 57
Limbajul Algoritmic
PA 2014/2015
56 / 57
Demo
Limbajul Algoritmic
PA 2014/2015
57 / 57