¿Puede una complejidad de tiempo Big-Oh contener más de una variable?

11

Digamos, por ejemplo, que estoy procesando cadenas que requieren un análisis de dos cadenas. No he dado información sobre cuáles podrían ser sus longitudes, por lo que provienen de dos familias distintas. ¿Sería aceptable llamar a la complejidad de un algoritmo u (dependiendo de si usamos un algoritmo ingenuo u optimizado)?O ( n + m )O(nm)O(n+m)

En una línea similar, supongamos que el algoritmo que elegimos realmente requiere dos etapas: una fase de configuración en la primera cadena que nos permite procesar cualquier número de otras cadenas sin incurrir en ese costo inicial. ¿Se consideraría apropiado decir que tiene una construcción seguida de cualquier número de cálculos de ?O ( m )O(n)O(m)

¿Sería apropiado simplemente llamarlos porque ambos cálculos son lineales?O(n)

corsiKa
fuente
Vea los comentarios sobre esta respuesta para ver un poco de historia: mi respeto a @corsiKa por hacer tan valientemente una pregunta tan polémica.
OldCurmudgeon
@OldCurmudgeon, ya veo. Odiaría meterme en ese hilo de comentarios. Oldcurmudgeon, ¿estás discutiendo sobre la notación big-O sin entender la notación big-O? Incómodo de hecho. Además, usted y corsiKa están discutiendo sobre el tiempo de ejecución sin definir los parámetros y m , una receta para la falta de comunicación. Sugerencia: una convención común cuando se trata de cadenas es aceptar usar m para usar la longitud de una cadena yn para la longitud de otra cadena, pero lo ideal es que sea mejor hacerlo explícito, porque de lo contrario puede causar confusión (como ilustrado aquí). nmmn
DW
@DW Es posible que OldCurmudgeon simplemente aprendiera una definición diferente en la escuela ... como señalo en un comentario a continuación, es posible evitar múltiples variables, aunque nunca he pensado en hacerlo hasta ahora. ¿Tal vez esto, o algo así, solía ser estándar?
Patrick87
2
Creo que esto tiene suficientes respuestas aquí y aquí .
Raphael

Respuestas:

14

Sí, por supuesto. Esto está bien y es perfectamente aceptable. Es común y estándar ver algoritmos cuyo tiempo de ejecución depende de dos parámetros.

Por ejemplo, a menudo verá el tiempo de ejecución de la búsqueda de profundidad primero expresada como , donde n es el número de vértices ym es el número de aristas en el gráfico. Esto es perfectamente válido. El significado de esto es que existe una constante c y números n 0 , m 0, de modo que el tiempo de ejecución del algoritmo es como máximo c ( n + m ) , para todos n > n 0 , m > m 0O(n+m)nmcn0,m0c(n+m)n>n0,m>m0. En otras palabras, si el tiempo de ejecución exacto es , decimos que f ( n , m ) = O ( n + m ) si existe c , n 0 , m 0 tal que n > n 0 y m > m 0 implica f ( n , m ) c ( n + m )f(n,m)f(n,m)=O(n+m)c,n0,m0n>n0m>m0f(n,m)c(n+m).

Sí, es perfectamente apropiado y aceptable decir que la primera etapa toma tiempo y la segunda etapa toma tiempo O ( m ) .O(n)O(m)

Importante: asegúrese de definir qué son y m . No puede decir "este es un algoritmo de tiempo O ( n ) " sin especificar qué es n . Si n no se especifica en el enunciado del problema, debe especificarlo. Por ejemplo, vea algoritmos de gráficos, donde generalmente definimos n = # de vértices ym = # de aristas.nmO(n)nnn=m=

En cuanto a si puede llamarlos tiempo , no, por supuesto que no, a menos que de alguna manera sepa que m = O ( n ) . Por supuesto, si sabe que m = O ( n ) , entonces se deduce que m + n = O ( n ) , por lo que un algoritmo de tiempo O ( m + n ) también es un algoritmo de tiempo O ( n ) . Pero si no hay garantía de que m = O (O(n)m=O(n)m=O(n)m+n=O(n)O(m+n)O(n) , entonces no puede llamarlo unalgoritmo de tiempo O ( n ) .m=O(n)O(n)

Esto es algo básico. Lo encontrarás en todos los algoritmos de los libros de texto.

DW
fuente
1
@OldCurmudgeon, lo más probable es que encuentre ejemplos de esto en muchos libros de texto de algoritmos estándar. ¿Cuáles has mirado? ¿Has intentado mirar el capítulo sobre búsqueda en profundidad (el ejemplo que mencioné en mi respuesta)?
DW
2
@OldCurmudgeon En mi edición del ejercicio CLRS 3.1-8 presenta exactamente esta definición de la notación para funciones de muchas variables. Y su límite superior en el tiempo de ejecución de dfs es O ( V + E ) para un gráfico ( V , E ) . OO(V+E)(V,E)
Kirill
2
@Kirill Mi punto fue que es concebible, en algún momento en el pasado, se consideraba habitual considerar solo la longitud total agregada, en la medida en que hacer lo contrario podría haberse considerado un error. Si calificamos el examen de un alumno y ese alumno utilizó la longitud de entrada total como la variable para la complejidad temporal de DFS, ¿consideraría un error no considerar dos dimensiones (V y E)? Lo que es verdad y lo que la gente está dispuesta a admitir no siempre es lo mismo. n
Patrick87
1
Estoy de acuerdo en que todos usan la notación Landau de esta manera, pero casi nadie sabe lo que realmente significa (a menos que conecte los parámetros funcionalmente). Vea también el artículo vinculado en la respuesta de A. Schulz aquí, que comienza afirmando que el uso "básico" y "común" es incorrecto.
Raphael
1
@ Patrick87 La teoría de la complejidad utiliza, en virtud de la definición de muchas clases conocidas, principalmente la longitud de entrada (con notables excepciones). El análisis de algoritmos , cuando se hace en serio, está interesado en aprender algo sobre el uso real de los recursos (en la medida en que el modelo lo permita) para que otros parámetros se vuelvan más interesantes como para pintar la imagen completa (con mayor precisión).
Raphael