Comparando a contagem de operações para diferentes complexidades
import math
def O_1(n): # Constante
return 1
def O_log_n(n): # Logarítmico
return math.log2(n) if n > 0 else 0
def O_n(n): # Linear
return n
def O_n_log_n(n): # Log-linear
return n * math.log2(n) if n > 0 else 0
def O_n2(n): # Quadrático
return n**2
def O_2_n(n): # Exponencial
return 2**n
# Vamos ver o número de operações para diferentes tamanhos de n
inputs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
print(f"{'n':<5} | {'O(log n)':<10} | {'O(n)':<10} | {'O(n log n)':<12} | {'O(n^2)':<10} | {'O(2^n)':<20}")
print("-" * 75)
for n in inputs:
print(f"{n:<5} | {O_log_n(n):<10.2f} | {O_n(n):<10} | {O_n_log_n(n):<12.2f} | {O_n2(n):<10} | {O_2_n(n):<20,}")n | O(log n) | O(n) | O(n log n) | O(n^2) | O(2^n)
---------------------------------------------------------------------------
1 | 0.00 | 1 | 0.00 | 1 | 2
2 | 1.00 | 2 | 2.00 | 4 | 4
3 | 1.58 | 3 | 4.75 | 9 | 8
4 | 2.00 | 4 | 8.00 | 16 | 16
5 | 2.32 | 5 | 11.61 | 25 | 32
6 | 2.58 | 6 | 15.51 | 36 | 64
7 | 2.81 | 7 | 19.65 | 49 | 128
8 | 3.00 | 8 | 24.00 | 64 | 256
9 | 3.17 | 9 | 28.53 | 81 | 512
10 | 3.32 | 10 | 33.22 | 100 | 1,024
11 | 3.46 | 11 | 38.05 | 121 | 2,048
12 | 3.58 | 12 | 43.02 | 144 | 4,096
13 | 3.70 | 13 | 48.11 | 169 | 8,192
14 | 3.81 | 14 | 53.30 | 196 | 16,384
15 | 3.91 | 15 | 58.60 | 225 | 32,768
16 | 4.00 | 16 | 64.00 | 256 | 65,536
17 | 4.09 | 17 | 69.49 | 289 | 131,072
18 | 4.17 | 18 | 75.06 | 324 | 262,144
19 | 4.25 | 19 | 80.71 | 361 | 524,288
20 | 4.32 | 20 | 86.44 | 400 | 1,048,576