Révisions Algorithmique et réseaux¶
1ère partie : Complexité
Répondez aux questions ci-dessous¶
Logarithmique
1. Indiquez les complexités de référence qui sont du même ordre de grandeur que l'expression mathématique indiquée
Exemple : 3 $n^{2}$ + 5n - 2 = O($n^{2}$) – complexité quadratique.
- $\frac{1}{3}n^{2} + 5n^{3} +2$
- $\frac{1}{3}n^{2} + \frac{1}{3}n^{4} +2$
- $2 + 3n log_{2}(n)$
- $nlog_{2}(n) + 2^{n} + 7n^{3}$
- $n! + 8n + 9n^{2}$
- $O(n^3)$
- $O(n^4)$
- $O(log(n))$
- $O(2^n)$
- $(O(n!))$
2. On décide d'effectuer une recherche d'une valeur dans un tableau trié contenant 42000 valeurs.
On procède par dichotomie.
Indiquer le nombre maximal d'itérations de l'algorithme pour une telle recherche.
valeur = 42000
compteur = 0
while valeur > 1:
valeur = valeur/2
compteur +=1
print(compteur)
16
Considérer les algorithmes suivants avec un temps d’exécution T(n) pour une longueur de données n.
Déterminer leurs complexités asymptotiques respectives.
Algorithme A1 : T(n) = 3n + 2
Algorithme A2 : T(n) = 6
Algorithme A3 : T(n) = 4n**2 + n + 2
Algorithme A4
Exécuter A1;
Exécuter A2;
Exécuter A3;
Algorithme A5
i = 1
TANT QUE i <= n FAIRE
Exécuter A3;
i = i + 1
FIN TANT QUE
Exécuter A1;
Algorithme A6
i = 1
TANT QUE i <= 5 FAIRE
Exécuter A1;
i = i + 1
FIN TANT QUE
Considérer les deux algorithmes A1 et A2 avec leurs temps d’exécution respectifs T1(n) = $9n^2$ et T2(n) = $100n + 96$ .
Déterminer la complexité asymptotique des deux algorithmes dans la notation Grand-O. Quel algorithme à la meilleure complexité asymptotique?
Calculer les temps maximales d’exécution des deux algorithmes Ti(n) pour n = 1, n = 3, n = 5, n = 10, n = 14.
Exécuter le code ci-dessous, il permet de tracer les graphes des deux fonctions Ti dans un même système de coordonnée (abscisse n, ordonnée Ti(n)).
Pour quelles longueur de données n, quel algorithme est le plus efficace ? Justifier votre réponse graphiquement et mathématiquement.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 20, 500)
y1 = 9*x**2
y2 = 100*x + 96
plt.plot(x, y1, label = "T1")
plt.plot(x, y2, label = "T2")
plt.legend()
plt.show()
Dans cet exercice, vous allez vous même élaborer un algorithme de tri !
- Initialiser une liste avec 10 valeurs aléatoires entre 1 et 10.
- Ecrire un algorithme qui identifie l’index de l’élément possédant la plus petite valeur dans la liste, et stocker le dans la variable
pluspetitindex
. - Echangez les deux éléments de la liste : le premier élément
liste[0]
et l’élément à la positionpluspetitindex
. - Tester votre algorithme
- Imbriquez votre algorithme dans une boucle pour que vous triez toute la liste par ordre croissant !
- Chronométrer de nouveau le temps d’exécution pour une saisie de valeur pour n=10, n=100, n=1000, n=5000.
- Quelle est la complexité de cet algorithme ? Justifiez-la avec les valeurs de temps d'exécution mesurées.
from random import randint,shuffle
from time import perf_counter
import numpy as np
import matplotlib.pyplot as plt
# votre code ci-dessous
## echange de la plus petite valeur avec le 1er élément de la liste
liste = [randint(1,10) for _ in range(10)]
print (liste)
n=len(liste)
pluspetitindex = 0
pluspetitevaleur = liste[0]
i = 0
while i < n :
if liste[i] <= pluspetitevaleur:
pluspetitindex = i
pluspetitevaleur = liste[i]
i = i + 1
liste[0],liste[pluspetitindex]=liste[pluspetitindex],liste[0]
print (liste)
### tri de la liste dans l'ordre croissant
liste = [randint(1,10) for _ in range(10)]
k=0
n=len(liste)
while k < n:
pluspetitindex = k
pluspetitevaleur = liste[k]
i = k
while i < n :
if liste[i] <= pluspetitevaleur:
pluspetitindex = i
pluspetitevaleur = liste[i]
i = i + 1
liste[k],liste[pluspetitindex]=liste[pluspetitindex],liste[k]
k += 1
print(liste)
## mesure des temps d'éxécution question 6
# on place dans une fonction l'algo précédent
def tri(liste):
k=0
n=len(liste)
while k<n:
pluspetitindex = k
pluspetitevaleur = liste[k]
i = k
while i < n :
if liste[i] <= pluspetitevaleur:
pluspetitindex = i
pluspetitevaleur = liste[i]
i = i + 1
liste[k],liste[pluspetitindex]=liste[pluspetitindex],liste[k]
k+=1
return liste
tableauValeurs=[]
mesure=[10,100,1000,5000, 10000]
for n in mesure:
liste = [randint(1,10) for _ in range(n)]
debut=perf_counter()
tri(liste)
fin=perf_counter()
temps=fin-debut
tableauValeurs.append(temps)
print(tableauValeurs)
print()
plt.plot(mesure, tableauValeurs)
plt.show()
# 7. complexité en O(n**2)
[7, 2, 6, 7, 3, 10, 5, 3, 7, 5] [2, 7, 6, 7, 3, 10, 5, 3, 7, 5] [4, 4, 4, 4, 5, 7, 7, 9, 10, 10] [1.3600000016822378e-05, 0.0004639999999938027, 0.05185009999999579, 1.1816279999999892, 4.451445400000011]
2ème partie : Algorithmes à connaitre
Algorithme de recherche dichotomique¶
Déroulez cet algorithme à la main en utilisant le tableau
t=[1,3,4,6,7,8,10,13,14]
, on cherche l'élément 4Codez cet algorithme en python
Vous pouvez utiliser la fonction sort() de python pour générer un tableau trié de n éléments tous différents.
Ajouter un compteur pour comptabiliser le nombre de fois que le tableau est coupé en deux.
Quel est le pire cas ?
Comptabilisez le nombre de fois que le tableau est coupé en deux pour le pire cas.
Essayez avec des tableaux de plus en plus grands. Que constatez-vous ?Ecrivez un algorithme de
recherche simple
qui parcourt le tableau et s’arrête lorsqu’il a trouvé la bonne valeur. Comparez ces deux algorithmes de recherche lorsque vous doublez la taille du tableau. (mesurer les temps d’exécution)
# votre code pour les questions 2 et 3
## recherche dichotomique
def rechercheSimple(t,val):
trouve=False
i=0
while i<len(t) and trouve==False:
if t[i]==val:
trouve=True
i=i+1
return trouve,i
#print(rechercheSimple([3,8,6,12],3))
def rechercheDichotomique(t,val):
deb=0
fin=len(t)-1
trouve=False
compteur=0
while trouve!=True and deb<=fin:
compteur=compteur+1
mil=(deb+fin)//2
if t[mil]==val:
trouve=True
elif val>t[mil]:
deb=mil+1
else:
fin=mil-1
return trouve,compteur
#création d'un tableau contenant 10000 valeurs aléatoires différentes puis triées
# si on double la taille 20000 regardez ce qu'il se passe.
tableau=[randint(1,10000) for _ in range(10000)]
tableau.sort()
#print(tableau)
debut=perf_counter()
print(rechercheSimple(tableau,500))
fin=perf_counter()
print(fin-debut)
debut=perf_counter()
print(rechercheDichotomique(tableau,500))
fin=perf_counter()
print(fin-debut)
(True, 504) 0.0004281999999875552 (True, 12) 7.429999999430947e-05
Algorithme glouton¶
Définition d'un algorithme utilisant une stratégie gloutonne : faire à chaque étape un choix localement optimal dans le but d'obtenir à la fin un résultat globalement optimal.
Supposons que vous deviez rendre la monnaie à quelqu'un. Vous disposez de l'ensemble des pièces et billets existants dans la zone euro et en quantité infini . Vous choisissez une stratégie gloutonne : des choix locaux optimaux, étape après étape, devraient produire un résultat global optimal.
A partir de la méthode gloutonne décrite ci-dessus, écrivez l'algorithme correspondant en python.
# votre code ci-dessous
def RenduMonnaie(s):
valeur=[10000,5000,2000,1000,500,200,100,50,20,10,5,2,1]
resultat=[]
s=s*100 # on multiplie par 100 pour avoir la valeur en cent euro
for val in valeur:
if val<=s: #quand on trouve une valeur < au chiffre
n=s//val # calcul le nombre de pièce ou billet de la valeur correspondante
s=s-(val*n) # calcul la somme restante
if val>=100: # pour afficher valeur >100 en euro et pas en cents
val=val/100
resultat.append([n,val]) # place le résultat dans resultat
compteur=0
for i in range(0,len(resultat)):
compteur=compteur+resultat[i][0]
return compteur,resultat
somme=float(input("indiquer la somme à rendre en euros : "))
print(RenduMonnaie(somme))
indiquer la somme à rendre en euros : 253 (5.0, [[2.0, 100.0], [1.0, 50.0], [1.0, 2.0], [1.0, 1.0]])
3ème partie : Réseaux
Révision de base structure des adresses IP.
Les adresses IP sont de la forme : "a.b.c.d", avec a, b, c et d compris entre 0 et 255 (a, b, c et d sont codés sur 1 octet).
Exemple d'adresse IP: 192.168.0.1
- Réseau de classe A : adresse réseau : a.0.0.0 (avec a qui doit être compris entre 1 et 126)
- Réseau de classe B : adresse réseau : a.b.0.0 (avec a qui doit être compris entre 128 et 191)
- Réseau de classe C : adresse réseau : a.b.c.0 (avec a qui doit être compris entre 192 et 223)
Une partie de l’adresse IP permet d’identifier le réseau auquel appartient la machine et l’autre partie de l’adresse IP permet d’identifier la machine sur ce réseau.
Pour différencier la partie de l’adresse IP qui représente le réseau de celle qui représente la machine, il faut utiliser un masque de sous réseau
Ce masque consiste en une adresse dont la représentation binaire est de la forme : 1……1 0…….0, c'est-à-dire une suite de 1 suivi d'une suite de 0.
Par exemple un masque valide est 255.255.248.0
binaire 1111 1111 . 1111 1111 . 1111 1000 . 0000 0000
décimal 255 . 255 . 248 . 0
Ce masque permet de "découper" une adresse IP en deux parties. La partie "réseau" (ici les 21 bits de poids forts à 1) et la partie "machine" (les 11 bits de poids faibles à 0).
Ce masque permet donc d'avoir, sur le même réseau, $2^{11}$ adresses distinctes.
Exemple :
192.168.129.10
& 255.255.248. 0
---------------
192.168.128. 0
Retenons que faire le "et" bit à bit produit les résultats suivants : 1 & 1 = 1 ; 1 & 0 = 0 de même que 0 & 1 = 0
L’adresse réseau est donc 192.168.128.0
On peut placer dans ce réseau $2^{11}$ machines depuis l’adresse 192.168.128.0 à 192.168.135.255.
En effet, on peut aller jusqu’à 255 pour le dernier octet (que des 0 dans le masque soit 1111 1111 = 255), dans l’octet précédent, il y a 3 zéros de disponibles soit 111 = 7, donc on peut aller jusqu’à 135 (128+7).
Attention la 1ère adresse est l’adresse du réseau, ce n’est donc pas une adresse machine, la 1ère adresse est donc 192.168.128.1. La dernière adresse est l’adresse de broadcast, elle ne peut pas être attribuée à une machine, la dernière adresse machine est donc 192.168.135.254.
Soit l’adresse IP 192.168.10.0 qui utilise le masque de sous-réseau suivant : 255.255.240.0.
Vous devez justifier l’ensemble de vos réponses.
- Quelle est l’adresse du réseau ?
- Indiquez la 1ère adresse et la dernière adresse possibles pour une machine dans ce réseau.
- Combien de machines hôtes peut-on placer dans ce réseau ?
- Quel est le type de ce réseau ?