Materiais introdutórios e índice de conhecimento
índice
- Informação comum
- estrutura de conhecimento
- Ordem logarítmica
- Complexidade do espaço: o espaço de memória consumido pelo algoritmo, denotado como S (n) = O (f (n))
- Análise de complexidade de tempo
- Análise da complexidade do espaço
- 1. Concentre-se apenas no código com a maioria das execuções de loop
- 2. A regra de adição: a complexidade total é igual à complexidade do código com a maior magnitude
- 3. A regra de multiplicação: a complexidade do código aninhado é igual ao produto da complexidade do código dentro e fora do ninho
- 5 características principais do algoritmo
- complexidade de tempo:
Informação comum
Complexidade do algoritmo
https://www.bigocheatsheet.com
Site de demonstração dinâmica
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
estrutura de conhecimento
5 características principais do algoritmo
Finito, exato, entrada, saída, viabilidade
complexidade de tempo:
A carga de trabalho computacional necessária para executar o algoritmo.
De modo geral, um algoritmo de computador é uma função do tamanho do problema n, f(n)
e a complexidade de tempo do algoritmo é, portanto, registrada comoT(n)=O(f(n))
Quanto maior o problema, a taxa de crescimento do tempo de execução do algoritmo está positivamente relacionada à taxa de crescimento de f (n), que é chamada de complexidade de tempo assimpótico (Complexidade de Tempo Assimpótico)
Cálculo:
- 1. A fórmula para calcular o número de vezes
1 + 2 + 3 + ... + n;
<? php $ sum = 0; para ($ i = 1; $ i <= $ n; $ i ++) { soma + = $ i; } ?>
Calcule n vezes, a complexidade do tempo é O (n)
- 2. Use a constante 1 para substituir todas as constantes de adição em todos os momentos. Por exemplo, O (3) é registrado como O (1)
<? teste de função php ($ n) { echo $ n; echo $ n; echo $ n; } ?>
O (3) é registrado como O (1)
- 3. Na função de número modificado de operações, apenas o item de ordem mais alta
n ^ 2 + n + 1 é retido, que é registrado como O (n ^ 2) - 4. Se a ordem mais alta existe e não é 1, remova a constante
2n ^ 2 + 3n + 1 multiplicada por este termo e registre-a como O (n ^ 2)
Ordem constante: O (1) Ordem linear: O (n) Ordem quadrada plana (Li): O (n ^ 2), O (n ^ 3)
<? php $ sum = 0; for ($ i = 1; $ i <= $ n; $ i ++) { for ($ j = 1; $ j <= $ n; $ j ++) { $ sum + = $ j; } } ?>
Loop de duas camadas O (n ^ 2) Três camadas O (n ^ 3)
Ordem quadrada especial: O (n ^ 2/2 + n / 2) -> O (n ^ 2)
for () { for () { } } for () { } echo $ a + $ b;
n^2+n+1->O(n^2)
Ordem logarítmica
$ i = 1; $ n = 100; enquanto ($ i <$ n) { $ i = $ i * 2; }
2 ^ x = n x = \ log_2 ^ n \ log_2 ^ n = \ log_2 ^ {10} \ log {n}
3 ^ x = n x = \ log_3 ^ n \ log_3 ^ n = \ log_3 ^ {10} * \ log {n}
Pior caso: o tempo de execução no pior caso, uma garantia, se não houver uma descrição especial, a complexidade do tempo mencionada é a complexidade do tempo no pior caso
Caso médio: tempo de execução esperado
Complexidade do espaço: o espaço de memória consumido pelo algoritmo, denotado como S (n) = O (f (n))
- Incluindo o espaço ocupado pelo código do programa
- O espaço ocupado pelos dados de entrada e
- Espaço ocupado por variáveis auxiliares
Esses 3 aspectos
Os métodos de cálculo e representação são semelhantes à complexidade do tempo, e geralmente são representados pela progressividade da complexidade
Análise de complexidade de tempo
1. Concentre-se apenas no código com a maioria das execuções de loop
Big O Este método de representação de complexidade mostra apenas uma tendência de mudança.
Normalmente ignoramos as constantes, a ordem inferior e os coeficientes da fórmula e só precisamos registrar a magnitude da ordem maior. Portanto, quando analisamos a complexidade de tempo de um algoritmo ou parte do código, prestamos atenção apenas à parte do código que tem mais tempos de execução de loop.
C é uma constante, por que C pode ser omitido? Cn ^ 2 C (n + 1) ^ 2-Cn ^ 2 = C (2n + 1) (n + 1) ^ 2-n ^ 2 = 2n + 1
2. A regra de adição: a complexidade total é igual à complexidade do código com a maior magnitude
3. A regra de multiplicação: a complexidade do código aninhado é igual ao produto da complexidade do código dentro e fora do ninho
Análise da complexidade do espaço
O nome completo de complexidade de tempo é complexidade de tempo progressiva , que representa a relação de crescimento entre o tempo de execução de um algoritmo e a escala de dados . Por analogia, o nome completo da complexidade do espaço é complexidade assintótica do espaço (complexidade do espaço assintótico), que representa a relação de crescimento entre o espaço de armazenamento de um algoritmo e a escala de dados .
void print (int n) { int i = 0; int [] a = novo int [n]; para (i; i <n; ++ i) { a [i] = i * i; } para (i = n-1; i> = 0; --i) { imprima um [i] } }
Como a análise da complexidade do tempo, na segunda linha do código, solicitamos um espaço para armazenar a variável i, mas ela é de ordem constante e não tem nada a ver com o tamanho dos dados n, portanto, podemos ignorá-la. A linha 3 se aplica a uma matriz de tipo int de tamanho n. Além disso, o restante do código não ocupa mais espaço, portanto, a complexidade do espaço de todo o código é O (n).
Foto tirada de: https://time.geekbang.org/column/article/40036