Exercice

Q1

def affiche(X):
    for x in X:
        print(x)

Q2

def somme(X):
    S = 0
    for x in X:
        S += x
    return S

Q3

On pose $ n = len(L) $
La fonction contient une boucle qui itère sur les éléments de X, chaque itération est un $O(1)$ Donc la complexité est $O(n)$

Q4

def moyenne(X):
    return somme(X) / len(X)

Q5

def compte(X):
    m = moyenne(X)
    c = 0
    for x in X:
        if x > m:
            c += 1
    return c

Q6

def sigma(X):
    m = moyenne(X)
    S = 0
    for x in X:
        S += (x-m)**2
    return S

Q7

def ecart_type(X):
    return (sigma(X)/len(X))**(1/2)

Partie 1: SQL

Q1

UPDATE Tournoi
SET catégorie = 'WTA 1000'
WHERE catégorie = 'WTA Premiere Mandatory' 
OR catégorie = 'WTA Premier 5'

Q2

$ $

Q3

Q4

Q5

Q6

Q7

Partie 2: Calcul numérique

Q1

def matrice_zeros(n):
    return [[0]*n for _ in range(n)]

Q2

def matrice_id(n):
    M = matrice_zeros(n)
    for i in range(n):
        M[i][i] = 1
    return M

Q3

def sigma(L, U, i, j):
    S = 0
    for k in range(i):
        S += L[i][k] * U[k][j]
    return S

Q4

def doolittle(M):
    n = len(M)
    L = matrice_id(n)
    U = matrice_zeros(n)
    for i in range(n):
        for j in range(i, n):
            U[i][j] = M[i][j] - sigma(L, U, i, j)
        for j in range(i+1, n):
            L[j][i] = (M[j][i] - sigma(L, U, j, i)) / U[i][i]
    return L, U

Q5

def descente(L, Y):
    n = len(L)
    Z = [0] * n
    for i in range(n):
        S = 0
        for j in range(i):
            S += L[i][j]*Z[j]
        Z[i] = Y[i] - S
    return Z

Q6

def remonte(U, Z):
    n = len(U)
    X = [0] * n
    for i in range(n):
        S = 0
        for j in range(n-1, i, -1):
            S += U[i][j] * X[j]
        X[i] = (Z[i] - S) / U[i][i]

Partie 3: Problème

Q1

def tri_sequence(S):
    n = len(S)
    for p in range(n):
        for i in range(n-1):
            if S[i] > S[i+1]:
                S[i], S[i+1] = S[i+1], S[i]
    return S

Q2

def sous_sequence(X, Y):
    j = 0
    for i in range(len(X)):
        while j < len(Y) and Y[j] != X[i]:
            j+=1
        if j == len(Y):
            return False
    return True

Q3

def taille_PLSSC(X, Y):
    if len(X) == 0 or len(Y) == 0:
        return 0
    if X[-1] == Y[-1]:
        return 1 + taille_PLSSC(X[:-1], Y[:-1])
    return max(taille_PLSSC(X[:-1], Y), taille_PLSSC(X, Y[:-1]))

Q4-a

def matrice_nulle(n, p):
    return [[0] * (p+1) for _ in range(n+1)]

Q4-b

def matrice_tailles(X, Y):
    n, p = len(X), len(Y)
    M = matrice_nulle(n, p)
    for i in range(n+1):
        for j in range(p+1):
            if i == 0 or j == 0:
                M[i][j] = 0
            elif X[i-1] == Y[i-1]:
                M[i][j] = 1 + M[i-1][j-1]
            else :
                M[i][j] = max(M[i][j-1], M[i-1][j])
    return M

Q4-c

def taille_plssc(X, Y):
    return matrice_tailles(X, Y)[-1][-1]

Q4-d

Soit $n = len(X)$ et $p = len(Y)$
La fonction contient 2 boucles imbriquées, chaque itération est un $O(1)$
Donc la complexité est $O(n\times p)$

Q5

Q6

Q7