Veamos una implementación sencilla de una búsqueda lineal:
var doLinearSearch = function(array) {
  for (var guess = 0; guess < array.length; guess++) {
    if (array[guess] === targetValue) { 
        return guess;  // ¡lo encontraste!
    }
  }
  return -1;  // no lo encontraste
};
Denotemos el tamaño del arreglo (array.length) con n. El número máximo de veces que el bucle for puede ejecutarse es n, y este peor caso ocurre cuando el valor que se está buscando no está presente en el arreglo. Cada vez que el bucle for itera, tiene que hacer varias cosas: comparar guess con array.length; comparar array[guess] con targetValue; posiblemente regresar el valor de guess; e incrementar guess. Cada uno de estos pequeños cálculos toma una cantidad constante de tiempo cada vez que se ejecuta. Si el bucle for itera n veces, entonces el tiempo para todas las iteraciones de n es c, start subscript, 1, end subscript, dot, n, donde c, start subscript, 1, end subscript es la suma de los tiempos para los cálculos en una iteración del bucle. Ahora, no podemos decir aquí cuál es el valor de c, start subscript, 1, end subscript, porque depende de la velocidad de la computadora, el lenguaje de programación usado, el compilador o intérprete que traduce el programa fuente a código ejecutable, y otros factores. Este código tiene un poco de encabezado extra, para configurar el bucle for (incluyendo inicializar guess igual a 0) y posiblemente regresar -1 al final. Llamemos el tiempo para este encabezado c, start subscript, 2, end subscript, que también es constante. Por lo tanto, el tiempo total para una búsqueda lineal en el peor caso es c, start subscript, 1, end subscript, dot, n, plus, c, start subscript, 2, end subscript.
Como ya lo argumentamos, el factor constante c, start subscript, 1, end subscript y el término de orden inferior c, start subscript, 2, end subscript no nos dicen nada acerca de la tasa de crecimiento del tiempo de ejecución. Lo que es significativo es que el tiempo de ejecución de una búsqueda lineal en el peor caso crece como el tamaño del arreglo n. La notación que usamos para este tiempo de ejecución es Θ(n) \Theta(n) . Esa es la letra griega "theta," y decimos "Theta grande de n" o simplemente "Theta de n".
Cuando decimos que un tiempo de ejecución particular es de Θ(n) \Theta(n) , estamos diciendo que una vez que n sea suficientemente grande, el tiempo de ejecución será por lo menos k, start subscript, 1, end subscript, dot, n y a lo más k, start subscript, 2, end subscript, dot, n para algunas constantes k, start subscript, 1, end subscript y k, start subscript, 2, end subscript. Aquí está cómo pensar acerca de Θ(n) \Theta(n) :
6n^2 vs 100n+300
Para valores pequeños de n, no nos importa cómo se compara el tiempo de ejecución con k, start subscript, 1, end subscript, dot, n o k, start subscript, 2, end subscript, dot, n. Pero una vez que n se hace suficientemente grande, sobre o a la derecha de la línea punteada, el tiempo de ejecución debe estar entre k, start subscript, 1, end subscript, dot, n y k, start subscript, 2, end subscript, dot, n. Mientra existan estas constantes k, start subscript, 1, end subscript y k, start subscript, 2, end subscript, decimos que el tiempo de ejecución es Θ(n) \Theta(n) .
No estamos restringidos a solo n en la notación Θ grande. Podemos usar cualquier función, como n, start superscript, 2, end superscript, nlgn n \lg n , o cualquier otra función de n. Aquí está cómo pensar acerca del tiempo de ejecución que es Θ(f(n)) \Theta(f(n)) para alguna función f, left parenthesis, n, right parenthesis:
6n^2 vs 100n+300
Una vez que n se hace suficientemente grande, el tiempo de ejecución está entre k, start subscript, 1, end subscript, dot, f, left parenthesis, n, right parenthesis y k, start subscript, 2, end subscript, dot, f, left parenthesis, n, right parenthesis.
En la práctica, simplemente descartamos factores constantes y términos de orden inferior. Otra ventaja de usar la notación Θ grande es que no tenemos que preocuparnos por las unidades de tiempo que estamos usando. Por ejemplo, supón que calculas que un tiempo de ejecución es de 6, n, start superscript, 2, end superscript, plus, 100, n, plus, 300 microsegundos. O tal vez sean milisegundos. Cuando usas la notación Θ grande, no lo especificas. También descartas el factor 6 y los términos de orden inferior 100, n, plus, 300, y solo dices que el tiempo de ejecución es de Θ(n2) \Theta(n^2) .
Cuando usamos la notación Θ grande, estamos diciendo que tenemos una cota asintóticamente ajustada sobre el tiempo de ejecución. "Asintóticamente" porque importa solo para valores grandes de n. "Cota ajustada" porque ajustamos el tiempo de ejecución dentro del rango de una constante hacia arriba y hacia abajo.

Este contenido es una colaboración de los profesores de Dartmouth Computer Science Thomas Cormen y Devin Balkcom, con el equipo de contenidos de computación de Khan Academy. El contenido está bajo licencia CC-BY-NC-SA.