¿Por qué la complejidad temporal del siguiente código O (logn)?

Complejidad de tiempo: O (Log (n)) donde n es el número de entrada

Tenga en cuenta que el programa anterior no considera los ceros a la izquierda. Por ejemplo, para 100 el programa imprimirá 1. Si desea imprimir 001, debe mencionar el número de dígitos para invertir. O (1) memoria adicional significa “usar como máximo alguna memoria adicional constante”. Por ejemplo, no podría almacenar una copia de la cadena, ya que eso ocuparía espacio O (n), pero podría almacenar cualquier número constante de int s, char s, etc.

En términos más generales, las declaraciones como “O (1)” u “O (n)” no necesariamente se refieren a tiempos de ejecución. La notación Big-O es una forma de describir funciones. Un algoritmo no puede ser O (n), pero su tiempo de ejecución puede ser O (n). El uso del espacio de un algoritmo también puede ser O (1), O (n),

O (enésima potencia 2), etc.

Depende de cómo defina su [matemática] n [/ matemática].

En este contexto, diría que [math] n [/ math] significa el número para el cual el algoritmo encuentra el reverso en representación decimal. Esto significa que el número tiene aproximadamente [math] log_ {10} (n) [/ math] dígitos, para cada dígito hay un número constante de operaciones, lo que lleva a [math] O (log (n)) [/ math] complejidad.

Eso sí, no es así como cualquier informático teórico, salvo algunos casos especiales, definiría [matemáticas] n [/ matemáticas]. Se define como el número de bits necesarios para representar el número. Esto significa que el tamaño de entrada es en realidad [matemática] m = log_2 (n) [/ matemática] y, por lo tanto, conduce a [matemática] O (m) [/ matemática] como la complejidad del tiempo, desde el punto de vista de la teoría de la complejidad.

Si tomamos la definición anterior de [matemática] n [/ matemática], comprobar si es primo se vuelve trivial en el tiempo polinómico. Incluso la factorización no sería difícil en el tiempo polinómico. Puedes ver por qué quería presentar la última definición.

Volvamos a lo básico:

¿Qué estamos haciendo cuando buscamos la complejidad big-O?

Estamos tratando de averiguar cuánto tiempo se ejecutará algún código dependiendo de su entrada.

Usualmente usamos la letra minúscula n para decir ‘el tamaño de la entrada’, porque el tiempo de ejecución de muchos algoritmos depende del tamaño de la entrada.

Cuando la complejidad es O (n), significa que el tiempo de ejecución del código es proporcional a la longitud de la entrada.

Ejemplo: encontrar el máximo de alguna matriz sin clasificar. En el peor, tendremos que mirar todos los números uno tras otro.

Cuando la complejidad es O (log (n)) significa que el tiempo de ejecución es proporcional al número de dígitos cuando se escribe la longitud de la entrada (log significa: encastrar los dígitos, el pequeño número que a veces aparece debajo del registro significa que base, dice si estamos contando dígitos de base 10, dígitos binarios, etc.).

Ejemplo: encontrar el máximo en una matriz ordenada de enteros. Para 1000 enteros se puede hacer en log (1000), que son 10 pasos en la base 2 usando la búsqueda dicotómica.

En el código mostrado, el tiempo de ejecución es proporcional al número de dígitos del número en la entrada. De ahora en adelante es definitivamente O (log). Que es un registro de base 10 es irrelevante para la complejidad.

Como última nota, si esto se implementa utilizando un ajuste de número normal en los registros del procesador, nunca será muy largo, en el peor de los 20 pasos, en el peor de los enteros de 64 bits.

More Interesting

En el algoritmo de Mo, ¿por qué clasificamos las consultas primero en función del número de bloque y luego (si hay un empate) en función del punto final derecho? ¿Cuál es la intuición detrás de esto?

Cómo aprender 'algoritmos' sobre los que el mundo tecnológico está hablando y aplicarlos a mi vida cotidiana

En las estructuras de datos, ¿cuál puede ser un ejemplo general utilizado para explicar el peor de los casos, los tiempos de ejecución amortizados y esperados?

Si recientemente completé un campo de entrenamiento y todo lo que queda para conseguir un trabajo es la prueba técnica, ¿cuántas horas serán suficientes los algoritmos de aprendizaje?

¿Es válido este intento recursivo de bubbleort o se puede optimizar?

¿Cuál es la complejidad temporal de las funciones incorporadas en C ++?

¿Las siguientes declaraciones de bucle en C / C ++ tienen el mismo tiempo de ejecución?

En el 8 rompecabezas, ¿por qué solo es posible alcanzar la mitad de todas las combinaciones posibles desde cualquier estado dado?

¿Qué algoritmos de programación de procesos usa Android?

¿Es la programación una superpotencia? ¿Por qué o por qué no?

Cómo comparar dos cadenas C para igualdad, usando una matriz de caracteres

¿Cuál es la diferencia entre la altura y la profundidad de un árbol?

En este algoritmo de clasificación de radix, ¿qué representa cada variable? (Java)

¿Por qué el NN recurrente agrega el paso T-1 a la entrada actual pero se concatena?

¿Qué es mejor si necesito elegir un camino para mi carrera, algoritmos y estructuras de datos, o tecnologías de big data, en las que estoy trabajando actualmente?