¿Qué significa "O (1) tiempo de acceso"?

Respuestas:

161

Vas a querer leer sobre el orden de complejidad.

http://en.wikipedia.org/wiki/Big_O_notation

En resumen, O (1) significa que lleva un tiempo constante, como 14 nanosegundos, o tres minutos, sin importar la cantidad de datos en el conjunto.

O (n) significa que lleva una cantidad de tiempo lineal con el tamaño del conjunto, por lo que un conjunto dos veces mayor tomará el doble de tiempo. Probablemente no quieras poner un millón de objetos en uno de estos.

Karl
fuente
66
Para ser pedante, no significa que el tiempo de ejecución (o número de operaciones, etc.) sea constante. Significa que hay una constante tal que el tiempo de ejecución (o número de operaciones, etc.) está limitado anteriormente por la constante. Todavía podría haber una gran variación en el tiempo de ejecución: por ejemplo, int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }is O(1).
Jason
Gran idea @jason!
Chris Ruskai
35

En esencia, significa que lleva la misma cantidad de tiempo buscar un valor en su colección, ya sea que tenga una pequeña cantidad de artículos en su colección o muchos (dentro de las limitaciones de su hardware)

O (n) significaría que el tiempo que lleva buscar un artículo es proporcional al número de artículos de la colección.

Ejemplos típicos de estos son los arreglos, a los que se puede acceder directamente, independientemente de su tamaño, y las listas vinculadas, que se deben recorrer en orden desde el principio para acceder a un elemento determinado.

La otra operación generalmente discutida es insertar. Una colección puede ser O (1) para acceder pero O (n) para insertar. De hecho, una matriz tiene exactamente este comportamiento, porque para insertar un elemento en el medio, tendría que mover cada elemento a la derecha copiándolo en la siguiente ranura.

SingleNegationElimination
fuente
21

Cada respuesta que actualmente responde a esta pregunta le dice que O(1)significa tiempo constante (pase lo que pase con la medición; podría ser tiempo de ejecución, número de operaciones, etc.). Esto no es exacto.

Decir que el tiempo de ejecución es O(1)significa que hay una constante ctal que el tiempo de ejecución está limitado anteriormente c, independientemente de la entrada. Por ejemplo, devolver el primer elemento de una matriz de nenteros es O(1):

int firstElement(int *a, int n) {
    return a[0];
}

Pero esta función O(1)también es :

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

El tiempo de ejecución aquí está limitado por 1 año, pero la mayoría de las veces el tiempo de ejecución es del orden de nanosegundos.

Decir que el tiempo de ejecución es O(n)significa que hay una constante ctal que el tiempo de ejecución está limitado por arriba c * n, donde nmide el tamaño de la entrada. Por ejemplo, encontrar el número de ocurrencias de un número entero particular en una matriz de nnúmeros enteros sin clasificar mediante el siguiente algoritmo es O(n):

int count(int *a, int n, int item) {
    int c = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] == item) c++;
    }
    return c;
}

Esto se debe a que tenemos que recorrer la matriz inspeccionando cada elemento de uno en uno.

jason
fuente
19

O (1) significa que el tiempo para acceder a algo es independiente del número de elementos en la colección.

O (N) significaría que el tiempo para acceder a un artículo es proporcional al número (N) de artículos en la colección.

Rob Walker
fuente
14

O (1) no significa necesariamente "rápidamente". Significa que el tiempo que lleva es constante y no se basa en el tamaño de la entrada a la función. Constante puede ser rápido o lento. O (n) significa que el tiempo que tarda la función cambiará en proporción directa al tamaño de la entrada a la función, denotada por n. Una vez más, podría ser rápido o lento, pero será más lento a medida que aumente el tamaño de n.

Bill el lagarto
fuente
9

Se llama notación Big O y describe el tiempo de búsqueda de varios algoritmos.

O (1) significa que el peor tiempo de ejecución es constante. Para la mayoría de las situaciones, significa que en realidad no necesita buscar en la colección, puede encontrar lo que está buscando de inmediato.

alexn
fuente
Reemplace "tiempo de búsqueda" con "peor tiempo de ejecución" y estoy con usted.
Jason Punyon
2
@Seb: Creo que fue un nombre inapropiado de su parte, específicamente porque el OP le preguntó sobre el tiempo de acceso.
jkeys
6

O(1)ejecutar siempre al mismo tiempo independientemente del conjunto de datos n. Un ejemplo de O (1) sería una ArrayList accediendo a su elemento con índice.

O(n)También conocido como orden lineal, el rendimiento crecerá linealmente y en proporción directa al tamaño de los datos de entrada. Un ejemplo de O (n) sería una inserción y eliminación de ArrayList en una posición aleatoria. Como cada inserción / eliminación posterior en una posición aleatoria hará que los elementos en ArrayList se deslicen a la izquierda a la derecha de su matriz interna para mantener su estructura lineal, sin mencionar la creación de una nueva matriz y la copia de elementos de la anterior. a una nueva matriz que ocupa un tiempo de procesamiento costoso, por lo tanto, perjudica el rendimiento.

leCodera
fuente
4

La "notación Big O" es una forma de expresar la velocidad de los algoritmos. nes la cantidad de datos con los que trabaja el algoritmo. O(1)significa que, sin importar cuántos datos, se ejecutarán en tiempo constante. O(n)significa que es proporcional a la cantidad de datos.

Zifre
fuente
3

Básicamente, O (1) significa que su tiempo de cálculo es constante, mientras que O (n) significa que dependerá linealmente del tamaño de la entrada, es decir, el bucle a través de una matriz tiene O (n), solo bucle, porque depende del número de elementos, al calcular el máximo entre números ordinarios tiene O (1).

Wikipedia también podría ayudar: http://en.wikipedia.org/wiki/Computational_complexity_theory

Seb
fuente
3

La forma más fácil de diferenciar O (1) y O (n) es comparar la matriz y la lista.

Para la matriz, si tiene el valor de índice correcto, puede acceder a los datos al instante. (Si no conoce el índice y tiene que recorrer la matriz, ya no será O (1))

Para la lista, siempre debe recorrerlo si conoce el índice o no.

oso codificador
fuente
Estaba buscando un ejemplo de O (1) y solo esta respuesta tiene la explicación.
neelmeg
3

Aquí hay una analogía simple; Imagine que está descargando películas en línea, con O (1), si tarda 5 minutos en descargar una película, aún le tomará el mismo tiempo descargar 20 películas. Por lo tanto, no importa cuántas películas esté descargando, tomarán el mismo tiempo (5 minutos), ya sea una o 20 películas. Un ejemplo normal de esta analogía es cuando vas a una biblioteca de películas, ya sea que estés tomando una película o 5, simplemente las elegirás de una vez. De ahí pasar el mismo tiempo.

Sin embargo, con O (n), si toma 5 minutos descargar una película, tomará aproximadamente 50 minutos descargar 10 películas. Por lo tanto, el tiempo no es constante o de alguna manera es proporcional al número de películas que está descargando.

Ambroze kweronda
fuente
1

Significa que el tiempo de acceso es constante. Ya sea que esté accediendo desde 100 o 100,000 registros, el tiempo de recuperación será el mismo.

Por el contrario, el tiempo de acceso O (n) indicaría que el tiempo de recuperación es directamente proporcional a la cantidad de registros a los que accede.

Rob Hruska
fuente
1

Significa que el acceso lleva un tiempo constante, es decir, no depende del tamaño del conjunto de datos. O (n) significa que el acceso dependerá del tamaño del conjunto de datos linealmente.

La O también se conoce como big-O.

Dirkgently
fuente
1

Introducción a los algoritmos: segunda edición de Cormen, Leiserson, Rivest y Stein dice en la página 44 que

Como cualquier constante es un polinomio de grado 0, podemos expresar cualquier función constante como Theta (n ^ 0) o Theta (1). Sin embargo, esta última notación es un abuso menor, porque no está claro qué variable tiende al infinito. A menudo usaremos la notación Theta (1) para significar una función constante o constante con respecto a alguna variable. ... Denotamos por O (g (n)) ... el conjunto de funciones f (n) de modo que existan constantes positivas c y n0 de modo que 0 <= f (n) <= c * g (n) para todo n> = n0. ... Tenga en cuenta que f (n) = Theta (g (n)) implica f (n) = O (g (n)), ya que la notación Theta es más fuerte que la notación O.

Si un algoritmo se ejecuta en tiempo O (1), significa que asintóticamente no depende de ninguna variable, lo que significa que existe al menos una constante positiva que cuando se multiplica por uno es mayor que la complejidad asintótica (~ tiempo de ejecución) de la función para valores de n por encima de cierta cantidad. Técnicamente, es el tiempo O (n ^ 0).

P. Myer Nore
fuente
-2

O (1) significa acceso aleatorio. En cualquier memoria de acceso aleatorio, el tiempo necesario para acceder a cualquier elemento en cualquier ubicación es el mismo. Aquí el tiempo puede ser cualquier número entero, pero lo único que debe recordar es el tiempo necesario para recuperar el elemento en (n-1) la enésima o enésima ubicación será la misma (es decir, constante).

Mientras que O (n) depende del tamaño de n.

Basant
fuente
No tiene nada que ver con el acceso aleatorio - vea la respuesta aceptada publicada casi un año antes de esta respuesta para obtener más información
Krease
-3

Según mi perspectiva,

O (1) significa que el tiempo para ejecutar una operación o instrucción a la vez es uno, en el análisis de complejidad de tiempo del algoritmo para el mejor de los casos.

amarjeet
fuente
66
Esforzarse más. Esa pregunta en particular no solo necesita una perspectiva sino una definición clara.
Alfabravo