Algoritmos en Python
Arrays
Estructura de datos que organiza los datos secuencialmente en memoria contigua.
- O(1) lectura indexada
- O(n) inserción/eliminación aleatoria
- O(n) búsqueda
|
|
Ordenación
La ordenación es el proceso de reorganizar los datos en un array para que estén almacenados en orden ascendente o descendente. Existen muchos algoritmos de ordenación, pero la mejor complejidad es O(nlogn).
|
|
Quicksort
El algoritmo de ordenación más común, es la implementación incorporada en muchos lenguajes. Este algoritmo es muy adecuado para ordenar arrays in situ.
Esta técnica utiliza divide y vencerás para dividir el problema en subproblemas más pequeños seleccionando un pivote en el array y comparando el resto con el pivote.
- O(nlogn) - complejidad
|
|
Merge Sort
Es una técnica recursiva para ordenar un array, es muy común para la ordenación paralela porque puede repartir los datos entre muchos procesos.
Este algoritmo utiliza una técnica de divide y vencerás y funciona muy bien porque combinar arrays ya ordenados es una operación O(n).
- O(nlogn) - complejidad
|
|
Búsqueda Binaria
Este algoritmo mejora la búsqueda en listas que están ordenadas. Generalmente, buscar un valor en una lista tiene una complejidad O(n), pero si la lista ya está ordenada, esta técnica puede hacerlo en O(logn), lo cual es mucho mejor.
Esta técnica utiliza un enfoque de divide y vencerás para reducir el espacio de búsqueda saltando valores irrelevantes.
- O(logn) - complejidad
Si el elemento no se encuentra, debería estar en la posición anotada con left.
|
|
Dos punteros
Técnica para recorrer un array y encontrar un subarray, es útil en problemas donde la solución ingenua es un doble bucle. Los problemas comunes están relacionados con subarrays o intervalos, aprovechando un array ordenado.
|
|
Intervalos
Los intervalos representan rangos definidos por un punto de inicio y fin, comúnmente utilizados en problemas de programación y rangos. Un enfoque común es ordenar los intervalos por tiempos de inicio o fin para simplificar las comparaciones y reducir la complejidad temporal.
|
|
Lista Enlazada
Una Lista Enlazada es una estructura de datos que almacena elementos secuencialmente, pero con nodos dispersos aleatoriamente en memoria. Cada nodo contiene un valor y un puntero al siguiente nodo.
Las Listas Enlazadas permiten una inserción/eliminación eficiente en ambos extremos, pero no admiten acceso indexado.
|
|
La lista enlazada puede ser doblemente enlazada y almacenar también un puntero al elemento anterior.
Para iterar a través de una lista, se pueden comprobar los nodos siguientes hasta que no se pueda.
|
|
Pila y Cola
Estas son estructuras de datos enfocadas en acceder a un extremo. La Pila es una colección de tipo Último en Entrar, Primero en Salir, mientras que una Cola es una colección de tipo Primero en Entrar, Primero en Salir. Se pueden implementar fácilmente, pero Python ya tiene una implementación.
- O(1) - añadir o eliminar de los extremos
- O(n) - búsqueda y acceso indexado
|
|
Mapa de hash
El mapa de hash es una estructura de datos que almacena pares clave/valor. Los valores se pueden leer eficientemente usando la clave. Funciona haciendo un hash de la clave para almacenar valores en una tabla.
- O(1) - lectura y escritura si se proporciona la clave
- O(n) - si no se proporciona la clave
|
|
Conjunto de hash
Es un caso especial de mapa de hash en el que los valores son de tipo booleano. Esta estructura de datos se utiliza para representar conjuntos y generalmente viene con operaciones de álgebra de conjuntos eficientes.
- O(1) - leer y escribir un valor particular
- O(n) - la mayoría de las operaciones de conjuntos
|
|
Diccionario Ordenado
Los diccionarios regulares no garantizan ningún orden particular al iterar sus valores. Sin embargo, el Diccionario Ordenado es un Mapa de hash especializado que mantiene el orden de inserción, permitiendo la iteración sobre los elementos en la misma secuencia en que fueron añadidos.
Esto se logra utilizando memoria adicional para almacenar el orden de inserción, típicamente usando una lista enlazada.
|
|
Cola de Prioridad
La Cola de Prioridad, también conocida como PQ, es una estructura de datos cuyo objetivo es dar acceso a los elementos basándose en su prioridad asignada. La cola mantiene un orden de prioridad de tal manera que los elementos con la prioridad más alta (o más baja, dependiendo de la implementación) siempre se acceden primero.
Esta estructura de datos se implementa comúnmente con montículos, un tipo especial de árbol binario que asegura que el elemento de mayor prioridad sea accesible eficientemente después de operaciones de adición o eliminación.
- O(1) - leer el elemento de mayor prioridad
- O(logn) - insertar o eliminar un elemento
|
|
Mapas de bits
Estructura de datos que almacena eficientemente valores de bits en un array, los bits pueden representar valores booleanos y el array en sí puede representar conjuntos. Esta estructura de datos es menos flexible que un conjunto, pero puede ser muy eficiente en memoria y tiempo.
- O(1) - escribir y leer un valor binario
- O(1) - álgebra de conjuntos
|
|
Grafos
Estructura de datos que organiza los datos en términos de sus relaciones.
Árbol
Estructura de datos de grafo que organiza los datos en formato jerárquico y no tiene ciclos. A menudo se representa como una clase con punteros recursivos a sus hijos.
|
|
Árbol Binario
Es un caso especial de árbol donde cada nodo tiene como máximo 2 hijos. Esta estructura de datos se suele representar con hijos izquierdo y derecho.
|
|
Búsqueda en Profundidad
También conocida como DFS, es una técnica algorítmica para recorrer un grafo o árbol visitando cada camino en profundidad, luego visitando otros caminos. Es útil cuando el problema requiere una comparación de escenarios finales de cada camino.
Al recorrer un árbol, el procesamiento del valor puede ocurrir antes de visitar el resto del camino o después, esto se llama recorrido en pre-orden o recorrido en post-orden.
- O(n) - complejidad temporal
- O(h) - complejidad de memoria, donde h es la altura del árbol
- O(n) - peor caso de complejidad de memoria, si el árbol está sesgado
- O(logn) - complejidad de memoria si el árbol está equilibrado
|
|
Búsqueda en Amplitud
También llamada BFS, es una técnica para recorrer un grafo o árbol por niveles. Puede ser útil para encontrar el camino más corto desde la raíz, pero también puede ser menos eficiente en memoria para caminos largos.
- O(n) - complejidad temporal
|
|
Backtracking
Una técnica algorítmica para recorrer un array y procesar no solo el valor sino también el camino tomado hasta el valor. Esto es especialmente útil para modelar decisiones como árboles y comparar resultados, por ejemplo en juegos.
|
|
El backtracking también puede implementarse de manera recursiva, y a veces puede ser un poco más fácil pensar en este algoritmo de esta manera.
|
|