Tengo un algoritmo de conteo para el cual estoy tratando de obtener una descripción general de gran. Está horriblemente anidado y terriblemente exponencial. Aquí está:Simplificando la Complejidad Big-O de este Algoritmo Exponencial
1. For each T_i in T
2. For k = 1 to max_k
3. For each of 2^k*(n choose k) items
4. For each t in T_i
5. check if the item is in t...etc.
aquí es una idea, línea por línea de cada tiempo de funcionamiento
- Se trata de una partición simple y voy a darle un solo c1 constante.
- max_k es un número pequeño, siempre menor que n, tal vez alrededor de 4 o 5. Utilizaré k a continuación.
- Este bucle siempre ejecuta 2^k * (n elige k) veces
- Al considerar constante la línea 1, podemos generalizar esta línea y saber que nunca disparará más de 2^n veces en total en el peor de los casos, pero generalmente se ejecutará una fracción de 2^n veces, así que llamaremos a esto (2^n)/c2
- Esta es la operación simple de instrucción if dentro de todos estos bucles, por lo que c3.
Multiplicando todos estos juntos da:
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
Ya que quiero una representación grande-O, haciendo caso omiso de las constantes da:
k * 2^k * (n choose k) * (2^n)
Se sabe que (n elegir k) está delimitada arriba por (n * e/k)^k, entonces:
O(k * 2^k * (n * e/k)^k * (2^n))
Mi questi es, lo que puedo ignorar aquí ... 2^n es sin duda el término dominante, ya que n siempre es más grande que k, y típicamente mucho más. ¿Puede esto simplificarse a O (2^n)? O O (2^terrible)? ¿O debería dejar en el 2^k, como en O (2^k * 2^n)? (o deje todos los términos en?)
Tengo entendido que si k o max_k pueden competir o superar n, entonces son vitales. Pero dado que siempre están dominados, ¿pueden descartarse como términos de orden inferior de tiempos de ejecución polinómica? Supongo que todo el lío de tiempo de ejecución exponencial me está confundiendo. Cualquier consejo es muy apreciado.
+1 Respuesta fuerte ... – MoonKnight
Si es verdad que n siempre es mayor que k, ¿es suficiente para delimitar k y eliminarlo? Creo que eso es lo que dices, pero quiero estar seguro. Su ejemplo n * lg (k) es bastante claro, gracias por eso. –
@Chucktown: 'Si es verdad que n siempre es mayor que k, ¿es suficiente para delimitar k y eliminarlo así?' No. Cuando decimos 'k es acotado' queremos decir que hay * CONSTANTE * 'c' tal que 'k
amit