echange
qui réalise l'échange de deux éléments adjacents: l'élément d'indice $i$ et celui d'indice $i+1$. Sur une liste L=[5, 9, 17, 18, 3, 2, 14, 8, 19, 13, 10]
la fonction echange(L,4)
retourne [5, 9, 17, 18, 2, 3, 14, 8, 19, 13, 10]
.L=[5, 9, 17, 18, 3, 2, 14, 8, 19, 13, 10]
echange(L,4)
#Question 1.1
#Methode 1
def echange(L,n):
for i in range(len(L)):
if (i==n):
temp = L[i]
L[i] = L[i+1]
L[i+1] = temp
return L
L=[5, 9, 17, 18, 3, 2, 14, 8, 19, 13, 10]
echange(L,4)
#Methode 2 , plus simple
def echange2(L,x):
L[x],L[x+1] = L[x+1],L[x]
return L
L=[5, 9, 17, 18, 3, 2, 14, 8, 19, 13, 10]
echange2(L,4)
L=[6,3,4,2,5,1]
triBulle(L)
#Question 1.2
def triBulle(L):
for i in range(len(L)):
for j in range (len(L)):
if(L[i]<L[j]): #compare les i aux j et lorsque L[i]<L[j],il y a échange entre L[i] et L[j] jusqu'à avoir
temp=L[i] #comparé tous les i avec tous les j dans la liste L
L[i]=L[j]
L[j]=temp
return L
L=[6,3,4,2,5,1]
triBulle(L)
#Methode 2
def triBulle2(L):
for i in range(len(L)-1):
for j in range(len(L)-i-1):
if L[j] > L[j+1]:
echange(L,j)
return L
L=[6,3,4,2,5,1]
triBulle2(L)
#Question 1.3
import timeit
from functools import partial
import matplotlib.pyplot as plt
from random import randint
import numpy as np
#Etude éxpérimentale du tri à bulle
def listeAlea(n,max):
return [randint(1,max) for i in range(n)]
x,y=[],[]
for i in range(10,2000,100):
t=timeit.Timer(partial(triBulle,listeAlea(i,1000)))
t=t.timeit(10)
x.append(i)
y.append(t)
plt.plot(x,y)
plt.title('Etude expérimentale du tri à bulle')
#Graphiquement on observe bien que la compléxité de la fonction tri à bulle est quadratique O(n²).
#Coefficient du polynôme de degré 2:
coefs=np.polyfit(x,y,2)
fit=np.poly1d(coefs)
print(fit)
Le cours a rappelé le tri rapide, vous avez programmé le tri à bulle et Python
implémente une fonction de tri (sort
, déjà utilisée en TP). Sur un même jeu de données, comparez graphiquement la complexité de ces trois tris et essayez, pour chacun d'entre eux, de trouver une fonction d'approximation de la complexité.
#Question 2
#Courbe du tri à bulle
x1,y1=[],[]
for i in range(1,1000,10):
testTimer=timeit.Timer(partial(triBulle,listeAlea(i,1000)))
t1=testTimer.timeit(number=10)
x1.append(i)
y1.append(t1)
#Courbe du tri d'une liste aleatoire
x2,y2=[],[]
for i in range(1,1000,10):
testTimer=timeit.Timer(partial(sorted,listeAlea(i,1000)))
t2=testTimer.timeit(number=10)
x2.append(i)
y2.append(t2)
#Tri rapide d'une liste
def quicksort(L):
if L==[] : return []
else :
p=L[0]
L1 = [x for x in L[1:] if x<p]
L2 = [x for x in L[1:] if x>=p]
LT1=quicksort(L1)
LT2=quicksort(L2)
return LT1 + [p] +LT2
#Courbe du tri rapide d'une liste aléatoire
x3,y3=[],[]
for i in range(1,1000,10):
testTimer=timeit.Timer(partial(quicksort,listeAlea(i,1000)))
t3=testTimer.timeit(number=10)
x3.append(i)
y3.append(t3)
#On trace les 3 courbes
from pylab import legend
plt.plot(x1,y1,marker='*',c = "r")
plt.plot(x2,y2,marker='*',c='b')
plt.plot(x3,y3,marker='*', c = 'g')
plt.title('Etude Experimentale des trois tris')
legend(['Tri à bulle','Tri d une liste aléatoire','Tri rapide d une liste aléatoire'])
#Compléxité du Tri d'une liste aléatoire est de O(nlog(n))
#Compléxité du Tri rapide d'une liste aléatoire est de O(nlog(n))
#Compléxité du Tri à bulle d'une liste est de O(n²)
estTrie
qui renvoieTrue
si la liste fournie en entrée est triée et False
sinon.#Question 3.1
#Methode 1
def estTrie(L):
for i in range(len(L)-1): #On parcourt toute la liste (L) -1 pour eviter que L[i+1] sorte de la liste
if L[i]>L[i+1]: #lorsque un élement est supérieur à l'élement suivant --> faux sinon vrai
return False
return True
L=[1,2,3,4]
estTrie(L)
#Methode 2 plus simple
def estTrie2(L):
if L == sorted(L):
return True
return False
L=[6,3,4,2,5,1]
estTrie2(L)
#Question 3.2
def recherche_dichotomique(x,L):
a = 0
b = len(L)-1
m = (a+b)//2
while a < b :
if L[m] == x:
return m
elif L[m] > x :
b = m-1
else :
a = m+1
m = (a+b)//2
return a
def amelio(x,L):
if estTrie(L) == False:
return recherche_dichotomique(x,sorted(L))
else:
return recherche_dichotomique(x,L)
L=[1,5,3,4]
amelio(4,L)
#Dans ce cas de figure la fonction Amelio va donner la position de l'élement x dans la liste L triée préalablement.
#Question 3.3
#la recherche dichotomique réduit le tableau en 2 parties et facilite le parcour
#Mais si la liste n'est pas triée au préalable,il se peut que l'élément recherché se trouve dans les deux tableaux
#ou plus loin qu'il ne devrait etre dans une liste triée.
#Conclusion, si la liste est triée , la recherche dichotomique est bien plus efficace et rapide que si la liste n'est pas triée.
#Etude expérimentale de la recherche dichotomique sur une liste triée et non triée:
def recherche_dichotomique(x,L):
a = 0
b = len(L)-1
m = (a+b)//2
while a < b :
if L[m] == x:
return m
elif L[m] > x :
b = m-1
else :
a = m+1
m = (a+b)//2
return a
def listeAlea(n,max):
return [randint(1,max) for i in range(n)]
xavec,yavec=[],[]
L2 = []
for i in range(1,100,10):
L2.append(i)
testTimer=timeit.Timer(partial(recherche_dichotomique,i,L2))
tavec=testTimer.timeit(number=10)
xavec.append(i)
yavec.append(tavec)
xsans,ysans=[],[]
for i in range(1,100,10):
testTimer=timeit.Timer(partial(recherche_dichotomique,i,listeAlea(i,1000)))
tsans=testTimer.timeit(number=10)
xsans.append(i)
ysans.append(tsans)
plt.plot(xavec,yavec,marker='*',c = "r")
plt.plot(xsans,ysans,marker='*',c='b')
#On observe graphiquement que la recherhce dichotomique est plus coûteuse dans une liste non triée que dans une liste triée.
#Etude expérimentale de la recherche dichotomique sur une liste triée :
def recherche_dichotomique(x,L):
a = 0
b = len(L)-1
m = (a+b)//2
while a < b :
if L[m] == x:
return m
elif L[m] > x :
b = m-1
else :
a = m+1
m = (a+b)//2
return a
xavec,yavec=[],[]
L2 = []
for i in range(1,1000,10):
L2.append(i)
testTimer=timeit.Timer(partial(recherche_dichotomique,i,L2))
tavec=testTimer.timeit(number=10)
xavec.append(i)
yavec.append(tavec)
plt.plot(xavec,yavec,c = "r")
#D'apres les resultats obtenus , on peut observer graphiquement que la courbe à bien une tendance logarithmique.