2010-03-05 22 views
63

¿Qué es O(log* N)?¿Qué es O (log * N)?

Sé grande-Oh, el log* es desconocido.

+0

Dinos dónde lo encontraste –

+0

Pregunta similar: http://stackoverflow.com/questions/2307283/what-does-olog-n-mean-exactly No hay respuesta en 'O (log * N)' desafortunadamente. – BalusC

+1

¿Esta pregunta es sobre el * registro posterior o sobre la notación O() en general? –

Respuesta

73

O(log* N) es "iterated logarithm":

En informática, el logaritmo iterado de n, registro escrito * n (por lo general leer 'estrella de registro'), es el número de veces que la función logaritmo debe ser iterativa aplicado antes de que el resultado es menor que o igual a 1.

+8

Eso es algo realmente interesante de lo que no había oído hablar. Q + A +1 cada uno.Supongo que O (log * N) es para-todos-los-propósitos-y-propósitos O (1). Guay. – Greg

+0

@greg, no log (n) significa que a medida que el número de elementos sube el tiempo más lentamente. p.ej. 10x tantos elementos solo hacen que la función tome 2 veces más tiempo –

+2

Creo que lo encontré por primera vez en el análisis del algoritmo Union-Find, cuando era 'O (N log * N)' antes de que se mejorara a 'O (AN) ', donde A es la función inversa de Ackermann. Todavía no entiendo la última prueba, pero el algoritmo 'O (N log * N)' es una lectura relativamente buena. – Larry

7

registro * (n) - "log estrella n" como conoce como "logaritmo iterado"

En palabras simples, puede suponer log * (n) = log (log (log (..... (log * (n))))

log * (n) es muy potente.

Ejemplo:

1) Log * (n) = 5 donde n = Número de átomo en el universo

2) árbol colorear usando 3 colores se puede hacer de registro * (n) mientras que colorear los colores del Árbol 2 es suficiente, pero la complejidad será O (n).

3) Encontrar la triangulación de Delaunay de un conjunto de puntos conociendo el árbol de expansión mínimo euclidiano: tiempo O (n log * n) aleatorio.

12

El bit log* N es un algoritmo iterado que crece muy lentamente, mucho más lento que solo log N. Básicamente, simplemente mantiene 'registrando' iterativamente la respuesta hasta que está por debajo de uno (por ejemplo, log(log(log(...log(N)))), y la cantidad de veces que tuvo que responder a log() es la respuesta.

De todos modos, esta es una cuestión de edad de cinco años en Stackoverflow, pero ningún código Vamos a arreglar eso - aquí está implementaciones tanto para las funciones recursivas e iterativas (ambos dan el mismo resultado)? (!):

public double iteratedLogRecursive(double n, double b) 
{ 
    if (n > 1.0) { 
     return 1.0 + iteratedLogRecursive(Math.Log(n, b),b); 
    } 
    else return 0; 
} 

public int iteratedLogIterative(double n, double b) 
{ 
    int count=0; 
    while (n >= 1) { 
     n = Math.Log(n,b); 
     count++; 
    } 
    return count; 
} 
+1

¿Cómo responde esto la pregunta? – Maroun

+2

@MarounMaroun: He editado el comienzo de la respuesta para dar más contexto. El código es la descripción/definición que estaba pidiendo. –

Cuestiones relacionadas