Professional Documents
Culture Documents
Tema 1. An 'Alisi D'algorismes: Estructures de Dades I Algorismes
Tema 1. An 'Alisi D'algorismes: Estructures de Dades I Algorismes
Anàlisi d’algorismes
FIB
Q1 2023 – 24
Q1 2023 – 24
2 Notació asimptòtica
Notació asimptòtica: definicions
Notació asimptòtica: propietats
Formes de creixement
2 Notació asimptòtica
Notació asimptòtica: definicions
Notació asimptòtica: propietats
Formes de creixement
Objectius:
Comparar solucions algorı́smiques alternatives
Millorar els algorismes existents
Predir els recursos que farà servir un algorisme
Objectius:
Comparar solucions algorı́smiques alternatives
Millorar els algorismes existents
Predir els recursos que farà servir un algorisme
Objectius:
Comparar solucions algorı́smiques alternatives
Millorar els algorismes existents
Predir els recursos que farà servir un algorisme
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Mur infinit
Estem davant d’un mur que s’allarga indefinidament en totes dues direccions.
Volem trobar l’única porta que el travessa, però no sabem a quina distància
està ni en quina direcció. Tot i que és fosc, portem una espelma que ens
permet veure la porta quan ja hi som a prop.
T : E → R+ .
Però calcular T per cada entrada pot ser complicat i poc manejable.
T : E → R+ .
Però calcular T per cada entrada pot ser complicat i poc manejable.
T : E → R+ .
Però calcular T per cada entrada pot ser complicat i poc manejable.
Tipus d’entrades
Nombres naturals −→ codificació en valor (en “unari”)
|15| = 15
|(23, 1, 7, 0, 12)| = 5
Tipus d’entrades
Nombres naturals −→ codificació en valor (en “unari”)
|15| = 15
|(23, 1, 7, 0, 12)| = 5
P
Cas mig. Tmig (n) = x∈E,|x|=n Pr (x)T (x),
on Pr (x) és la probabilitat d’escollir l’entrada x entre totes les de mida n
Cal definir com es distribueix la probabilitat, i sol ser difı́cil de calcular.
P
Cas mig. Tmig (n) = x∈E,|x|=n Pr (x)T (x),
on Pr (x) és la probabilitat d’escollir l’entrada x entre totes les de mida n
Cal definir com es distribueix la probabilitat, i sol ser difı́cil de calcular.
P
Cas mig. Tmig (n) = x∈E,|x|=n Pr (x)T (x),
on Pr (x) és la probabilitat d’escollir l’entrada x entre totes les de mida n
Cal definir com es distribueix la probabilitat, i sol ser difı́cil de calcular.
Notació O gran
Donada una funció f , O(f ) representa la classe de funcions que
“creixen com f o més a poc a poc”.
Formalment, g ∈ O(f ) si existeixen c > 0 i n0 ∈ N tals que
∀n ≥ n0 g(n) ≤ c · f (n).
Notació O gran
Donada una funció f , O(f ) representa la classe de funcions que
“creixen com f o més a poc a poc”.
Formalment, g ∈ O(f ) si existeixen c > 0 i n0 ∈ N tals que
∀n ≥ n0 g(n) ≤ c · f (n).
Notació O gran
Donada una funció f , O(f ) representa la classe de funcions que
“creixen com f o més a poc a poc”.
Formalment, g ∈ O(f ) si existeixen c > 0 i n0 ∈ N tals que
∀n ≥ n0 g(n) ≤ c · f (n).
Notació O gran
Donada una funció f , O(f ) representa la classe de funcions que
“creixen com f o més a poc a poc”.
Formalment, g ∈ O(f ) si existeixen c > 0 i n0 ∈ N tals que
∀n ≥ n0 g(n) ≤ c · f (n).
Exemple
Sigui f (n) = 3n3 + 5n2 − 7n + 41. Llavors, podem afirmar que f ∈ O(n3 ).
∀n ≥ n0 f (n) ≤ cn3 .
8n3 + 41 ≤ 9n3 ⇐⇒ 41 ≤ n3 ,
∀n ≥ 4 f (n) ≤ 9n3 ,
2 Notació asimptòtica
Notació asimptòtica: definicions
Notació asimptòtica: propietats
Formes de creixement
Per a n ≥ 106 , doncs, n2 és més gran que 106 n. En aquest cas, direm
que la funció g(n) = 106 n està fitada superiorment per f (n) = n2
asimptòticament.
La notació O(g), anomenada ”O gran”, representa el conjunt de
funcions fitades asimptòticament per g.
Exemples
75n ∈ Θ(n)
1023n2 ∈
/ Θ(n)
n2 ∈
/ Θ(n)
2
2n ∈
/ Θ(2n )
Θ(n) ̸= Θ(n2 )
Exemples
3n2 + 5n − 7 ∈ O(n2 )
n + 15 ∈ O(n)
O(n5 ) ⊆ O(n6 )
n3 ∈
/ O(n2 )
n3 ∈ O(2n )
Exemples
2n ∈ Ω(n)
n2 ∈ Ω(n)
n ∈ Ω(n)
/ Ω(n2 )
n∈
Ω(n6 ) ⊆ Ω(n5 )
Relacions entre O, Ω i Θ
Donades dues funcions f i g:
f ∈ Ω(g) ⇐⇒ g ∈ O(f )
Θ(f ) = O(f ) ∩ Ω(f )
f ∈ Θ(g) ⇐⇒ f ∈ O(g) i f ∈ Ω(g)
Propietats de Θ
Donades les funcions f , f1 , f2 , g, g1 , g2 i h:
Reflexivitat. f ∈ Θ(f )
Transitivitat. h ∈ Θ(g) ∧ g ∈ Θ(f ) ⇒ h ∈ Θ(f )
Simetria. g ∈ Θ(f ) ⇐⇒ f ∈ Θ(g) ⇐⇒ Θ(g) = Θ(f )
Suma. g1 ∈ Θ(f1 ) ∧ g2 ∈ Θ(f2 ) ⇒ g1 + g2 ∈ Θ(f1 + f2 ) = Θ(max(f1 , f2 ))
Producte. g1 ∈ Θ(f1 ) ∧ g2 ∈ Θ(f2 ) ⇒ g1 · g2 ∈ Θ(f1 · f2 )
Invariància multiplicativa. Per a tota constant c ∈ R+ , Θ(f ) = Θ(c · f )
Notació de classes
Si F1 i F2 són classes de funcions (com ara O(f ) o Ω(f )), definim:
F1 + F2 = {f + g | f ∈ F1 ∧ g ∈ F2 }
F1 · F2 = {f · g | f ∈ F1 ∧ g ∈ F2 }
Notació de classes
Si F1 i F2 són classes de funcions (com ara O(f ) o Ω(f )), definim:
F1 + F2 = {f + g | f ∈ F1 ∧ g ∈ F2 }
F1 · F2 = {f · g | f ∈ F1 ∧ g ∈ F2 }
Logarismes
Siguin a, b > 1. Aleshores loga (n) ∈ Θ(logb (n))
cost 10 20 30 40 50
n N1 100N1 1000N1
n2 N2 10N2 31.6N2
n3 N3 4.64N3 10N3
2n N4 N4 + 6.64 N4 + 9.97
3n N5 N5 + 4.19 N5 + 6.29
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Segona solució
Escriure els k primers en un vector i ordenar-los de forma decreixent.
Cada element següent es tracta per separat:
si és més petit que el k -èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Primera solució
Ordenar els nombres en un vector de forma decreixent i retornar el k -èsim.
Problema de selecció
Donada una llista de n naturals, determinar el k -èsim més gran.
Segona solució
Escriure els k primers en un vector i ordenar-los. Cada element següent es
tracta per separat:
si és més petit que el k-èsim del vector, es descarta;
si no, se situa correctament en el vector i s’elimina el més petit.
Retornar l’element de la k-èsima posició.
O((k log k ) + (n − k ) · k )
Si k és constant, és O(k · n) = O(n)
Si k = ⌈n/2⌉, és O( n2 · n2 ) = O(n2 )
Mur infinit
Estem davant d’un mur que s’allarga indefinidament en totes dues direccions.
Volem trobar l’única porta que el travessa, però no sabem a quina distància
està ni en quina direcció. Tot i que és fosc, portem una espelma que ens
permet veure la porta quan ja hi som a prop.
n−1
X (n − 1)n
recordem que i=
2
i=1
k −1
X
2i = 2k − 1
recordem que
i=0
2 Notació asimptòtica
Notació asimptòtica: definicions
Notació asimptòtica: propietats
Formes de creixement
F1 ; F2
és C1 + C2 .
F1 ; F2 ; . . . ; FN
és C1 + C2 + · · · + CN
if (B) F1 ; else F2
while (B) F ;
PN
és k=1 Ck + Dk + DN+1 .
if (B) F1 ; else F2
while (B) F ;
PN
és k=1 Ck + Dk + DN+1 .
5 6 1 2 0 7 4 3
5 6 1 2 0 3 4 7
5 4 1 2 0 3 6 7
3 4 1 2 0 5 6 7
3 0 1 2 4 5 6 7
2 0 1 3 4 5 6 7
1 0 2 3 4 5 6 7
0 1 2 3 4 5 6 7
2, 6 Iteracions bucles: m − 1 + 1 = m, n − 1 + 1 = n.
7 Cost Θ(i).
altres Instruccions de cost constant: Θ(1).
Pn Pn
tsel (n) = Θ(1) + i=1 (Θ(i) + Θ(1)) = Θ( i=1 i) = Θ( n(n+1)
2 ) = Θ(n2 )
5 6 1 2 0 7 4 3 (0)
5 6 1 2 0 7 4 3 (0)
1 5 6 2 0 7 4 3 (2)
1 2 5 6 0 7 4 3 (2)
0 1 2 5 6 7 4 3 (4)
0 1 2 5 6 7 4 3 (0)
0 1 2 4 5 6 7 3 (3)
0 1 2 3 4 5 6 7 (4)
Pn−1
Θ(1) + (Θ(n) × Θ(1)) ≤ tins (n) ≤ Θ(1) + k=1 Θ(k)
Tenim que el cost d’ordenar per inserció n elements és tins (n) on:
n−1
X
Θ(1) + (Θ(n) × Θ(1)) ≤ tins (n) ≤ Θ(1) + Θ(k)
k =1
Però
Pn−1 (n−1)n
k=1 k = 1 + 2 + · · · + (n − 1) = 2 ∈ Θ(n2 ).
Aleshores,
Pn−1 Pn−1
k=1 Θ(k) = Θ( k =1 k ) = Θ(n2 )
i
Definició
Una recurrència és una equació o una inequació que descriu una funció
expressada en termes del seu valor per a entrades més petites.
Exemple
1, si n = 1
C(n) =
C(n − 1) + n, si n ≥ 2
Definició
Una recurrència és una equació o una inequació que descriu una funció
expressada en termes del seu valor per a entrades més petites.
Exemple
1, si n = 1
C(n) =
C(n − 1) + n, si n ≥ 2
Solució
C(n) = C(n − 1) + n
= C(n − 2) + (n − 1) + n
= C(n − 3) + (n − 2) + (n − 1) + n
..
.
= C(1) + 2 + · · · + (n − 2) + (n − 1) + n
= 1 + 2 + ··· + n
n
X n(n + 1)
= i= ∈ Θ(n2 ).
2
i=1
Per trobar una recurrència que descrigui el cost d’un algorisme recursiu,
hem de determinar:
T (n) = T (n − 1) + Θ(1)
Solució
T (n) = T (n − 1) + Θ(1)
= T (n − 2) + 2 · Θ(1)
= T (n − 3) + 3 · Θ(1)
..
.
= T (1) + (n − 1) · Θ(1)
= T (0) + n · Θ(1)
= (n + 1) · Θ(1)
= Θ(n + 1) = Θ(n).
Solució
T (n) = a · T (n − c) + g(n)
Exemple 1
Hem vist que el cost de l’algorisme recursiu de cerca lineal es pot descriure
amb la recurrència T (n) = T (n − 1) + Θ(1) per a n ≥ 1 i T (0) = Θ(1).
Per tant, n0 = 1, a = 1, c = 1, k = 0. Llavors, T (n) pertany al segon cas:
Exemple 2
En la recurrència T (n) = T (n − 1) + Θ(n), tenim els valors
a = 1, c = 1, k = 1.
Exemple 3
En la recurrència T (n) = 2 · T (n − 1) + Θ(n), tenim els valors
a = 2, c = 1, k = 1.
T (n) ∈ Θ(2n ).
Exemple 1
Hem vist que el cost de l’algorisme recursiu de cerca binària es pot descriure
amb la recurrència T (n) = T (n/2) + Θ(1) per a n ≥ 1 i T (0) = Θ(1).
Per tant, n0 = 1, a = 1, b = 2, k = 0, α = 0. Llavors, T (n) pertany al 2n cas:
Exemple 2
Funció principal de l’ordenació per fusió (mergesort).
Exemple 2
Hem vist que el cost de l’ordenació per fusió es pot descriure amb la
recurrència T (n) = 2T (n/2) + Θ(n) per a n ≥ 2 i T (1) = Θ(1).
Per tant, n0 = 2, a = 2, b = 2, k = 1, α = 1. Llavors, T (n) pertany al 2n cas:
1a solució
int fib(int k) {
if (k <= 1) return 1;
else return fib(k-1) + fib(k-2);
}
2a solució
int fib(int k) {
if (k <= 1) return 1;
int cur = 1;
int pre = 1;
for (int i = 1; i < k; ++i) {
int tmp = pre;
pre = cur;
cur = cur + tmp;
}
return cur;
}
3a solució
typedef vector<vector<int>> matrix;
int fib(int k) {
matrix f = {{1, 1}, {1, 0}};
matrix p = pow(f, k);
return p[1][0] + p[1][1];
}
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).
El cost de l’algorisme representat per l’arbre és, per tant, Ω(log n!). Com que
n! ≥ n · (n − 1) · (n − 2) · . . . · ⌊n/2⌋ ≥ (n/2)(n/2)
tenim que
n
log2 n! ≥ log2 (n/2)(n/2) = log2 (n/2) ∈ Ω(n log n).
2
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).
El cost de l’algorisme representat per l’arbre és, per tant, Ω(log n!). Com que
n! ≥ n · (n − 1) · (n − 2) · . . . · ⌊n/2⌋ ≥ (n/2)(n/2)
tenim que
n
log2 n! ≥ log2 (n/2)(n/2) = log2 (n/2) ∈ Ω(n log n).
2
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).
El cost de l’algorisme representat per l’arbre és, per tant, Ω(log n!). Com que
n! ≥ n · (n − 1) · (n − 2) · . . . · ⌊n/2⌋ ≥ (n/2)(n/2)
tenim que
n
log2 n! ≥ log2 (n/2)(n/2) = log2 (n/2) ∈ Ω(n log n).
2
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).
El cost de l’algorisme representat per l’arbre és, per tant, Ω(log n!). Com que
n! ≥ n · (n − 1) · (n − 2) · . . . · ⌊n/2⌋ ≥ (n/2)(n/2)
tenim que
n
log2 n! ≥ log2 (n/2)(n/2) = log2 (n/2) ∈ Ω(n log n).
2
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).
El cost de l’algorisme representat per l’arbre és, per tant, Ω(log n!). Com que
n! ≥ n · (n − 1) · (n − 2) · . . . · ⌊n/2⌋ ≥ (n/2)(n/2)
tenim que
n
log2 n! ≥ log2 (n/2)(n/2) = log2 (n/2) ∈ Ω(n log n).
2
Proposició
Tot algorisme d’ordenació basat en comparacions té cost Ω(n log n).