Skip to content

Recopilatorio de algoritmos básicos, con un enlace a sus pseudo-códigos y código fuente en diferentes lenguajes.

Notifications You must be signed in to change notification settings

programacion-competitiva/Algoritmos-utiles

Repository files navigation

Algoritmos y teoremas útiles

Recopilatorio de algoritmos básicos, con un enlace a sus pseudocódigos y código fuente en diferentes lenguajes. También se incluyen algunos resultados que pueden ser útiles.

Algoritmos básicos

Algoritmo de Euclides

Encuentra el máximo común divisor entre dos números.

Pseudocódigo

Algoritmo extendido de Euclides

Encuentra el máximo común divisor junto a los coeficientes de Bézout. Es más largo de implementar, así que si no se necesitan los coeficientes es más fácil hacer el normal.

Pseudocódigo

Algoritmos de primalidad

Criba de Eratóstenes

Permite encontrar la lista de todos los primos por debajo de un natural fijo.

Pseudocódigo

Rho de Polard

Algoritmo para factorizar enteros de forma más rápida que a fuerza bruta.

Pseudocódigo

Criba cuadrática

Algoritmo para factorizar enteros, es el algoritmo más rápido para números que tengan cien dígitos o menos. Es bastante complicado de implementar.

Pseudocódigo y explicación

Algoritmos de grafos

A*

Algoritmo para encontrar un camino de coste mínimo que vaya de un nodo N_1 a otro nodo N_2 en un grafo G. Hace falta una heurística h(n) que estime cual es el coste mínimo desde n hasta el objetivo, N_2.

Pseudocódigo

Dijkstra

Igual que el A*, este algoritmo encuentra un camino de coste mínimo que vaya de un nodo N_1 a otro nodo N_2 en un grafo G, pero esta vez no hace falta una función heurística h. De hecho, este algoritmo no es más que un A* donde la heurística es la función 0.

Pseudocódigo

Kruskal

Encuentra el árbol generador minimal de un grafo G.

Pseudocódigo

Floyd-Marshall

Encuentra la longitud del camino más corto entre todos los posibles pares de vértices en un grafo G.

Pseudocódigo

Algoritmos de ordenación

Mergesort

Algoritmo de ordenación que es un ejemplo de estructura de divides y vencerás.

Pseudocódigo

Quicksort

Algoritmo de ordenación, es uno de los más eficientes en media.

Pseudocódigo

Algoritmos para juegos de suma cero

Minimax

Encuentra un movimiento para el jugador actual que maximiza su ganancia suponiendo que su oponente jugará perfecto.

Pseudocódigo

Alpha-beta pruning

Mejora del minimax. Encuentra también un movimiento para el jugador actual que maximiza la ganancia suponiendo movimientos perfectos, pero reduce el árbol de búsqueda eliminando ramas innecesarias.

Pseudocódigo

El teorema de Sprague-Grundy

Este teorema permite hacer algoritmos para obtener la jugada perfecta en juegos imparciales (a no ser que sean juegos muy específicos o que el problema esté diseñado para usar este teorema, lo usual es que un juego no sea imparcial). La idea es que este teorema relaciona cualquier juego imparcial con un juego del Nim de forma constructiva, y este tiene un algoritmo rápido para jugar de forma perfecta.

Por añadir contexto, se necesita en la mitad de problemas de la sección Game Theory de Hackerrank.

Teorema

Miscelánea

Descomposición LU

Factoriza una matriz como producto de una triangular inferior por otra triangular superior. Una vez descompuesta, permite resolver un sistema de ecuaciones lineales con esa matriz de coeficientes.

Código

Congruencia de Zeller

Fórmula que permite saber en qué día de la semana cayó una fecha solo con el mes, día y año. La pongo en la lista porque, sin esto, este tipo de ejercicios son bastante complicados. Basta con recordar que existe.

Fórmula

Algoritmo de MO

Algoritmo que resuelve M preguntas sobre intervalos de un vector de N elementos en tiempo O(N*√N). Es necesario para algunos problemas de Hackerrank.

Explicación

About

Recopilatorio de algoritmos básicos, con un enlace a sus pseudo-códigos y código fuente en diferentes lenguajes.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published