La serie de Padovan es una sucesión de números naturales definida por los valores iniciales P(0)=P(1)=P(2)=1, y la relación de recurrencia para n ≥ 3: P(n) = P(n−2) + P(n−3).
n
0
1
2
3
4
5
6
7
8
9
10
11
P(n)
1
1
1
2
2
3
4
5
7
9
12
16
Pseudocódigo:
Inicializar P(0) = 1
Inicializar P(1) = 1
Inicializar P(2) = 1
Para n desde 3 hasta N hacer:
P(n) = P(n-2) + P(n-3)
Imprimir los valores P(0) a P(N)
Ejercicio: Lista enlazada — borrar nodo en posición específica
Función deleteNode(position) sobre la clase LinkedList:
Operación: Borra un nodo en la posición que se pasa por parámetro.
Coste temporal:O(N) donde N es el número de nodos a recorrer.
Código:
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def deleteNode(self, position):
if self.head is None:
return
if position == 0:
self.head = self.head.next
return self.head
index = 0
current = self.head
prev = self.head
temp = self.head
while current is not None:
if index == position:
temp = current.next
break
prev = current
current = current.next
index += 1
prev.next = temp
return prev
Ejercicio: Fibonacci recursivo optimizado
Algoritmo recursivo con coste O(N) (más eficiente que el recursivo básico, menos que el de matrices O(log n)).
def fibonacci(n, second_last, last):
if n - 1 == 0:
return second_last
else:
new_last = second_last + last
second_last = last
return fibonacci(n - 1, second_last, new_last)
print(fibonacci(21, 0, 1)) # 6765
Implementación del algoritmo de búsqueda binaria mediante un proceso iterativo.
La función busca un elemento en una lista ordenada dividiéndola repetidamente en mitades. Comienza calculando el punto medio y comparando su valor con el elemento buscado. Si coincide, devuelve su índice; si es menor, ignora la mitad izquierda; si es mayor, ignora la derecha. Se repite hasta encontrar el elemento o hasta que no queden elementos.
def binarySearch(arr, l, r, x):
while l <= r:
mid = l + (r - l) // 2
if arr[mid] == x:
return mid
elif arr[mid] < x:
l = mid + 1
else:
r = mid - 1
return -1
arr = [2, 3, 4, 10, 40]
x = 10
result = binarySearch(arr, 0, len(arr)-1, x)
Bloques: contienen lista de transacciones, puntero hash al bloque anterior, timestamp y nonce. Crean una cadena inmutable.
Árbol de Merkle: organiza las transacciones para verificar eficientemente la existencia de una transacción sin revisar toda la cadena.
Tabla Hash: almacena direcciones y claves para búsqueda rápida de saldos y transacciones.
Algoritmos clave
SHA-256: genera hashes únicos para bloques y transacciones.
Prueba de Trabajo (PoW): resuelve un problema criptográfico para añadir bloques.
Distribución P2P: cada nodo mantiene una copia de la blockchain; consenso via PoW.
Implicaciones de P vs NP
La seguridad de la blockchain se basa en que resolver problemas criptográficos es mucho más difícil que verificar su solución. Si P = NP, esta seguridad podría verse comprometida.
Proyecto: Votaciones descentralizadas
Blockchain aplicado a votaciones: los votos se registran como transacciones en bloques (inmutabilidad), un árbol de Merkle verifica validez, y la cadena pública permite auditoría en tiempo real.