Aller au contenu

Formulaire

LINFO1121Formulaire
Opération / patternCoût typique
accès tableau par indiceΘ(1)\Theta(1)
parcours de nn élémentsΘ(n)\Theta(n)
deux boucles imbriquées sur nnΘ(n2)\Theta(n^2)
recherche dichotomiqueΘ(log⁡n)\Theta(\log n)
tri efficace classiqueΘ(nlog⁡n)\Theta(n\log n)
redimensionnement ponctuel d’un tableau dynamiqueΘ(n)\Theta(n)
insertion amortie dans un tableau dynamiqueΘ(1)\Theta(1)
O=borne sup.,Ω=borne inf.,Θ=ordre exactO = \text{borne sup.}, \qquad \Omega = \text{borne inf.}, \qquad \Theta = \text{ordre exact}

Si T(n)∼anbT(n) \sim an^b :

T(2n)T(n)→2b\frac{T(2n)}{T(n)} \to 2^b
  • ratio ≈2\approx 2 → linéaire
  • ratio ≈4\approx 4 → quadratique
  • ratio ≈8\approx 8 → cubique

push(x) ajoute au top
pop() retire le top
peek() lit le top
isEmpty()

Avec une singly linked list : top en tête → push / pop en Θ(1)\Theta(1).

node.next = first;
first = node;
Queue<Integer> q = new ArrayDeque<>();
q.add(x); // enqueue
q.remove(); // dequeue
q.peek(); // lire la tête

À privilégier :

for (E x : list) {
process(x);
}

ou :

Iterator<E> it = list.iterator();
while (it.hasNext()) {
E x = it.next();
}

À éviter :

for (int i = 0; i < list.size(); i++) {
process(list.get(i));
}

Sur une LinkedList, ce dernier pattern peut coûter Θ(n2)\Theta(n^2).


int[] a = {1, 2, 3};
int[] b = a;
b[0] = 99;
// a[0] vaut aussi 99

Java passe toujours les arguments par valeur ; pour un objet, la valeur copiée est sa référence.

Pattern classique :

private final long expectedOps = nOp;
public E next() {
if (expectedOps != nOp) {
throw new ConcurrentModificationException();
}
// avancer
}
assertTrue(stack.empty());
stack.push(1);
assertEquals(1, stack.peek());
assertEquals(1, stack.pop());
assertThrows(EmptyStackException.class, stack::pop);

Éviter :

int mid = (lo + hi) / 2;

Préférer :

int mid = lo + (hi - lo) / 2;
System.out.println(-1 / 2); // 0

Java tronque vers zéro.

if (size == a.length) {
a = Arrays.copyOf(a, 2 * a.length);
}
a[size++] = item;

Le redimensionnement coûte Θ(n)\Theta(n), mais l’insertion reste Θ(1)\Theta(1) amortie.


stack mémoire → appels, paramètres, variables locales
heap → objets et tableaux

-Xms → taille initiale du heap
-Xmx → taille maximale du heap

Le garbage collector récupère les objets devenus inaccessibles.


Cette section sert uniquement à garder les squelettes centraux qu’il faut pouvoir retrouver rapidement.

int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (a[mid] < key) {
lo = mid + 1;
} else if (a[mid] > key) {
hi = mid - 1;
} else {
return mid;
}
}
return -1;

À ajouter quand le cours y arrive : sorting, BST, heap, hashing, BFS/DFS, graphes, strings.