RODCUT(n):
R = new Array(n)
if(n>m) return 0;
for i = 0 to n:
m = P[i]
for k = 1 to i-1 do
if(R[k]+R[k-i]>m)
m = R[k]+R[k-i]
R[i] = m;
return R;
RODCUT(n):
R = new Array(n)
K = new Array(n)
if n == 0 return
for i = 1 to n
m = P[i]
K[i] = i
for k = 1 to i-1 do
if(R[k]+R[k-i]>m)
m = R[k]+R[k-i]
R[i] = m;
return K;
MATRIX-CHAIN-ORDER(p, i, j)
if i == j:
return 0
sm = +infinito
for k from i to j-1
sx = MATRIX-CHAIN-ORDER(p, i, k)
dx = MATRIX-CHAIN-ORDER(p, k+1, j)
tot = sx + dx + P[0]*P[k]*P[j]
if sm > tot:
sm = tot;
return sm
MATRIX-CHAIN-ORDER(p, i, j)
S = new Matrix(n,n)
for i = 1 to n:
S[i,i] = 0;
for l = 2 to n do
for i = 1 to n-l+1 do
j = i+l-1
S[i,j] = inf
for k = i to j-1 do
costo = S[i,k] + S[k+1, j] + P[i-1]*P[k]*P[j]
if S[i,j] > costo
S[i,j] = costo
return S[1,n]
MATRIX-CHAIN-ORDER(p, n)
S = new matrix(n, n)
D = new matrix(n, n)
for i = 1 to n do:
S[i, i] = 0
for l = 2 to n do:
for i = 1 to n - l + 1 do:
j = i + l - 1
S[i, j] = +infinity
for k = i to j - 1 do: # k è il punto di scissione
q = S[i, k] + S[k+1, j] + p[i-1] * p[k] * p[j]
if S[i, j] > q:
S[i, j] = q
D[i, j] = k # Memorizza il punto di scissione ottimale
return S[1, n]
PRINT-CHAIN(D, i, j)
if i == j:
print "A" + i
else:
k = D[i, j]
print "("
PRINT-CHAIN(D, i, k)
PRINT-CHAIN(D, k+1, j)
print ")"
HEAP
DECREASE-KEY(H, i, k)
H[i] = k
p = parent(i)
while i > 0 and H[p] > H[i] do
swap(H[i], H[p])
i = p
p = parent(i)
INSERT(H, k)
i = |H| - 1
H[i] = k
p = parent(i)
while i > 0 and H[p] > H[i] do
swap(H[i], H[p])
i = p
p = parent(i)
void min_heapify(int i){
int l = left(i);
int r = right(i);
int min = i;
if(l < size && array[l] < array[min]) min = l;
if(r < size && array[r] < array[min]) min = r;
if(min != i){
int scambio = array[i];
array[i] = array[min];
array[min] = scambio;
min_heapify(min);
}
}
int extractMax(){
int max = array[0];
int scambio = array[0];
array[0] = array[size-1];
array[size-1] = scambio;
size--;
max_heapify(0);
return max;
}
HEAPSORT
void HeapSort(array){
buildMaxHeap(array);
int len = size;
for(int i = len-1; i > 2; i--){
int scambio = array[i];
array[i] = array[0];
array[0] = scambio;
max_heapify(0, i); //il paramentro indica la lunghezza massima
}
HUFFMAN
HUFFMAN(Σ, f)
Q <- new Priority Queue
// Inizializzazione: crea un nodo foglia per ogni carattere
foreach c in Σ do:
x <- new Node(c)
insert x in Q
// Costruzione dell'albero dal basso verso l'alto
for i <- 1 to |Σ| - 1 DO
x <- extractMin(Q) // Estrae il nodo con frequenza minima
y <- extractMin(Q) // Estrae il secondo nodo con frequenza minima
z <- new Node // Crea un nuovo nodo interno
f(z) = f(x) + f(y) // Somma le frequenze
left(z) = x // Assegna i figli
right(z) = y
insert z in Q // Inserisce il nuovo nodo nella coda
return extractMin(Q) // Ritorna la radice dell'albero
Longest common substring
LCS(X,Y, n, m)
dp[][]= new matrix(m+1,n+1)
maxLength = 0
endIndex = 0
for i from 1 to m+1 do:
for j from 1 to n+1 do:
if X[i] == Y[j]:
dp[i][j] = dp[i-1][j-1] +1
if dp[i][j] > maxLength:
maxLength = dp[i][j]
endIndex = i
else:
dp[i][j] = 0
LCS = X[endIndex - maxLenght : endIndex]
return LCS
Longest common subsequence
LCS-LENGTH(X, Y)
m = X.length
n = Y.length
Siano b[1..m, 1..n] e c[0..m, 0..n] nuove tabelle
// Inizializzazione casi base
for i = 1 to m: c[i, 0] = 0
for j = 0 to n: c[0, j] = 0
// Calcolo Bottom-up
for i = 1 to m:
for j = 1 to n:
if X[i] == Y[j]:
c[i, j] = c[i-1, j-1] + 1
b[i, j] = "↖" // Corrisponde a diagonale
elseif c[i-1, j] >= c[i, j-1]:
c[i, j] = c[i-1, j]
b[i, j] = "↑" // Corrisponde a 'su'
else:
c[i, j] = c[i, j-1]
b[i, j] = "←" // Corrisponde a 'sinistra'
return c, b
PRINT-LCS(b, X, i, j)
if i == 0 or j == 0:
return
if b[i, j] == "↖":
PRINT-LCS(b, X, i-1, j-1)
print X[i]
elseif b[i, j] == "↑":
PRINT-LCS(b, X, i-1, j)
else:
PRINT-LCS(b, X, i, j-1)
Activity selector
RECURSIVE-ACTIVITY-SELECTOR(s, f, k, n)
1 m = k + 1
2 while m <= n and s[m] < f[k] // Trova la prima attività in Sk
3 m = m + 1
4 if m <= n
5 return {a_m} U RECURSIVE-ACTIVITY-SELECTOR(s, f, m, n)
6 else
return Ø
GREEDY-ACTIVITY-SELECTOR(s, f)
1 n = s.length
2 A = {a_1}
3 k = 1
4 for m = 2 to n
5 if s[m] >= f[k]
6 A = A U {a_m}
7 k = m
8 return A
Distanza di editing
EDT(X, Y, n, m)
Dichiara matrice ED[0..n, 0..m]
// Inizializzazione
FOR i = 0 TO n DO ED[i, 0] = i
FOR j = 0 TO m DO ED[0, j] = j
// Riempimento Matrice
FOR i = 1 TO n DO
FOR j = 1 TO m DO
IF X[i] == Y[j] THEN
ED[i, j] = ED[i-1, j-1]
ELSE
ED[i, j] = min(ED[i, j-1], // Inserimento
ED[i-1, j], // Cancellazione
ED[i-1, j-1]) // Sostituzione
+ 1
PRINT-EDT(ED, X, Y, n, m)
i = n, j = m
WHILE (i > 0 OR j > 0)
IF (i > 0 AND j > 0 AND X[i] == Y[j]) THEN
// Match: nessun costo, ci spostiamo in diagonale
i = i - 1
j = j - 1
ELSE
// Determiniamo da quale cella proviene il minimo
min_val = min(ED[i, j-1], ED[i-1, j], ED[i-1, j-1])
IF (j > 0 AND min_val == ED[i, j-1]) THEN
STAMPA("Inserimento di " + Y[j])
j = j - 1
ELSE IF (i > 0 AND min_val == ED[i-1, j]) THEN
STAMPA("Cancellazione di " + X[i])
i = i - 1
ELSE
STAMPA("Sostituzione di " + X[i] + " con " + Y[j])
i = i - 1
j = j - 1
BFS(V, s)
Foreach v in V //for di inizializzazione
color[v] = White
d[v] = +infinito
d[s] = 0; // la distanza della sorgente da stessa è 0
Q = { } // inizializzazione della coda come vuota
Q.enqueue(s)
While Q != {} DO
v = Q.dequeue(Q)
foreach u in ADJ(v) //scorriamo tutti i nodi adiacenti a v
if(color[u] == W)
d[u] = d[v]+1
color[u] = Gray
Q.enqueue(u)
color[v] = Black
DFS
DFS-visit(v):
d[v] = T //tempo di inizio visita
T = T+1 //variabile che scandisce il tempo
color[v] = gray;
foreach u in adj(v)
if color[u] = white
π[u] = v
DFS-visit(u)
color[v] = black
F[v] = T //tempo di fine visita
T = T+1 //variabile che scandisce il tempo
DFS(G,s):
foreach v in V DO:
color[v] = white
π[] = null
foreach v in V DO:
if color[v] = white:
DFS-visit(s);
Bellam-Ford
Bellman-Ford(G, s, w) // 1. Inizializzazione d = new Array(len(V)) for each v ∈ V do d[v] = +∞ π[v] = NIL d[s] = 0 // 2. Rilassamento iterativo degli archi for i ← 1 to |V|-1 do for each (u, v) ∈ E do relax(u, v, w) // 3. Controllo dei cicli di peso negativo for each (u, v) ∈ E do if (d[v] > d[u] + w(u, v)) then return false return d
Dijkstra
Dijkstra(G, s, w)
d = new Array(len(V))
for each v ∈ V do
d[v] = +∞
π[v] = NIL
d[s] = 0
Q ← build-min-heap(V)
while Q ≠ ∅ do
v ← extract-min(Q)
foreach u ∈ ADJ(v)
if d[u] > d[v] + w(v, u) then
decrease-key(Q, u, d[v] + w(v, u))
Floyd Warshall
FLOYD-WARSHALL(W)
n = m // numero di vertici
D^0 = W
for k = 1 to n do
D^k = new Matrix(n, n)
for i = 1 to n do
for j = 1 to n do
// Se il cammino attraverso k è più breve, aggiorna
if (D^{k-1}[i, j] > D^{k-1}[i, k] + D^{k-1}[k, j])
D^k[i, j] = D^{k-1}[i, k] + D^{k-1}[k, j]
else
D^k[i, j] = D^{k-1}[i, j]
return D^n
APSP
Fast-APSP(W)
n = m // numero di vertici
L^1 = W
d = 1
while d < n - 1 do
L^{2d} = EXTEND-APSP(L^d, L^d)
d = 2d
return L^d
APSP(W)
n = m L_1 = W
for d = 2 to n - 1 do
L_d = EXTEND-APSP(L_{d-1}, W)
return L_{n-1}
Extend-APSP(L, W)
n = L.rows
L_new = new Matrix(n, n)
for i = 1 to n do
for j = 1 to n do
L_new[i, j] = infinity
for k = 1 to n do
if (L[i, k] + W[k, j] < L_new[i, j])
L_new[i, j] = L[i, k] + W[k, j]
return L_new
SSSP DAG
DAG-SHORTEST-PATHS(G, w, s)
U = getTopologicalOrder(G);
foreach v in U:
foreach v in G.Adj[u]
RELAX(u, v, w)
Counting Sort
Counting-Sort(A, B, n):
k = max(A) // valore massimo in A
C = new Array(k+1)
// inizializza C a 0
for i = 0 to k:
C[i] = 0
// conta le occorrenze
for i = 0 to n-1:
C[A[i]] = C[A[i]] + 1
// calcola le posizioni cumulative
for i = 1 to k:
C[i] = C[i] + C[i-1]
// costruisci l'array ordinato B in maniera stabile
for i = n-1 downto 0:
B[C[A[i]] - 1] = A[i] // -1 perché B è 0-indexed
C[A[i]] = C[A[i]] - 1