2011-04-01 20 views
12

Necesito implementar y probar un algoritmo con una complejidad 2^n. He estado tratando de encontrar uno por un tiempo. Si hay alguna manera de lograr esto mediante la implementación, con una complejidad exacta de 2^n sería óptimo. Si alguien sabe de una ubicación, puedo encontrar un ejemplo o podría ayudarme a implementar una, sería genial :-). La operación básica puede ser cualquier cosa, pero una sola declaración como i ++; sería lo mejor2^n algoritmo de complejidad

+12

_ "complejidad de 2^n sería óptimo" LOL _ – wilhelmtell

+2

Una vez trabajé con un sistema que había logging implementado de una manera que hizo que todo el sistema opere en O (n^n). Me dijeron que era lo suficientemente bueno, que el registro no podía afectar a una aplicación "solo está registrando", pero calculé que para procesar el conjunto de datos para el cliente en el que me pidieron trabajar necesitaría aproximadamente 6.4 billones de años en el hardware I tenido. Acabo de escribir un generador de scripts SQL y terminé en unas pocas horas, también me metí en una mierda por no usar el conjunto de herramientas oficial de la compañía. ¡Haaa buenos recuerdos! – Newtopian

+0

Quizás fue n !, no recuerdo exactamente – Newtopian

Respuesta

22

Genera todos los subconjuntos de un conjunto con n elementos.

Agregado. La manera más simple de generar todos los subconjuntos de S = {a0, a1, ..., an-1} es probablemente traducir entre la representación binaria del rango y el subconjunto.

Tome S = {a0, a1, a2}.

rank binary subset 
0 000 {} 
1 001 {a0} 
2 010 {a1} 
3 011 {a0, a1} 
4 100 {a2} 
5 101 {a0, a2} 
6 110 {a1, a2} 
7 111 {a0, a1, a2} 

Entonces, un 1 en el binario significa que el elemento correspondiente está en el subconjunto. A 0 significa que el elemento no está en el subconjunto.

Pero también debe buscar el código Gray.

+0

Gracias :-) Eso es perfecto, ¿sabes dónde puedo encontrar una muestra? implementación de esto? – rubixibuc

+0

o cómo puedo simplemente implementar la estructura de controles y simplemente hacer i ++ para la instrucción. – rubixibuc

+2

Solo te votaré de arriba abajo para ver bailar a los unicornios. – Anycorn

7

El cálculo del número de Fibonacci recursivo clásico es O (2^n).

unsigned Fib(unsigned n) 
{ 
    if (n <= 1) 
     return n; 
    else 
     return Fib(n - 1) + Fib(n - 2); 
} 

Dado lo anterior es en realidad theta (Phi^n), que estoy añadiendo un theta (2^n) algoritmo que volver 2^n. Gracias a Jeremiah Willcock.

unsigned TwoExp(unsigned n) 
{ 
    if (n == 0) 
     return 1; 
    else 
     return TwoExp(n - 1) + TwoExp(n - 1); 
} 
+1

¿No es solo O (Fib (n)), que es solo aproximadamente 1.6^n? Si reemplazó 'Fib (n - 2)' por 'Fib (n - 1)' en la parte inferior, sin embargo, se convertiría en 2^n. –

+1

@Jeremiah, sí, técnicamente este algoritmo es theta (Phi^n), que está en O (2^n). (Phi = (5^(1/2) + 1)/2, aproximadamente 1.61. – ThomasMcLeod

1

Aquí hay una: muestra los dígitos de 2^(2^n).

1

Pasé una gran cantidad de tiempo reconsiderando el problema y me gustaría publicar una solución que se me ocurrió. Todas las respuestas contribuyeron a mi capacidad para llegar a esta solución, y estoy muy agradecido por todos los que respondieron. :-) Me doy cuenta de que el algoritmo no hace prácticamente nada.

está escrito en Java
parece que no puede conseguir las pestañas para trabajar
funcionamiento básico es i ++;

public class TwoToTheN 
{ 
    private static int twoToTheN = 0; 
    private static int power = 3; 

    public static void main(String[] args) 
    { 
     twoToTheN(power); 
     System.out.println(twoToTheN); 
    } 

    private static void twoToTheN(int n) 
    { 
     if(n == 0) 
     { 
      twoToTheN++; 
      return; 
     } 
     else if(n == 1) 
     { 
      twoToTheN++; 
      twoToTheN++; 
      return; 
     } 
     twoToTheN(n-1); 
     twoToTheN(n-1); 
    } 
} 
Cuestiones relacionadas