01. Informações de estrutura de dados, complexidade de tempo e complexidade de espaço (algoritmo básico de estrutura de dados)

marca d'água, tamanho_16, text_QDUxQ1RP5Y2a5a6i, color_FFFFFF, t_100, g_se, x_10, y_10, shadow_90, type_ZmFuZ3poZW5naGVpdGk =Materiais introdutórios e índice de conhecimento


índice


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

https://visualgo.net/zh

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

Acho que você gosta

Origin blog.51cto.com/huangkui/2677732
Recomendado
Clasificación