Bonjour,
« il me semble - O(n) qui éaglise tetra(n)). »
ceci n'a absolument aucun sens. Donc je vais la refaire. Quant tu veux connaître le coût d'un algorithme, tu peux vouloir calculer plusieurs choses :
le nombre exact d'opération (mais c'est long et fastidieux)
une borne supérieure sur le nombre d'opérations
un ordre de grandeur pour cette borne supérieure : on dit alors que « l'algo est en O(f(n)) », ce qui signifie que le coût sera « au pire quelques f(n) »
une borne inférieure sur le nombre d'opérations
un ordre de grandeur pour cette borne inférieure : on dit alors que « l'algo est en Ω(g(n)) », ce qui signifie que le coût sera « au mieux quelques g(n) »
et enfin un ordre de grandeur du nombre d'opérations en général quand c'est possible (si f(n) = g(n) en gros) : on dit alors que l'algo est en Θ(f(n)), ce qui signifie que le coût sera « toujours quelques f(n) ».
Souvent, on se contente du O(...) parce que le Ω(...) (et donc le Θ(...)) sont très difficile à déterminer. Cela dit, en l'absence d'appel de fonction dans une seule branche d'un if et en l'absence de break/continue dans les boucles, on peut normalement déterminer le Θ(...), ce qui est mieux.
Dans ton cas, je trouve :
1. Θ(n²) tel que c'est écrit (et Θ(n) en Haskell car il va faire optimiser le calcul de la ligne 5 automatiquement).
2. O(n²) avec un tableau, O(n.log(n)) avec un tas.
3a. Θ(n.log(n)) ... ce qui est naze parce que je sais faire en ≃ 3n/2. (il faudrait que je regarde si Haskell arrive à optimiser ce code là tient
)
3b. Θ(m.n.log(n)).