Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
Introducción
Al aprender programación, es muy importante comprender la eficiencia de los algoritmos. En ese contexto, siempre aparece el concepto de ** complejidad ** (Complexity). En este artículo, explicaremos detalladamente desde los fundamentos de la complejidad temporal y la complejidad espacial, hasta una explicación detallada de la notación O (notación Big O), y reflexiones profundas con ejemplos prácticos, en un volumen de aproximadamente 20.000 caracteres.
¿Qué es la complejidad?
La complejidad es un indicador para evaluar el rendimiento de un algoritmo. La complejidad se puede dividir a grandes rasgos en las siguientes dos:
- ** Complejidad temporal ** (Time Complexity)
- ** Complejidad espacial ** (Space Complexity)
1. Complejidad temporal
La complejidad temporal es un indicador que representa el “tiempo” o la “cantidad de pasos” necesarios para que un algoritmo complete su ejecución.
2. Complejidad espacial
La complejidad espacial es un indicador que representa el “espacio de memoria” necesario para que un algoritmo complete su ejecución.
¿Qué es la notación O (notación Big O)?
La notación O (Big O Notation) es una notación matemática que muestra el límite superior de la tasa de aumento de la complejidad cuando el tamaño de la entrada $n$ se vuelve suficientemente grande.
$$ O(f(n)) = \{ g(n) \mid \text{Existen constantes positivas } c, n_0 \text{ tales que para todo } n \ge n_0 \text{ se cumple } 0 \le g(n) \le c f(n) \} $$Reglas básicas de la notación O
- ** Ignorar términos constantes ** : $O(2n)$ se convierte en $O(n)$.
- ** Conservar solo el término con mayor impacto ** : $O(n^2 + n)$ se convierte en $O(n^2)$.
graph TD
A["Tamaño de entrada n"] -->|"Evaluación"| B["Notación O"]
B --> C["Complejidad temporal"]
B --> D["Complejidad espacial"]
Complejidades temporales representativas y ejemplos prácticos en Python
A partir de aquí, veamos una explicación detallada y ejemplos de código en Python sobre las clases representativas de la notación O.
1. O(1) : Tiempo constante (Constant Time)
Es un algoritmo cuyo procesamiento se completa en una cantidad de pasos siempre constante, independientemente del tamaño de la entrada $n$.
| |
2. O(log n) : Tiempo logarítmico (Logarithmic Time)
A medida que el tamaño de la entrada $n$ aumenta, el tiempo de ejecución aumenta, pero el ritmo de aumento es muy gradual. Un ejemplo representativo es la búsqueda binaria.
| |
3. O(n) : Tiempo lineal (Linear Time)
Es un algoritmo donde el tiempo de ejecución aumenta proporcionalmente al tamaño de la entrada $n$.
| |
4. O(n log n) : Tiempo cuasilineal (Linearithmic Time)
Es el producto de O(n) y O(log n). Muchos algoritmos de ordenamiento eficientes basados en comparaciones (Merge Sort, Quick Sort, Heap Sort, etc.) tienen esta complejidad.
| |
5. O(n^2) : Tiempo cuadrático (Quadratic Time)
El tiempo de ejecución aumenta proporcionalmente al cuadrado del tamaño de la entrada $n$. Corresponde a algoritmos de ordenamiento simples como Bubble Sort y Insertion Sort.
| |
6. O(2^n) : Tiempo exponencial (Exponential Time)
Cada vez que el tamaño de la entrada $n$ aumenta en 1, el tiempo de ejecución se duplica. Un ejemplo es la implementación recursiva simple de la secuencia de Fibonacci.
| |
7. O(n!) : Tiempo factorial (Factorial Time)
El tiempo de ejecución aumenta proporcionalmente al factorial del tamaño de la entrada. Un ejemplo es la búsqueda exhaustiva (fuerza bruta) del problema del agente viajero.
| |
Estructuras de datos y complejidad
| Estructura de datos | Acceso | Búsqueda | Inserción | Eliminación | Complejidad espacial |
|---|---|---|---|---|---|
| Array | $O(1)$ | $O(n)$ | $O(n)$ | $O(n)$ | $O(n)$ |
| Linked List | $O(n)$ | $O(n)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| Hash Table | - | $O(1)$ | $O(1)$ | $O(1)$ | $O(n)$ |
| BST | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(\log n)$ | $O(n)$ |
Algoritmos de ordenamiento y complejidad
| Algoritmo | Mejor caso | Caso promedio | Peor caso | Complejidad espacial |
|---|---|---|---|---|
| Bubble Sort | $O(n)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
| Merge Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n \log n)$ | $O(n)$ |
| Quick Sort | $O(n \log n)$ | $O(n \log n)$ | $O(n^2)$ | $O(\log n)$ |
