Le carnet On est
Anti-sèche · à recopier à la main

Feuille 2 — collections, complexité, acteurs & Petri

Collections & fonctions d'ordre supérieur, complexité algorithmique, modèle d'acteurs Akka, réseaux de Petri. La boîte à outils & la théorie.

1. Collections — hiérarchie & bases

Iterable Seq Set Map IndexedSeq→Vector LinearSeq→List ★ HashSet ★ HashMap ★ Seq ordonné · Set sans doublon · Map clé→valeur
val s = Seq(5,1,3); s.head // 5; s.tail // List(1,3); s(1) // 1 (0-idx)
2 +: s          // prepend : List(2,5,1,3)  (": côté collection")
s :+ 9          // append  : List(5,1,3,9)
s ++ Seq(4)     // concat  : List(5,1,3,4)
1 :: 2 :: Nil   // List(1,2)  ; l1 ::: l2 concatène 2 List
Set(5,1,1)       // Set(5,1) ; & inter · &~ diff · ++ union

Map — accès safe : m(k) peut throw, préférer getOption.

val m = Map("a"->1, "b"->2)
m("z")            // ⚠ NoSuchElementException
m.get("z")        // None  (Option[Int])
m.getOrElse("z",0) // 0
m + ("c"->3)      // ajout (immuable → nouvelle Map)

Set/clé de Map = invariantsSet.empty[Int]. StringSeq[Char].

2. Fonctions d'ordre supérieur (clé !)

méthodesignatureexemple
map(T=>U)List(1,2) map(_*10)List(10,20)
filter(T=>Bool)List(1,2,3) filter(_>1)List(2,3)
flatMap(T=>It[U])List(1,2) flatMap(x=>List(x,x))List(1,1,2,2)
flattenList(List(1),List(2)).flattenList(1,2)
exists(T=>Bool):BoolList(1,2) exists(_>1)true
forall(T=>Bool):BoolList(2,4) forall(_%2==0)true
count(T=>Bool):IntList(1,2,3) count(_%2==1)2
find(T=>Bool):Opt[T]List(1,2,3) find(_>1)Some(2)
partition(T=>Bool)(ceux vrais, ceux faux)
take/drop(n)List(1,2,3) take 2List(1,2)
groupBy(T=>K):Map[K,Coll]List(1,2,3) groupBy(_%2)Map(1->List(1,3),0->List(2))
zip(It[U]):It[(T,U)]List(1,2) zip List("a","b")List((1,a),(2,b))
sortBy(T=>K)l.sortBy(_.age)
sum/min/maxList(1,2,3).sum6

Le type de retour = type d'entrée (ListList) ; l'ordre est préservé sur collection ordonnée. Comptage de mots : mots.groupMapReduce(identity)(_=>1)(_+_).

3. for-comprehension & fold

for-yield = sucre pour map / filter / flatMap (⚠ sans yield → boucle Unit).

for (x <- c) yield f(x)            // ≡ c.map(f)
for (x <- c if p(x)) yield f(x)     // ≡ c.filter(p).map(f)
for (x <- c1; y <- c2) yield (x,y) // ≡ c1.flatMap(x=>c2.map(y=>(x,y)))

fold — agrège avec un élément neutre z (collection vide → z) :

foldLeft[U](z:U)(op:(U,T)=>U)  // op(op(op(z,a1),a2),a3) — TAIL-REC ✓
foldRight[U](z:U)(op:(T,U)=>U) // op(a1,op(a2,op(a3,z))) — pas tail-rec
List(1,2,3).foldLeft(0)(_+_)   // 6
List(1,2,3).foldLeft(10)(_-_)  // ((10-1)-2)-3 = 4
foldLeft (acc ⟵ gauche) z ▸ op ▸ op ▸ op ▸ op a1 a2 a3 a4 ↳ reduce = fold sans z (vide ⇒ exception)

reduce = fold sans neutre (head comme départ) ; vide → exception (reduceOptionOption).

4. Complexité — O, Ω, Θ

Nb d'opérations élémentaires selon la taille n, indépendant machine/langage. On retient le pire des cas ($\max$).

Définitions
  • $O(g)$ (borne sup) : $\exists\,k,n_0:\forall n\ge n_0,\ 0\le f(n)\le k\,g(n)$
  • $\Omega(g)$ (borne inf) : $\ldots\ 0\le k\,g(n)\le f(n)$
  • $\Theta(g)$ : $k_1 g(n)\le f(n)\le k_2 g(n)$  ⟺  $O(g)\wedge\Omega(g)$
$O$classeexemple
$1$constanteaccès tableau
$\log n$logarithmiquedichotomie, PGCD
$n$linéaireparcours, factorielle
$n\log n$quasi-linéairetri fusion / rapide
$n^2$quadratiquetri bulles / sélection
$2^n$exponentielleHanoï, Fibo naïf
$n!$factoriellepermutations

Règles : séquence = somme (max domine) · boucles imbriquées = produit · on garde le terme dominant ($12n^2{-}13n{+}17=O(n^2)$).

5. Récurrences & théorème Master

algorécurrencerésultat
factorielle$T(n)=T(n{-}1)+c$$\Theta(n)$
Hanoï$T(n)=2T(n{-}1)+1$$2^n{-}1=\Theta(2^n)$
Fibonacci$T(n)=T(n{-}1)+T(n{-}2)$$\Theta(\varphi^n),\ \varphi=\frac{1+\sqrt5}{2}$
PGCD (Euclide)via Fibonacci$O(\log n)$
tri fusion$T(n)=2T(n/2)+\Theta(n)$$\Theta(n\log n)$
Master — $T(n)=a\,T(n/b)+\Theta(n^d)$ : $$T(n)=\begin{cases}\Theta(n^d)&ab^d\end{cases}$$ Fusion : $a{=}2,b{=}2,d{=}1\Rightarrow a{=}b^d\Rightarrow\Theta(n\log n)$.

Récurrence linéaire ordre 2 $u_{n+2}=a\,u_{n+1}+b\,u_n$ → éq. caractéristique $x^2-ax-b=0$ (Fibo : $x^2-x-1=0$).

arbre tri fusion (n=8) — profondeur log₂8 = 3 8 4 4 2 22 22 22 2 coût n par niveau × log n niveaux = n·log n

6. Akka — modèle d'acteurs

Pas de mémoire partagée : on communique par messages. Chaque acteur a un état privé, une mailbox, traite ses messages un à un → pas de mutex, pas de race.

class Serveur extends Actor {
  def receive: Receive = {     // = PartialFunction[Any,Unit]
    case Factorial(n) => sender() ! Result(fact(n))  // répond
    case _            => sender() ! "?"
  }
}
val sys = ActorSystem("S")
val a   = sys.actorOf(Props[Serveur], "serv")  // → ActorRef
a ! Factorial(5)        // ! = tell, async, fire-and-forget
val fut = a ? Factorial(5)  // ? = ask → Future (+ implicit Timeout)

Messages = sealed trait + case class/object (exhaustivité). context.actorSelection("/user/serv") pour trouver par chemin. Hooks : preStart / postStop.

client1 client2 mailbox Serveur ! Factorial(5) → sender() ! Result(120)

7. Philosophes & interblocage

5 philosophes, 1 fourchette entre chaque ; manger = tenir les 2 fourchettes. Deadlock : tous prennent leur gauche → personne n'a la droite.

4 conditions de Coffman (deadlock ⟺ les 4 ; en casser une suffit) : ① exclusion mutuelle ② détention + attente ③ non-préemption ④ attente circulaire.
Fix 1 — superviseur
arbitre central : donne les 2 fourchettes ou aucune (casse détention+attente).
Fix 2 — ordre total
prendre d'abord la fourchette de plus petit numéro (casse l'attente circulaire).
P0 P1 P2 P3 P4 attente circulaire

8. Réseaux de Petri

$N=(P,T,F,M_0)$ · places ○ (états/ressources) · transitions ▭ (actions) · arcs F (pondérés, 1 par défaut) · $M_0$ marquage initial (jetons).

Tirage : t franchissable ssi chaque place d'entrée a ≥ poids de l'arc. Tirer consomme les jetons d'entrée et produit ceux de sortie (atomique).
P₁ T P₂ place → transition → place

Matriciel : Pre (arcs entrants), Post (sortants), incidence $C = Post - Pre$. Après une séquence $s$ (s[t] = nb tirages) : $M' = M + C\cdot s$.

Propriétés : k-bornée $M(p)\le k$ · sûre (1-bornée) $\in\{0,1\}$ · vivante (aucune transition bloquée à jamais) · bloquée (aucune transition franchissable) · réversible ($M_0$ ré-atteignable). Patterns : séquence · choix (conflit) · synchro (rendez-vous) · exclusion mutuelle (sémaphore) · prod/conso.