¿Cuál es la definición "correcta" de los límites superior e inferior?

19

Supongamos que es el peor tiempo de ejecución de un problema en una entrada de tamaño . Hagamos el problema un poco extraño arreglando para pero para .f(n)nf(n)=n2n=2kf(n)=nn=2k+1

  1. Entonces, ¿cuál es el límite inferior del problema? La forma en que lo entendí es solo el límite inferior de . Pero sabemos que implica que existe una constante k , n_0 tal que para todos n> n_0 , f (n)> kn ^ 2 , lo cual no es cierto. Por lo tanto, parece que solo podemos decir f (n) = \ Omega (n) . Pero generalmente, llamaremos que el problema tiene un límite inferior de \ Omega (n ^ 2) , ¿verdad?f ( n ) = Ω ( n 2 ) k n 0 n > n 0 f ( n ) > k n 2 f ( n ) = Ω ( n ) Ω ( n 2 )f(n)f(n)=Ω(n2)kn0n>n0f(n)>kn2f(n)=Ω(n)Ω(n2)

  2. Suponiendo que g(n)=Ω(n2) , lo que significa que existe una constante k , n0 tal que para todo n>n0 , g(n)>kn2 . Supongamos también que un problema tiene tiempo de ejecución g(n) . Si podemos reducir este problema para todos los primos n a otro problema (con el mismo tamaño de entrada), ¿podemos decir que el tiempo de ejecución del otro problema tiene un límite inferior de Ω(n2) ?

Wei Yu
fuente
12
Es por eso que los matemáticos usan lim sup y lim inf.
Peter Shor
1
Entonces creo que entiendo la diferencia. Creo que la gente de post entenderá a Omega como infinitamente a menudo. Pero en caso de que quiera hacer una distinción explícita, ¿hay alguna nota que pueda usar aparte de expandirla?
Wei Yu
3
@Wei Yu: lim sup y lim inf. Dices
lim supg(n)n2k
para alguna constante k si quieres decir que g(n)kn2 infinitamente seguido, y
lim infg(n)n2k
si quieres decir g(n)kn2 para todo lo suficientemente grande n .
 
Especialmente si estás hablando con matemáticos.
Peter Shor
12
@Wei: Para la mayoría de los teóricos de la complejidad (ver Lance a continuación), su función es θ (n ^ 2); para la mayoría de los algoritmos (vea Knuth o CLRS), su función es Ο (n ^ 2) y Ω (n). Ambas notaciones son casi, pero no completamente, estándar en sus subcomunidades; Para empeorar las cosas, estas dos subcomunidades se superponen en gran medida. Entonces, si importa qué notación usa, debe decir explícitamente qué notación está usando. (Afortunadamente, rara vez importa.)
Jeff el
2
@Jeffe. Creo que deberías publicar tu comentario como respuesta.
chazisop

Respuestas:

13

La definición correcta de es que existe algo de tal que para infinitamente , . La definición infinitamente frecuente de límites inferiores maneja sus problemas y es cómo la usamos en la práctica.k > 0 n f ( n ) k n 2f(n)=Ω(n2)k>0nf(n)kn2

Hice una publicación sobre esto en 2005.

Algunos libros de texto tienen esta definición correcta, otros no.

Lance Fortnow
fuente
14
Knuth no está de acuerdo con usted: portal.acm.org/citation.cfm?id=1008329
Jeffε
44
CLRS y Wikipedia también no están de acuerdo con usted. La definición infinitamente frecuente es una alternativa notable, pero parece ser menos utilizada.
Anónimo
Creo que todas estas definiciones están de acuerdo cuando el conjunto de excepciones es la medida 0.
Carter Tazio Schonwald
2
El problema con las definiciones de "infinitamente frecuente" es que no suelen excluir "infinitamente frecuente". Entonces tenemos la horrible consecuencia de que con esta definición pero también f ( n ) = o ( n + 1 ) , donde Ω y o deben ser órdenes estrictas en algún sentido. Realmente no me gusta esto. Al menos, la sugerencia de @ Carter de excepciones de la medida 0 es un poco menos horrible, mientras que permite un orden más fino que el habitual. f(n)=Ω(n2) f(n)=o(n+1)Ωo
András Salamon
2
@Jukka: No, estoy haciendo mal uso aquí. Como insinúas, tengo que corregir mi argumento para usar O en lugar de o . Por ello, permítanme reiterar la objeción real sin utilizar o o O . Con "infinitamente frecuente", uno tiene la anomalía de que n = Ω ( f ( n ) ) , f ( n ) = Ω ( n 2 ) , pero n Ω ( n 2 ) . Entonces Ω ni siquiera forma un preorden.oOooOn=Ω(f(n))f(n)=Ω(n2)nΩ(n2)Ω
András Salamon
4

Con la definición de Knuth , puede afirmar solo . Como puede observar, esto no es intuitivo y ocurre para las funciones que Vitányi y Meertens llaman "salvaje". Proponen definirf(n)Ω(n)

Ω(f(n))={gδ>0:n0>0:n>n0:g(n)δf(n)}.

(Esto es lo mismo que la definición de Lance). Con esta definición .f(n)Ω(n2)

Marcus Ritt
fuente
2

No sé cuál es el más utilizado, pero creo que sé cuál es el uso más antiguo (de todos modos, para la informática).

En el artículo de 1965 de Hartmanis & Stearns "Sobre la complejidad computacional de los algoritmos", el Corolario 2.1 es:

Si y T son funciones de tiempo tales que inf n T ( n )UTentoncesSUSTinfnT(n)U(n)0SUST

donde es la clase de complejidad de todos los problemas computables en O ( K ( n ) ) . T (n) debe obedecer a T ( n ) n / k para algún entero k y todos n y T ( n ) T ( n + 1 ) , pero no tiene que ser construible en el tiempo.SKO(K(n))T(n)n/kknT(n)T(n+1)

Su función obedece la primera regla para pero no obedece la segunda regla.k=1

El corolario 2.2 es el recíproco de lo anterior y utiliza el límite superior, pero aún tiene estos requisitos. Supongo que a medida que los algoritmos se volvieron más complejos con los años, es posible que los requisitos se hayan relajado.

chazisop
fuente
2

Creo que deberíamos distinguir entre dos cosas:

  • un límite inferior para una función
  • un límite inferior para un problema (algoritmo)

Para las funciones, cuando arreglamos un orden, la definición de lowbound / upperbound se deduce de él. Si la relación de orden es mayorización asintótica (ignorando factores constantes)

fg:c,nm>n. f(x)cg(x)

entonces la definición es la definición habitual de y Ω . Ambos se usan ampliamente en otras áreas como la combinatoria.OΩ

Pero cuando hablamos de un límite inferior para un problema (un algoritmo), lo que realmente queremos decir es que el problema requiere cierta cantidad de recursos (para ejecutar el algoritmo que resuelve el problema). A menudo, las clases de complejidad están parametrizadas por funciones como , y simplemente decimos que el problema está limitado por una función, pero esto solo funciona para funciones agradables (por ejemplo, el tiempo de ejecución del algoritmo es monótono, etc.). Lo que queremos decir en estos casos es que necesitamos n 2 tiempo de ejecución para resolver el problema, es decir, menos de n 2Time(t(n))n2n2el tiempo de ejecución no es suficiente, lo que formalmente se convierte en la definición de Lance de que el tiempo de ejecución del algoritmo no está en .o(t(n))

Kaveh
fuente