Ordem de complexidade - Análise de algoritmos

Como já foi dito, análise de algoritmos tem como objetivo verificar e estudar um algoritmo, de forma a encontrar situações em que ele agirá da pior ou pior forma (alé do caso médio) e assim definirmos a complexidade do mesmo, podendo indicar o grau de qualidade do mesmo. Porém, essa análise pode ser expandida no quesito de comparação com outros algoritmos, afinal, é muito comum no mundo da programação, existirem N diferentes códigos e algoritmos que a pesar da sua diferença de script, realizam um mesmo objetivo. Diante disso, a ordem de complexidade tem como objetivo comparar dois ou mais algoritmos, de forma a identificar os casos em que um domina o outro (em que o algoritmo é melhor que outro).

Essa questão se aplica e se firma bastante sobre o quesito de tempo de execução que o algoitmo levaá para sua execução, a partir de uma variável de entrada N. Já estudamos também que ao bater o olho em um algoritmo, podemos definir logo de cara que aqueles que apresentem uma análise assintóica com variáveis superiores, são mais exigentes que os demais, como por exemplo: N^2 > N ou N^n > N^n. Diante disso, podemos julgar um algoritmo mais "pesado" e trabalhoso do que outro a partir de suan apresentação de variaveis. Como no exemplo:

    Tendo 2 algoritmos A e B para a solução de um problema. Se a complexidade de um é expressa por Fa(n) = n^2 e Fb(n) = 100n, qual o mais custoso?
        

Aqui podemos peceber que independente do valor de n, a primeira função terá um desempenho muito mais custoso em algum momento de seu intervalo, de forma escalar em um gráfico. Aconselhando a isso, é indicado o site https://www.wolframalpha.com/input/?i=plot+x+%2C+x%5E2, onde é possível colocar várias funções e observar o seu comportamento, nesse site, as funções são postas em um gráfico e podemos observer em que instante de variável uma irá se opor a outra. Para isso, devemos inserir dados como:

    plot função 1, função 2, x=0 to valor máximo de alcance
        

Assim podemos ter uma visão bem melhor e real do comportamento e sobreposição de 2 ou mais funções. Essa quesão de dominação de uma função sobre outra, é chamada de dominação assintótica e é um argumento muito usado nas análises de algoritmos e comparações de algoritmos. Logo, no caso do exemplo citado acima, podemos dizer que a primeira função domina a segunda, devido ao seu maior custo de execução. Para que isso esteja fixo em seus estudos, seguiremos com outro exemplo de dominação entre2 funções:

    Dadas as funções:
    
        𝑓(𝑛) = 5 ∗ 𝑛^2 + 10
        
        g(𝑛) = 0.5 ∗ 𝑛^3 − 20
        
    Qual função domina a outra?    
        
        

Aqui, logo de cara, podemos indicar que em algum momento de variável, a função g(n) possui dominação, devido a sua característica de custo n^3, ou seja, em dado instante, colocado em um gráfico, a primeira função terá um custo exponencialmente maior do que a outra.

Diante destas questões, entraremos nas notações de ordem de complexidade, as quais são 3 diferentes fórmulas que indicam a dominâcia de uma função por outra, ou seja, estas notações irão definir que indepente de qual seja a variável de tempo de execução trabalhada, uma função, em algum momento, terá uma poporção bem maior que a outra. Estas notações são: