¿Por qué la complejidad del algoritmo O (logN) significa que los datos disminuyen a la mitad?

Esto está lejos de ser una prueba formal, pero, detalles … 🙂

El ejemplo más fácil es probablemente la búsqueda binaria. Una función para describir el peor de los casos:

f (n) = 1 + f (n / 2), n> 1

f (n) = 1, n = 1

para n> 1 el costo es 1 (examinar el elemento del medio), y dado que estamos viendo el peor de los casos, ese no encontrará el elemento, por lo tanto, debemos verificar en la mitad de los datos, ergeo el costo de la búsqueda binaria en el peor de los casos en un conjunto de n / 2 elementos (por lo tanto, + f (n / 2))

si solo tenemos 1 elemento, el costo es 1 (verificamos el elemento único, ya sea correcto o no).

entonces, para f (n) obtenemos: 1 + f (n / 2) = 1 + 1 + f (n / 4) = 1 + 1 + 1 + f (n / 8) +… + f (n / n ) (f (n / n) es, por supuesto, f (1) y no es necesario realizar más comprobaciones.

Por lo tanto, la recursión se realiza hasta 2 ^ k = n, en cuyo punto llegamos a la condición final, lo que da que k = log2 (n), por lo que el costo es


[matemáticas] \ sum_ {x = 1} ^ {k} 1 = k = log_2 n [/ matemáticas]

Imagine que estuviéramos haciendo una búsqueda binaria recursiva en una matriz. Comenzamos con una matriz de elementos N. Después de un solo paso, ahora tenemos N / 2 elementos. Después de otro paso, tenemos N / 4. El tiempo de ejecución total es una cuestión de cuántos pasos tomamos (dividiendo entre 2 cada vez) hasta llegar a 1.

Por ejemplo, tenemos una matriz con N = 16 elementos. Después de un paso, N = 8. Después de otro, N = 4. Luego N = 2, luego N = 1.

¿Y qué pasa si miramos esto a la inversa? ¿Cuántas veces podemos multiplicar por 2 para obtener N?

N = 1

N = 2

N = 4

N = 8

N = 16

Nos llevó 4 pasos llegar a N = 16, donde multiplicamos por 2 en cada uno.

2 ^ 4 = 16.

Ahora imagine que volvemos a nuestro problema general. ¿Cuántos pasos se necesitan para llegar a N?

2 ^ k = N

k es el número de pasos.

¿Cómo podemos obtener k?

Log (base 2) (N) = k

Es por eso que cuando usamos un algoritmo que divide algo de N entre 2 hasta que llega a 1, nuestra eficiencia es O (log N).

Un algoritmo popular con O (logn) es la búsqueda binaria. Aquí dividimos repetidamente el problema a la mitad. El número de veces que hacemos esto es el registro de pedidos (n). Es decir, ¿cuántas veces podemos dividir el problema y los subproblemas posteriores a la mitad?

2 ^ x = n
x = (log n) / (log 2)

En la notación O grande ignoramos los factores constantes (es decir, log2), por lo que decimos que se ejecuta en tiempo O (log (n)).

More Interesting

Cómo analizar la complejidad del tiempo de ejecución del algoritmo de búsqueda binaria recursiva

El año pasado, logré resolver dos problemas de ACM ICPC en las regiones. Ya que falta solo un mes para la competencia de este año, ¿puedo resolver uno o dos más este año si entreno duro hoy o no hay ninguna posibilidad?

¿Qué sitio web / tutorial / video puedo usar para comprender muy bien la programación dinámica en un día?

¿Cuál es la mejor manera de usar la notación O grande para determinar la tasa de crecimiento del tiempo de ejecución de un algoritmo?

¿Cuántas veces aparece el número 1 en una serie de números del 1 al N? Necesito una explicación lógica, no una usando la computadora.

Algoritmos: ¿Cómo encuentro un elemento en una secuencia que sea más pequeño que mi número en la secuencia, a la izquierda de mi número y a la derecha de todos esos elementos?

¿Hay alguna manera de girar a la izquierda / derecha una matriz binaria en menos de O (n) tiempo?

Si quiero resolver problemas del mundo real, ¿qué debo hacer, encontrar esos problemas y luego aprender las estructuras de datos y algoritmos requeridos o viceversa?

¿Cuál es la mejor estrategia para obtener una solución óptima para cualquier problema de codificación solicitado en la entrevista de codificación?

Cómo representar un número binario, como 110110011, en exceso de código 511

¿Por qué son tan importantes los algoritmos?

¿Cuál es el mejor enfoque para resolver el problema que CRYPTO preguntó en el concurso de codificación PRAVEGA 2014 celebrado en Codechef el 9 de noviembre?

¿Existe una justificación "rigurosa" de por qué los algoritmos de aprendizaje profundo necesitan una gran cantidad de datos?

¿Qué algoritmo usar para encontrar una ganancia l1 óptima?

¿Por qué a la mayoría de la gente le cuesta resolver problemas de algoritmos?