6.5 KiB
title | localeTitle |
---|---|
Algorithm Performance | Desempenho do Algoritmo |
Em matemática, notação big-O é um simbolismo usado para descrever e comparar o comportamento limitante de uma função.
O comportamento limitador de uma função é como a função atua à medida que tende a um valor particular e, na notação big-O, é geralmente como ela se aproxima do infinito.
Em resumo, a notação big-O é usada para descrever o crescimento ou declínio de uma função, geralmente com relação a outra função.
no design de algoritmos, normalmente usamos notação big-O, porque podemos ver quão bom ou ruim um algoritmo funcionará no pior modo. mas tenha isso em mente, nem sempre é o caso, porque o pior caso pode ser super raro e, nesses casos, calculamos o caso médio. por ora, para que não seja notado a notação big-O.
Em matemática, notação big-O é um simbolismo usado para descrever e comparar o comportamento limitante de uma função.
O comportamento limitante de uma função é como a função atua à medida que ela se aproxima de um valor particular e, na notação big-O, geralmente ela se aproxima do infinito.
Em resumo, a notação big-O é usada para descrever o crescimento ou declínio de uma função, geralmente com relação a outra função.
NOTA: x ^ 2 é equivalente a x * x ou 'x-quadrado']
Por exemplo, dizemos que x = O (x ^ 2) para todo x> 1 ou, em outras palavras, x ^ 2 é um limite superior em x e, portanto, cresce mais rápido.
O símbolo de uma afirmação como x = O (x ^ 2) para todo x> n pode ser substituído por x <= x ^ 2 para todo x> n onde n é o número mínimo que satisfaz a afirmação, neste caso 1.
Efetivamente, dizemos que uma função f (x) que é O (g (x)) cresce mais lentamente que g (x).
Comparativamente, na ciência da computação e no desenvolvimento de software, podemos usar a notação big-O para descrever a eficiência dos algoritmos por meio de sua complexidade de tempo e espaço.
Complexidade de espaço de um algoritmo refere-se à sua pegada de memória em relação ao tamanho de entrada.
Especificamente, ao usar a notação big-O, estamos descrevendo a eficiência do algoritmo em relação a uma entrada: n , geralmente à medida que n se aproxima do infinito.
Ao examinar algoritmos, geralmente queremos menor complexidade de tempo e espaço. A complexidade temporal de o (1) é indicativa de tempo constante.
Através da comparação e análise de algoritmos, somos capazes de criar aplicações mais eficientes.
Para o desempenho do algoritmo, temos dois fatores principais:
-
Tempo : precisamos saber quanto tempo leva para executar um algoritmo para nossos dados e como ele crescerá de acordo com o tamanho dos dados (ou, em alguns casos, outros fatores, como número de dígitos e etc).
-
Espaço : nossa memória é fina, então temos que saber quanto espaço livre precisamos para esse algoritmo e, como o tempo, precisamos ser capazes de rastrear seu crescimento.
As seguintes 3 notações são usadas principalmente para representar a complexidade de tempo dos algoritmos:
-
Θ Notação : A notação teta limita as funções acima e abaixo, de modo que define o comportamento exato. podemos dizer que temos a notação theta quando o pior e o melhor caso são os mesmos.
G (g (n)) = {f (n): existem constantes positivas c1, c2 e n0 tais que 0 <= c1 g (n) <= f (n) <= c2 g (n) para todo n> = n0}
-
Big O Notation : A notação Big O define um limite superior de um algoritmo. Por exemplo, Insertion Sort toma o tempo linear no melhor caso e no tempo quadrático no pior dos casos. Podemos dizer com segurança que a complexidade temporal da ordenação Insertion é O ( n ^ 2 ).
O (g (n)) = {f (n): existem constantes positivas c e n0 tais que 0 <= f (n) <= cg (n) para todo n> = n0}
-
Ω Notação : Ω notação fornece um limite inferior ao algoritmo. mostra a resposta mais rápida possível para esse algoritmo. > Ω (g (n)) = {f (n): existem constantes positivas c e n0 tais que 0 <= cg (n) <= f (n) para todo n> = n0}.
Exemplos
Como exemplo, podemos examinar a complexidade temporal do algoritmo [bubble sort] e expressá-lo usando a notação big-O.
Tipo de bolha:
// Function to implement bubble sort
void bubble_sort(int array<a href='http://bigocheatsheet.com/' target='_blank' rel='nofollow'>], int n)
{
// Here n is the number of elements in array
int temp;
for(int i = 0; i < n-1; i++)
{
// Last i elements are already in place
for(int j = 0; j < ni-1; j++)
{
if (array[j] > array[j+1])
{
// swap elements at index j and j+1
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
Observando esse código, podemos ver que, no melhor cenário em que a matriz já está classificada, o programa fará apenas n comparações, pois não ocorrerão swaps.
Portanto, podemos dizer que a melhor complexidade de tempo do tipo bubble type é O ( n ).
Examinando o pior cenário em que o array está em ordem reversa, a primeira iteração fará n comparações, enquanto o próximo terá que fazer comparações n - 1 e assim por diante, até que apenas uma comparação seja feita.
A notação big-O para este caso é, portanto, n * [( n - 1) / 2] que = 0.5 n ^ 2 - 0.5 n = O ( n ^ 2) como o termo n ^ 2 domina a função que nos permite ignore o outro termo na função.
Podemos confirmar esta análise usando [esta útil folha de fraude big-O que apresenta a grande complexidade de tempo de muitas estruturas e algoritmos de dados comumente usados
É muito aparente que, enquanto para casos de uso pequenos, essa complexidade de tempo pode ser boa, em uma bolha de grande escala, simplesmente não é uma boa solução para classificação.
Esse é o poder da notação big-O: ela permite que os desenvolvedores vejam facilmente os gargalos potenciais de seus aplicativos e tomem medidas para torná-los mais escalonáveis.
Para mais informações sobre porque a notação big-O e a análise de algoritmos são importantes, visite este desafio de vídeo !