Creo que tengo una comprensión razonable de complejidades como , y .
En términos de una lista, es una búsqueda constante, por lo que solo está encabezando la lista. es donde recorrería toda la lista, y recorre la lista una vez para cada elemento de la lista.
¿Existe una forma intuitiva similar de comprender no sea simplemente saber que se encuentra en algún lugar entre y ?
Respuestas:
La complejidad generalmente está relacionada con la subdivisión. Cuando utilice listas como ejemplo, imagine una lista cuyos elementos están ordenados. Puede buscar en esta lista en el tiempo O ( log n ) ; en realidad, no necesita mirar cada elemento debido a la naturaleza ordenada de la lista.Θ(logn) O(logn)
Si observa el elemento en el medio de la lista y lo compara con el elemento que busca, puede decir de inmediato si se encuentra en la mitad izquierda o derecha de la matriz. Luego puede tomar esta mitad y repetir el procedimiento hasta que lo encuentre o llegar a una lista con 1 elemento que compara trivialmente.
Puede ver que la lista efectivamente reduce a la mitad cada paso. Eso significa que si obtiene una lista de longitud , los pasos máximos que necesita para llegar a la lista de un elemento son 5 . Si tiene una lista de 128 = 2 7 elementos, solo necesita 7 pasos, para una lista de 1024 = 2 10 solo necesita 10 pasos, etc.32 5 128=27 7 1024=210 10
Como puede ver, el exponente en 2 n siempre muestra el número de pasos necesarios. El logaritmo se usa para "extraer" exactamente este número de exponente, por ejemplo log 2 2 10 = 10 . También se generaliza para enumerar longitudes que no son potencias de dos largos.n 2n log2210=10
fuente
O(log n)
si la lista tiene acceso aleatorio de tiempo constante. En implementaciones de listas más típicas (listas enlazadas) esto esO(n log n)
En términos de árboles (equilibrados) (por ejemplo, árbol binario, todos los son base 2):log
fuente
Para que sea posible, debe poder reducir el tamaño del problema proporcionalmente en una cantidad arbitraria con respecto a n con una operación de tiempo constante.O(logn) n
Por ejemplo, en el caso de la búsqueda binaria, puede reducir el tamaño del problema a la mitad con cada operación de comparación.
Ahora, ¿tiene que reducir el tamaño del problema a la mitad, en realidad no? Un algoritmo es incluso si puede reducir el espacio de búsqueda del problema en un 0,0001%, siempre que el porcentaje y la operación que utiliza para reducir el tamaño del problema permanezca constante, es un algoritmo O ( log n ) , no será un algoritmo rápido, pero sigue siendo O ( log n ) con una constante muy grande. (Suponiendo que estamos hablando de log n con un log de base 2)O(logn) O(logn) O(logn) logn
fuente
Piense en el algoritmo para convertir el número decimal a binarion
Estelog(n)
while
ciclo se ejecuta veces.fuente
Sí, es de entre 1 y n , pero está más cerca de 1 que n . ¿Qué es log ( n ) ? La función de registro es la función inversa de la exponenciación. Permítanme comenzar con la exponenciación y deberían tener una mejor idea de qué es el logaritmo.log(n) 1 n 1 n log(n)
Considere dos números, y 2 100 . 2 100 es 2 multiplicado consigo mismo 100 veces. Con un poco de esfuerzo puedes contar 100 números, pero ¿puedes contar 2 100 ? Apuesto a que no puedes. ¿Por qué? 2 100 es un número tan grande que es mayor que el número de todos los átomos en el universo. Reflexiona sobre eso por un momento. Es un número tan enorme que le permite dar un nombre (número) a cada átomo. Y la cantidad de átomos en la uña de tu dedo probablemente sea del orden de miles de millones. 2 100 debería ser suficiente para cualquiera (juego de palabras :)).100 2100 2100 2 100 100 2100 2100 2100
Ahora, entre los dos números, y 2 100 , 100 es el logaritmo de 2 100 (en la base 2 ). 100 es comparativamente un número tan pequeño que 2 100 . Cualquiera debería tener 100 artículos diferentes en su hogar. Pero, 2 100 es lo suficientemente bueno para el universo. Piense en casa vs universo cuando piense en log ( n ) y n .100 2100 100 2100 2 100 2100 100 2100 log(n) n
¿De dónde vienen la exponenciación y los logaritmos? ¿Por qué les interesa tanto la informática? Puede que no lo notes, pero la exponenciación está en todas partes. ¿Pagó intereses con tarjeta de crédito? Acaba de pagar un universo por su hogar (no está tan mal, pero la curva se ajusta). Me gusta pensar que la exponenciación proviene de la regla del producto, pero otros son bienvenidos para dar más ejemplos. ¿Cuál es la regla del producto? Y responderé.
Digamos que tiene dos ciudades y B , y hay dos formas de ir entre ellas. ¿Cuál es el número de caminos entre ellos? Dos. Eso es trivial Ahora digamos, hay otra ciudad C , y puedes ir de B a C de tres maneras. ¿Cuántos caminos hay entre A y C ahora? Seis, ¿verdad? ¿Cómo conseguiste eso? ¿Los contaste? ¿O los multiplicaste? De cualquier manera, es fácil ver que ambas dan un resultado similar. Ahora, si agrega una ciudad D a la que se puede llegar desde C de cuatro maneras, ¿cuántas maneras hay entre A y D?A B C B C A C D C A D ? Cuenta si no confías en mí, pero es igual a que es 24 . Ahora, si hay diez ciudades y hay dos caminos de una ciudad a otra, y están dispuestos como si estuvieran en línea recta. ¿Cuántos caminos hay de principio a fin? Multiplíquelos si no confía en mí, pero le diré que hay 2 10 , que es 1024 . Vea que 2 10 es el resultado exponencial de 10 , y 10 es el logaritmo de 2 10 . 10 es un número pequeño en comparación con 1024 .2⋅3⋅4 24 210 1024 210 10 10 210 10 1024
La función logaritmo es n lo que nlog2(n) n n es (tenga en cuenta que 2 es la base del logaritmo). Si multiplica el registro b ( n ) consigo mismo b veces (tenga en cuenta que b es la base del logaritmo) obtendrá n . log ( n ) es tan pequeño, tan pequeño en comparación con n , que es el tamaño de su hogar donde n es el tamaño del universo.2n 2 logb(n) b b n log(n) n n
En una nota práctica, las funciones realizan funciones muy similares a las constantes. Crecen con n , pero crecen muy lentamente. Si optimizó un programa para que se ejecute en tiempo logarítmico que estaba tardando un día antes, probablemente lo ejecutará en el orden de minutos. Compruébelo usted mismo con problemas en el Proyecto Euler.log(n) n
fuente
Para continuar con su tema, es como adivinar repetidamente dónde está x en la lista y que le digan "más alto" o "más bajo" (en términos de índice).O(logn) x
Todavía se basa en el tamaño de la lista, pero solo necesita visitar una fracción de los elementos.
fuente
Si tenemos un algoritmo de divide y vencerás , y hacemos una sola llamada recursiva para un subproblema, y es el segundo caso en el teorema maestro , es decir, la complejidad temporal de la parte no recursiva es , entonces el La complejidad del algoritmo será Θ ( lg k + 1 n ) .Θ(lgkn) Θ(lgk+1n)
En otras palabras, cuando tenemos un algoritmo de divide y vencerás con una llamada recursiva a sí mismo en un problema con el tamaño un factor constante del problema actual, y el tiempo en la parte no recursiva es (constante), entonces el tiempo de ejecución del algoritmo será lg n .Θ(1) lgn
El algoritmo de búsqueda binaria es el ejemplo clásico.
fuente
La intuición es cuántas veces puede reducir a la mitad un número, digamos n, antes de que se reduzca a 1 es O (lg n).
Para visualizar, intente dibujarlo como un árbol binario y cuente el número de niveles resolviendo esta progresión geométrica.
fuente