Hay dos preguntas aquí; uno es “cómo funciona la notación big-O con valores negativos” y el segundo es específicamente sobre algoritmos.
La primera es una pregunta puramente formal. La definición en wikipedia es que [matemáticas] f (x) = O (g (x)) [/ matemáticas] si y solo si
[matemáticas] | f (x) | \ le M | g (x) | [/ math] para todos [math] x> x_0 [/ math].
- ¿Qué temas en matemáticas debo aprender para la programación competitiva?
- ¿Cuál es la diferencia entre una variable externa y una variable global en C?
- ¿Cuáles son algunos ejemplos de principios teóricos?
- ¿Qué debe incluirse en cualquier programa que use la función matemática?
- ¿La operación Bitwise es importante en Python? Estoy aprendiendo esta parte en Codecademy y no entendí totalmente. ¿Qué es Base 2 y Base 10?
Esta definición solo arroja valores absolutos alrededor de todo, por lo que las constantes negativas tienen mucho sentido en la notación O grande.
En cuanto a si tiene sentido aplicar la notación big-O negativa a los algoritmos … técnicamente, según la definición anterior, cualquier algoritmo [math] O (N ^ 3) [/ math] también es [math] O (-N ^ 3) [/mates]. Pero eso no significa que el algoritmo tome tiempo negativo ni nada. Obviamente, ningún algoritmo puede tomar tiempo negativo. *
(*) Puedo pensar en un caso extraño en el que podría tener sentido pensar en algo que toma “tiempo” negativo: estructuras de datos con tiempo de consulta amortizado. La forma en que generalmente se analizan es con una función potencial . Si una operación lleva tiempo t, y la función potencial tiene el valor [math] \ phi [/ math] antes de la operación, y [math] \ phi ‘[/ math] después de la operación, decimos que la operación tiene “costo” [ matemáticas] t + \ phi ‘- \ phi [/ matemáticas]. Es posible que ese costo a veces sea negativo (¡pero no siempre puede ser negativo! El “tiempo amortizado” del algoritmo siempre debe ser positivo).