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
Respostas:
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.
fonte
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }
éO(1)
.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.
fonte
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 constantec
tal que o tempo de execução é limitado acima porc
, independentemente da entrada. Por exemplo, retornar o primeiro elemento de uma matriz den
números inteiros éO(1)
:Mas esta função
O(1)
também é :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 constantec
tal que o tempo de execução é limitado acima porc * n
, onden
mede 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 den
números inteiros pelo seguinte algoritmo éO(n)
:Isso ocorre porque temos que percorrer a matriz inspecionando cada elemento, um de cada vez.
fonte
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.
fonte
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.
fonte
É 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.
fonte
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.fonte
"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.fonte
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
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Introdução aos algoritmos: segunda edição de Cormen, Leiserson, Rivest & Stein diz na página 44 que
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).
fonte
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.
fonte
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.
fonte