La forma en que realice su análisis variará de un algoritmo a otro y qué modelo de cálculo adoptará. Por ejemplo, la técnica descrita por Priyanshu funciona mejor para los algoritmos Divide and Conquer, donde un algoritmo se describe de forma recursiva. Desea contar la cantidad de pasos realizados según el tipo de caso que esté buscando. Antes de nada, debe determinar el tamaño de entrada de su problema, por simplicidad aquí, asumiré que el tamaño de entrada se denota por [math] n [/ math]. Normalmente observamos la peor situación: estas son instancias en las que el algoritmo realiza la mayor cantidad de pasos con respecto al tamaño de entrada. Algunos algoritmos tienen situaciones específicas del peor de los casos, otros puede ser el caso de que cada instancia sea una de las peores. Identifique uno de estos casos.
Daré un ejemplo básico. La clave que desea identificar en el algoritmo es lo que a veces se denomina un buen barómetro. Un barómetro es una línea en el pseudocódigo de un algoritmo (suponiendo que lo tenga, si no es que identifica el paso del algoritmo que tiene esta propiedad) que se ejecuta con tanta frecuencia como cualquier otra línea en el pseudocódigo. Por ejemplo, en un algoritmo de ordenación basado en comparación, este es normalmente el número de intercambios.
A continuación, lo que debe hacer es formular una función que modele la cantidad de veces que se ejecuta el barómetro. Intente encontrar una forma cerrada para su función, luego determine su complejidad. Esto se hace al encontrar una función de crecimiento a la que pertenece su función en términos de decir Big-Oh o Big-Theta. Una vez que haga esto, debe hacerse dos preguntas:
- ¿Es mi análisis estricto? Es decir, ¿puedo encontrar un mejor resultado asintótico?
- Mirando mi algoritmo, ¿hay algún lugar donde pueda mejorar la complejidad del tiempo de un paso importante para mejorar su eficiencia general?
Analicemos esto usando un ejemplo simple: InsertionSort (tenga en cuenta que este pseudocódigo no es la única forma de escribir el algoritmo, pero su corrección no es importante para esta discusión, solo se trata de la complejidad del tiempo).
- ¿Hay alguna forma de probar 1 = 0 prácticamente?
- ¿Cómo se puede entender [matemáticas] x ^ r [/ matemáticas], donde [matemáticas] r [/ matemáticas] es un número racional o un número complejo?
- Me encantaría poder resolver el siguiente tipo de problemas matemáticos básicos con mayor fluidez. ¿Cómo puedo entrenar para hacer esto?
- ¿Qué pasaría si alguien descubriera un algoritmo fácil de factorizar (N = P * Q) y lo publicara en Internet para el público en general?
- ¿Es posible diseñar un algoritmo que pueda producir y probar continuamente nuevos teoremas y probar cosas con esos teoremas, dado un conjunto de axiomas? ¿Cómo sería este algoritmo?
- ¿Cuál es el tamaño de entrada? Es la longitud de la matriz, [math] n [/ math].
- ¿Cuál es el peor caso aquí? Una matriz dada en orden inverso (p. Ej., [7,6,5,4,3,2,1])
- Ahora necesitamos identificar un buen barómetro. ¿Qué línea funciona? Aquí cualquiera de 7,8,9 haría el truco (tenga en cuenta que 7 tiene que hacer una verificación adicional antes de determinar abandonar la estructura del bucle while). Vamos a elegir la línea 8.
- Observe que en la línea 6, j = i-1, y (i-1) se producen intercambios en cada iteración del bucle (línea 4). Entonces formulamos nuestra suma que cuenta el número de veces que la línea 8 ocurre como: [math] \ sum_ {i = 2} ^ {n} {(i-1)} [/ math]
- Ahora tenemos que encontrar una forma cerrada, así que simplificamos la suma anterior: [matemáticas] \ sum_ {i = 2} ^ {n} {(i-1)} = \ sum_ {i = 2} ^ {n} { i} – \ sum_ {i = 2} ^ {n} {1} = {n (n + 1) \ over 2} – 1 – (n-2 + 1) = {n ^ 2 + n – 2n \ over 2} = {n (n-1) \ over 2}. [/ Math]
- Ahora descubrimos la complejidad temporal del algoritmo usando la forma cerrada. Bueno, aquí no es demasiado difícil ver que [matemáticas] n ^ 2 [/ matemáticas] domina la fórmula de forma cerrada que derivamos. Entonces, demostremos [math] {n (n-1) \ over 2} \ en O (n ^ 2) [/ math]. Esto lo dejaré como un ejercicio para probar (puede aplicar el Teorema del límite para Big Oh, o la definición directamente).
También le animo a que también revise esta pregunta, está relacionada con la suya: ¿Cuáles son algunas formas fáciles de comprender y calcular la complejidad temporal de los algoritmos?
¡Espero que esto ayude!