# Pensez à évaluer cette cellule : `Shift-Entrée`
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('seaborn')
import math
Prendre un papier et un stylo, et montrer les récurrences pour $n:=2^k$ (soit $k=log_2(n)$)
$\begin{cases} C(n) = C(n-1) + 1\\ C(1) = 1 \end{cases}$
On montre par récurrence que $\forall n \geq 1, C(n)=n$ donc $C(n) = O(n)$
def C(n):
assert n >= 1
if n==1: return 1
return C(n-1)+1
print(', '.join("C({})={}".format(n, C(n)) for n in range(1, 8)))
plt.plot([C(n) for n in range(1, 10)])
Si on ne fait pas de slicing n'importe comment...
$\begin{cases} C(n) = C\left(\frac{n}{2}\right) + 1\\ C(1) = 1 \end{cases}$
On montre par récurrence que $\forall k \geq 0, C(2^k)=k+1$ donc $C(n)=O(\log_2(n))$
def C(n):
assert n >= 1
if n==1: return 1
return C(n//2)+1
print(', '.join("C({})={}".format(2**k, C(2**k)) for k in range(8)))
plt.plot([C(n) for n in range(1, 100)])
plt.plot([math.log(n, 2) for n in range(1, 100)], label=r'$n \mapsto \log_2(n)$')
plt.plot([math.log(n, 2)+1 for n in range(1, 100)], label=r'$n \mapsto \log_2(n)+1$')
plt.legend()
Un sorte de dichotomie pas très utile... où on irait chercher l'élément dans les sous-tableaux gauche et droit
$\begin{cases} C(n) = 2 \times C\left(\frac{n}{2}\right) + 1\\ C(1) = 1 \end{cases}$
On montre par récurrence que $\forall k \geq 0, C(2^k)=2^k$ donc $C(n) = O(n)$
def C(n):
assert n >= 1
if n==1: return 1
return 2*C(n//2)+1
print(', '.join("C({})={}".format(2**k, C(2**k)) for k in range(8)))
plt.plot([C(n) for n in range(1, 100)])
plt.plot([n for n in range(1, 100)], label=r'$n \mapsto n$')
plt.plot([2*n for n in range(1, 100)], label=r'$n \mapsto 2 \times n$')
plt.legend()
$\begin{cases} C(n) = 2 \times C\left(\frac{n}{2}\right) + n\\ C(1) = 1 \end{cases}$
On montre par récurrence que $\forall k \geq 0, C(2^k)=2^k \times (k+1)$ donc $C(n) = O(n.log_2(n))$
def C(n):
assert n >= 1
if n==1: return 1
return 2*C(n//2)+n
N = 1000
print(', '.join("C({})={}".format(2**k, C(2**k)) for k in range(8)))
plt.plot([C(n) for n in range(1, N)])
plt.plot([n*(math.log(n, 2)+1) for n in range(1, N)], label=r'$n \mapsto n.(\log_2(n)+1)$')
plt.plot([n*(math.log(n, 2)-1) for n in range(1, N)], label=r'$n \mapsto n.(\log_2(n)-1)$')
plt.legend()