Saltar al contenido

Cómo encontrar la complejidad temporal de un algoritmo

Solución:

Cómo encontrar la complejidad temporal de un algoritmo

Suma cuántas instrucciones de máquina ejecutará en función del tamaño de su entrada y luego simplifique la expresión al término más grande (cuando N es muy grande) y puede incluir cualquier factor constante simplificador.

Por ejemplo, veamos cómo simplificamos 2N + 2 instrucciones de la máquina para describir esto como O(N).

¿Por qué quitamos los dos? 2s ?

Estamos interesados ​​en el rendimiento del algoritmo a medida que N aumenta.

Considere los dos términos 2N y 2.

¿Cuál es la influencia relativa de estos dos términos cuando N se vuelve grande? Suponga que N es un millón.

Entonces el primer término es 2 millones y el segundo término es solo 2.

Por esta razón, descartamos todos los términos excepto los más grandes para N grande.

Entonces, ahora hemos pasado de 2N + 2 para 2N.

Tradicionalmente, solo nos interesa el rendimiento. hasta factores constantes.

Esto significa que realmente no nos importa si hay algún múltiplo constante de diferencia en el rendimiento cuando N es grande. De todos modos, la unidad de 2N no está bien definida en primer lugar. Entonces podemos multiplicar o dividir por un factor constante para llegar a la expresión más simple.

Entonces 2N se vuelve justo N.

Este es un excelente artículo: http://www.daniweb.com/software-development/computer-science/threads/13488/time-complexity-of-algorithm

La respuesta a continuación se copia desde arriba (en caso de que el excelente enlace se rompa)

La métrica más común para calcular la complejidad del tiempo es la notación Big O. Esto elimina todos los factores constantes para que el tiempo de ejecución se pueda estimar en relación con N cuando N se acerca al infinito. En general, puedes pensarlo así:

statement;

Es constante. El tiempo de ejecución de la declaración no cambiará en relación con N.

for ( i = 0; i < N; i++ )
     statement;

Es lineal. El tiempo de ejecución del bucle es directamente proporcional a N. Cuando N se duplica, también lo hace el tiempo de ejecución.

for ( i = 0; i < N; i++ ) {
  for ( j = 0; j < N; j++ )
    statement;
}

Es cuadrático. El tiempo de ejecución de los dos bucles es proporcional al cuadrado de N.Cuando N se duplica, el tiempo de ejecución aumenta en N * N.

while ( low <= high ) {
  mid = ( low + high ) / 2;
  if ( target < list[mid] )
    high = mid - 1;
  else if ( target > list[mid] )
    low = mid + 1;
  else break;
}

Es logarítmico. El tiempo de ejecución del algoritmo es proporcional al número de veces que N se puede dividir por 2. Esto se debe a que el algoritmo divide el área de trabajo a la mitad con cada iteración.

void quicksort ( int list[], int left, int right )
{
  int pivot = partition ( list, left, right );
  quicksort ( list, left, pivot - 1 );
  quicksort ( list, pivot + 1, right );
}

Es N * log (N). El tiempo de ejecución consta de N bucles (iterativos o recursivos) que son logarítmicos, por lo que el algoritmo es una combinación de lineal y logarítmico.

En general, hacer algo con cada elemento en una dimensión es lineal, hacer algo con cada elemento en dos dimensiones es cuadrático y dividir el área de trabajo por la mitad es logarítmico. Hay otras medidas de Big O, como la raíz cúbica, exponencial y cuadrada, pero no son tan comunes. La notación Big O se describe como O ( <type> ) dónde <type> es la medida. El algoritmo de clasificación rápida se describiría como O ( N * log ( N ) ).

Tenga en cuenta que nada de esto ha tenido en cuenta las mejores, medias y peores medidas de los casos. Cada uno tendría su propia notación Big O. También tenga en cuenta que esta es una explicación MUY simplista. Big O es el más común, pero también es más complejo de lo que he mostrado. También hay otras notaciones como gran omega, pequeña o y gran theta. Probablemente no los encontrará fuera de un curso de análisis de algoritmos. 😉

Tomado de aquí: Introducción a la complejidad temporal de un algoritmo

1. Introducción

En informática, la complejidad temporal de un algoritmo cuantifica la cantidad de tiempo que tarda un algoritmo en ejecutarse en función de la longitud de la cadena que representa la entrada.

2. Notación Big O

La complejidad de tiempo de un algoritmo se expresa comúnmente usando notación O grande, que excluye coeficientes y términos de orden inferior. Cuando se expresa de esta manera, se dice que la complejidad del tiempo se describe asintóticamente, es decir, cuando el tamaño de entrada llega al infinito.

Por ejemplo, si el tiempo requerido por un algoritmo en todas las entradas de tamaño n es como máximo 5n3 + 3n, la complejidad temporal asintótica es O (n3). Más sobre eso más tarde.

Algunos ejemplos más:

  • 1 = O (n)
  • n = O (n2)
  • log (n) = O (n)
  • 2 n + 1 = O (n)

3. O (1) Tiempo constante:

Se dice que un algoritmo se ejecuta en tiempo constante si requiere la misma cantidad de tiempo independientemente del tamaño de entrada.

Ejemplos:

  • matriz: acceder a cualquier elemento
  • pila de tamaño fijo: métodos push y pop
  • cola de tamaño fijo: métodos de poner en cola y sacar de cola

4. O (n) Tiempo lineal

Se dice que un algoritmo se ejecuta en tiempo lineal si su ejecución temporal es directamente proporcional al tamaño de entrada, es decir, el tiempo crece linealmente a medida que aumenta el tamaño de entrada.

Considere los siguientes ejemplos, a continuación estoy buscando linealmente un elemento, este tiene una complejidad de tiempo de O (n).

int find = 66;
var numbers = new int[] { 33, 435, 36, 37, 43, 45, 66, 656, 2232 };
for (int i = 0; i < numbers.Length - 1; i++)
{
    if(find == numbers[i])
    {
        return;
    }
}

Más ejemplos:

  • Matriz: búsqueda lineal, desplazamiento, búsqueda mínima, etc.
  • ArrayList: contiene el método
  • Cola: contiene el método

5. O (log n) Tiempo logarítmico:

Se dice que un algoritmo se ejecuta en tiempo logarítmico si su tiempo de ejecución es proporcional al logaritmo del tamaño de entrada.

Ejemplo: búsqueda binaria

Recuerde el juego de las “veinte preguntas”: la tarea consiste en adivinar el valor de un número oculto en un intervalo. Cada vez que haga una suposición, se le indicará si su suposición es demasiado alta o demasiado baja. El juego de veinte preguntas implica una estrategia que utiliza su número de conjetura para reducir a la mitad el tamaño del intervalo. Este es un ejemplo del método general de resolución de problemas conocido como búsqueda binaria.

6. O (n2) Tiempo cuadrático

Se dice que un algoritmo se ejecuta en tiempo cuadrático si su tiempo de ejecución es proporcional al cuadrado del tamaño de entrada.

Ejemplos:

  • Ordenamiento de burbuja
  • Orden de selección
  • Tipo de inserción

7. Algunos enlaces útiles

  • Conceptos erróneos de Big-O
  • Determinación de la complejidad del algoritmo
  • Hoja de trucos de Big O
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *