A notação Big O é uma média sem unidade de medição da variação de desempenho, portanto impenetrável aos custos relativos das primitivas computacionais.
Em poucas palavras: a
notação Big O é um tipo de medição relativo, sem unidade (em oposição à medição absoluta). Ele só pode medir a variação de desempenho, não o desempenho absoluto, para o qual as constantes são muito importantes. A vantagem é que isso a torna amplamente independente da implementação, permitindo análises mais simples que podem ignorar os custos relativos das operações elementares, desde que esses custos tenham limites superiores e inferiores fixos positivos. Mas a consequência é que fatores constantes não têm sentido . Mesmo assim, mesmo para a finalidade pretendida, a análise de complexidade assintótica pode ser questionada por outros motivos e deve ser considerada com cuidado. Por exemplo, o tamanho da entrada bruta pode não ser o parâmetro correto a ser considerado.
Uma primeira observação é que sua pergunta não está exatamente precisa. Quando você negligencia a constante em 3 n , há de fato uma "alteração de três vezes", mas ambas variam na mesma taxa e você não pode afirmar que "[uma] coisa está variando 3 vezes mais rapidamente que a outra".33n
Uma boa razão para ignorar a constante na notação Landau é que não temos nenhuma unidade em que possamos confiar. Quando alguém afirma que A vive duas vezes mais longe de você do que B, isso tem significado independentemente de qualquer unidade. Podemos concordar com isso, mesmo que você meça distâncias em polegadas enquanto eu faço isso em anos-luz. Porém, a medição da distância absoluta requer a especificação de unidades, e sua formulação numérica depende da unidade escolhida.
O tempo real gasto por um algoritmo depende do tempo de execução das operações elementares, que depende muito da máquina. Você pode contar o número de operações elementares, mas não há razão para acreditar que todas elas levam o mesmo tempo, e sempre é possível compor várias operações em uma única ou decompor uma operação em operações menores, de modo que o número operações não é realmente significativo, a menos que você concorde com uma máquina virtual de referência. Ser independente de referência é uma vantagem.
Outra visão da vantagem da abordagem é que tudo o que você importa na análise é contar o número de operações elementares, desde que o custo tenha um limite superior e um limite inferior positivo. Você não precisa se preocupar com o custo individual.
No entanto, o preço a pagar por essa vantagem é que a avaliação dos custos de computação é fornecida com unidade não especificada, e o tempo de computação, por exemplo, pode ser nanossegundos ou milênios - nem tentamos saber. Em outras palavras, os fatores constantes não têm sentido, uma vez que a mudança de unidades é inseparável da mudança do fator constante e nenhuma unidade de referência é usada.
Conforme observado por Patrick87 , isso é suficiente para entender como um algoritmo é escalonado em relação ao tamanho da entrada, mas não fornece uma medida absoluta de desempenho, além de depender de uma unidade de referência. A desinstalação de uma máquina abstrata de referência comum pode ser feita quando se deseja comparar o desempenho de algoritmos distintos, mas é mais difícil garantir que a comparação não seja influenciada pelos detalhes da realização. Na complexidade assintótica, esse risco é evitado porque você compara o algoritmo consigo mesmo.
De qualquer forma, apenas um programador ingênuo confiaria exclusivamente na complexidade assintótica para escolher um algoritmo. Existem muitos outros critérios, incluindo a constante não contada e o custo real das operações elementares. Além disso, a complexidade do pior caso pode ser um indicador ruim, porque a fonte da complexidade do pior caso pode ocorrer raramente e em fragmentos da entrada pequenos o suficiente para ter um impacto limitado. Por exemplo, analisadores gerais para gramáticas adjacentes a árvores têm uma complexidade teórica e são bastante úteis na prática. O pior caso que conheço é a
inferência do tipo polimórfico de Damas-Hindley-MilnerO(n6)algoritmo usado para ML, que tem complexidade exponencial de pior caso. Mas isso não parece incomodar os usuários de ML, nem impedir a gravação de programas muito grandes no ML. Há mais do que a constante que importa. Na verdade, a análise assintótica relaciona uma medida do custo de uma computação a alguma medida da complexidade da entrada. Mas o tamanho bruto pode não ser a medida certa.
Complexidade é como decisão, pode ser teoricamente ruim, mas isso pode ser irrelevante para a maior parte do espaço de dados ... às vezes. A análise de complexidade assintótica é uma ferramenta boa e bem projetada, com suas vantagens e limitações, como todas as ferramentas. Com ou sem explicitar a constante, que pode não ter sentido, é necessário usar o julgamento.