O que significa "O (1) tempo de acesso"?

126

Eu já vi esse termo "O (1) tempo de acesso" costumava significar "rapidamente", mas não entendo o que isso significa. O outro termo que eu vejo com ele no mesmo contexto é "O (n) tempo de acesso". Alguém poderia explicar de uma maneira simples o que esses termos significam?

Veja também

Comunidade
fonte
Isso pode ajudar: stackoverflow.com/questions/471199/…
Mehrdad Afshari 30/03/09

Respostas:

161

Você vai querer ler sobre Ordem da complexidade.

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

Em resumo, O (1) significa que leva um tempo constante, como 14 nanossegundos ou três minutos, independentemente da quantidade de dados no conjunto.

O (n) significa que leva uma quantidade de tempo linear com o tamanho do conjunto, portanto, um conjunto com o dobro do tamanho leva o dobro do tempo. Você provavelmente não deseja colocar um milhão de objetos em um desses.

Karl
fonte
66
Para ser pedante, isso não significa que o tempo de execução (ou número de operações etc.) seja constante. Isso significa que existe uma constante tal que o tempo de execução (ou número de operações, etc.) é delimitado acima pela constante. Ainda pode haver uma grande variação no tempo de execução: por exemplo, int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }é O(1).
jason
Grande insight @jason!
Chris Ruskai 27/02/19
35

Em essência, significa que leva a mesma quantidade de tempo para procurar um valor em sua coleção, se você possui um número pequeno de itens ou muito, muitos (dentro das restrições do seu hardware)

O (n) significaria que o tempo necessário para procurar um item é proporcional ao número de itens na coleção.

Exemplos típicos são matrizes, que podem ser acessadas diretamente, independentemente do tamanho, e listas vinculadas, que devem ser percorridas em ordem desde o início para acessar um determinado item.

A outra operação normalmente discutida é a inserção. Uma coleção pode ser O (1) para acesso, mas O (n) para inserção. De fato, uma matriz tem exatamente esse comportamento, porque para inserir um item no meio, você teria que mover cada item para a direita, copiando-o no seguinte slot.

SingleNegationElimination
fonte
21

Todas as respostas atualmente respondendo a essa pergunta informam que o O(1)tempo médio significa (o que quer que aconteça com a medição; pode ser tempo de execução, número de operações etc.). Isto não é exato.

Dizer que tempo de execução é O(1)significa que existe uma constante ctal que o tempo de execução é limitado acima por c, independentemente da entrada. Por exemplo, retornar o primeiro elemento de uma matriz de nnúmeros inteiros é O(1):

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

Mas esta função O(1)também é :

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

O tempo de execução aqui é limitado acima de 1 ano, mas na maioria das vezes o tempo de execução é da ordem de nanossegundos.

Dizer que o tempo de execução é O(n)significa que existe uma constante ctal que o tempo de execução é limitado acima por c * n, onde nmede o tamanho da entrada. Por exemplo, encontrar o número de ocorrências de um número inteiro específico em uma matriz não classificada de nnúmeros inteiros pelo seguinte algoritmo é 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;
}

Isso ocorre porque temos que percorrer a matriz inspecionando cada elemento, um de cada vez.

Jason
fonte
19

O (1) significa que o tempo para acessar algo é independente do número de itens na coleção.

O (N) significaria que o tempo para acessar um item é proporcional ao número (N) de itens na coleção.

Rob Walker
fonte
14

O (1) não significa necessariamente "rapidamente". Isso significa que o tempo necessário é constante e não se baseia no tamanho da entrada para a função. Constante pode ser rápido ou lento. O (n) significa que o tempo que a função leva mudará em proporção direta ao tamanho da entrada da função, denotada por n. Novamente, pode ser rápido ou lento, mas fica mais lento à medida que o tamanho de n aumenta.

Bill the Lizard
fonte
9

É chamado de notação Big O e descreve o tempo de pesquisa para vários algoritmos.

O (1) significa que o pior caso de tempo de execução é constante. Para a maioria das situações, isso significa que você não precisa pesquisar a coleção de verdade, você pode encontrar o que está procurando imediatamente.

alexn
fonte
Substitua "tempo de pesquisa" por "pior caso de execução" e eu estou com você.
Jason Punyon
2
@ Seeb: Eu acho que foi apenas um nome impróprio da parte dele, especificamente porque o OP perguntou sobre o tempo de acesso.
jkeys
6

O(1)sempre execute ao mesmo tempo, independentemente do conjunto de dados n. Um exemplo de O (1) seria um ArrayList acessando seu elemento com índice.

O(n)também conhecido como Ordem linear, o desempenho aumentará linearmente e em proporção direta ao tamanho dos dados de entrada. Um exemplo de O (n) seria uma inserção e exclusão de ArrayList em posição aleatória. Como cada inserção / exclusão subsequente em posição aleatória fará com que os elementos no ArrayList se desloquem para a esquerda direita do seu array interno, a fim de manter sua estrutura linear, sem mencionar a criação de um novo array e a cópia de elementos do antigo para uma nova matriz, que demanda um tempo de processamento caro, prejudicando o desempenho.

leCodera
fonte
4

"Big O notation" é uma maneira de expressar a velocidade dos algoritmos. né a quantidade de dados com que o algoritmo está trabalhando. O(1)significa que, independentemente da quantidade de dados, ele será executado em tempo constante. O(n)significa que é proporcional à quantidade de dados.

Zifre
fonte
3

Basicamente, O (1) significa que seu tempo de computação é constante, enquanto O (n) significa que dependerá linearmente do tamanho da entrada - ou seja, o loop através de uma matriz tem O (n) - apenas loop -, porque depende do número de itens, enquanto o cálculo do número máximo entre números comuns tem O (1).

A Wikipedia também pode ajudar: http://en.wikipedia.org/wiki/Computational_complexity_theory

Seb
fonte
3

A maneira mais fácil de diferenciar O (1) e O (n) é comparar matriz e lista.

Para a matriz, se você tiver o valor de índice correto, poderá acessar os dados instantaneamente. (Se você não conhece o índice e precisa percorrer a matriz, ele não será mais O (1))

Para a lista, você sempre precisa fazer um loop, conhecendo o índice ou não.

codingbear
fonte
Eu estava procurando um exemplo de O (1) e apenas esta resposta tem a explicação para ele.
31416 neelmeg
3

Aqui está uma analogia simples; Imagine que você está baixando filmes on-line, com O (1), se levar 5 minutos para baixar um filme, ainda levará o mesmo tempo para baixar 20 filmes. Portanto, não importa quantos filmes você esteja baixando, eles levarão o mesmo tempo (5 minutos), seja um ou 20 filmes. Um exemplo normal dessa analogia é que, quando você vai a uma biblioteca de filmes, esteja gravando um filme ou cinco, simplesmente os escolhe de uma só vez. Daí passar o mesmo tempo.

No entanto, com O (n), se levar 5 minutos para baixar um filme, levará cerca de 50 minutos para baixar 10 filmes. Portanto, o tempo não é constante ou é de alguma forma proporcional ao número de filmes que você está baixando.

Ambroze kweronda
fonte
1

Isso significa que o tempo de acesso é constante. Esteja você acessando de 100 ou 100.000 registros, o tempo de recuperação será o mesmo.

Por outro lado, o tempo de acesso O (n) indica que o tempo de recuperação é diretamente proporcional ao número de registros dos quais você está acessando.

Rob Hruska
fonte
1

Isso significa que o acesso leva tempo constante, ou seja, não depende do tamanho do conjunto de dados. O (n) significa que o acesso dependerá do tamanho do conjunto de dados linearmente.

O também é conhecido como big-O.

dirkgently
fonte
1

Introdução aos algoritmos: segunda edição de Cormen, Leiserson, Rivest & Stein diz na página 44 que

Como qualquer constante é um polinômio de grau 0, podemos expressar qualquer função constante como Theta (n ^ 0) ou Theta (1). Essa última notação é um abuso menor, no entanto, porque não está claro qual variável está tendendo ao infinito. Usaremos frequentemente a notação Theta (1) para significar uma função constante ou uma constante em relação a alguma variável. ... denotamos por O (g (n)) ... o conjunto de funções f (n) de forma que existam constantes positivas c e n0 de modo que 0 <= f (n) <= c * g (n) para todos n> = n0. ... Observe que f (n) = Theta (g (n)) implica f (n) = O (g (n)), uma vez que a notação Theta é mais forte que a notação O.

Se um algoritmo é executado no tempo O (1), significa que assintoticamente não depende de nenhuma variável, o que significa que existe pelo menos uma constante positiva que, quando multiplicada por uma, é maior que a complexidade assintótica (~ tempo de execução) da função para valores de n acima de uma certa quantidade. Tecnicamente, é hora O (n ^ 0).

P. Myer Nore
fonte
-2

O (1) significa acesso aleatório. Em qualquer memória de acesso aleatório, o tempo necessário para acessar qualquer elemento em qualquer local é o mesmo. Aqui, o tempo pode ser qualquer número inteiro, mas a única coisa a lembrar é que o tempo necessário para recuperar o elemento no (n-1 )ésimo ou nono local será o mesmo (ou seja, constante).

Enquanto O (n) é dependente do tamanho de n.

Basant
fonte
Não tem nada a ver com acesso aleatório - veja a resposta aceita publicado quase um ano antes de esta resposta para mais informações
Krease
-3

De acordo com minha perspectiva,

O (1) significa que o tempo para executar uma operação ou instrução por vez é um, na análise da complexidade temporal do algoritmo para melhor caso.

amarjeet
fonte
6
Tente mais. Essa questão em particular precisa não apenas de uma perspectiva, mas de uma definição clara.
Alfabravo 10/10