Spécialité NSI — Terminale

Algorithmique, structures de données, bases de données, réseaux et web

Objectifs de l'année

  • Concevoir des algorithmes corrects et efficaces (complexité).
  • Programmer proprement en Python (tests, modularité, POO légère).
  • Maîtriser listes, piles, files, arbres, graphes.
  • Interroger une base SQL (schémas, clés, jointures).
  • Comprendre les réseaux (modèle, adresses, requêtes HTTP).

Compétences évaluées

  • Analyser un problème et proposer une solution algorithmique.
  • Justifier la complexité (O(n), O(n log n), O(n²)...).
  • Écrire des requêtes SQL correctes et optimisées.
  • Lire/écrire des structures de données adaptées.
  • Expliquer un fonctionnement réseau simple (client ↔ serveur).

Programme officiel — synthèse

ThèmeContenusExemples
Algorithmique Recherche, tri, récursivité, programmation dynamique Tri fusion, dichotomie, Fibonacci mémoïsé
Structures Listes, piles, files, arbres, graphes Parcours DFS/BFS, AVL (idée), tas
Données Modélisation relationnelle, SQL, normalisation SELECT, JOIN, GROUP BY, contraintes
Réseaux Adressage, DNS, HTTP, sockets Requête GET/POST, ping, traceroute
Web HTML/CSS minimal, API, JSON Fetch, endpoints REST

Algorithmique et complexité

Tri par fusion (divide and conquer)

def fusion(a, b):
    i = j = 0
    c = []
    while i < len(a) and j < len(b):
        if a[i] <= b[j]:
            c.append(a[i]); i += 1
        else:
            c.append(b[j]); j += 1
    return c + a[i:] + b[j:]

def tri_fusion(t):
    if len(t) <= 1:
        return t
    m = len(t)//2
    return fusion(tri_fusion(t[:m]), tri_fusion(t[m:]))

Complexité moyenne et pire : O(n log n). Mémoire supplémentaire O(n).

Structures de données

Pile et file

class Pile:
    def __init__(self): self._d = []
    def empiler(self, x): self._d.append(x)
    def depiler(self): return self._d.pop()
    def vide(self): return len(self._d) == 0

from collections import deque
file = deque()
file.append(1); file.append(2)
file.popleft()  # 1

Parcours de graphe

from collections import deque
def bfs(graphe, source):
    vus, q = {source}, deque([source])
    ordre = []
    while q:
        u = q.popleft(); ordre.append(u)
        for v in graphe[u]:
            if v not in vus:
                vus.add(v); q.append(v)
    return ordre

Bases de données — SQL

Schéma exemple: Élève(id, nom), Note(id, eleve_id, matiere, valeur)

-- Moyenne par élève en mathématiques
SELECT e.nom, AVG(n.valeur) AS moyenne
FROM Eleve e
JOIN Note n ON n.eleve_id = e.id
WHERE n.matiere = 'Maths'
GROUP BY e.nom
ORDER BY moyenne DESC;

Clés: primaire (unicité), étrangères (références). Normalisation pour éviter les duplications.

Réseaux et Web

  • DNS résout les noms de domaine en adresses IP.
  • HTTP définit les méthodes (GET, POST...), les codes (200, 404...).
  • JSON: format texte pour échanger des données.
// Requête GET avec fetch (JS)
fetch('https://api.exemple.com/users')
  .then(r => r.json())
  .then(data => console.log(data))
  .catch(console.error);

Raisonner sur la complexité

  • Identifier la boucle la plus coûteuse (n, n², n log n...).
  • Évaluer séparément les étapes majeures puis sommer.
  • Comparer des approches (itérative vs récursive).

Écrire du code fiable

  • Découper en fonctions pures testables.
  • Nommer clairement, documenter l’API, typer si possible.
  • Tester: cas nominal, bords, erreurs.
def somme(xs):
    assert all(isinstance(x, (int, float)) for x in xs)
    s = 0
    for x in xs: s += x
    return s

Méthode SQL

  1. Lire le besoin et identifier les tables concernées.
  2. Écrire le FROM/JOIN, puis filtrer (WHERE).
  3. Aggréger (GROUP BY) et trier (ORDER BY) si nécessaire.

Exercices guidés

  1. Implémenter une pile avec deux files (complexité amortie).
  2. Écrire merge k listes triées (tas binaire recommandé).
  3. Détecter un cycle dans un graphe (DFS avec couleurs).
  4. Donner la complexité des fonctions fournies.
  5. Modéliser puis écrire les requêtes SQL pour un cahier de notes.

🧪 Exercice pratique : Algorithme de recherche

Énoncé : Implémentez la recherche dichotomique et comparez sa complexité avec la recherche linéaire.

Testez votre algorithme :

def recherche_dichotomique(tab, x):
    debut, fin = 0, len(tab) - 1
    comparaisons = 0

    while debut <= fin:
        comparaisons += 1
        milieu = (debut + fin) // 2
        if tab[milieu] == x:
            return milieu, comparaisons
        elif tab[milieu] < x:
            debut = milieu + 1
        else:
            fin = milieu - 1
    return -1, comparaisons

💾 Exercice SQL interactif

Base de données Librairie :

LivreAuteurGenrePrix
1984George OrwellDystopie12.99
DuneFrank HerbertScience-fiction15.50
Le Seigneur des AnneauxJ.R.R. TolkienFantasy18.00

Question : Écrivez une requête pour trouver tous les livres de plus de 15€.

Jeu de tests exemple

def test_tri_fusion():
    assert tri_fusion([]) == []
    assert tri_fusion([1]) == [1]
    assert tri_fusion([3,1,2]) == [1,2,3]

def test_recherche_dichotomique():
    assert recherche_dichotomique([1,3,5,7,9], 5)[0] == 2
    assert recherche_dichotomique([1,3,5,7,9], 10)[0] == -1

⚡ Simulateurs interactifs avancés

Explorez les concepts algorithmiques avec ces outils interactifs de nouvelle génération

🔍 Simulateur de tri interactif

10 éléments
📊 Statistiques
Comparaisons: 0
Échanges: 0
Temps: 0ms
🔥 Complexité
Moyenne: O(?)
Pire cas: O(?)
Mémoire: O(?)

🐍 Console Python interactive

>>> Console Python NSI - Testez vos algorithmes
>>>
💡 Exemples: print("Hello") | list(range(10)) | sorted([3,1,4,1,5])

🕸️ Visualiseur de graphes

Résultat du parcours: -

🗄️ Constructeur de requêtes SQL

SELECT nom, prenom, age FROM eleves;

📈 Analyseur de complexité

🕸️ Simulateur de graphe

Créez des graphes et testez les algorithmes de parcours

Ajoutez des arêtes pour construire le graphe
Parcours : -

💾 Simulateur de complexité

Comparez les performances des algorithmes

O(n²)
Tri à bulles
-
O(n log n)
Tri fusion
-
O(n)
Recherche linéaire
-
O(log n)
Recherche dichotomique
-

Ressources

Conseil: constituez une fiche par thème avec définitions, schémas, exemples et pièges.