Basics
- O que é um algoritmo?
- Como julgar a qualidade de um algoritmo?
- Big O notação (Big O)
- Guia LeetCode título escova
- colunas complexidade análise de Fibonacci
- número de Fibonacci - recursão
- número de Fibonacci - ciclo
- função lorota de análise de complexidade de tempo
- Linear Algébrica Solution Fibonacci - equação característica
- A direção de algoritmos de otimização
- Após a ordem
Graças à jardas pequeno irmão de queda no amor com uma estrutura de dados , gravação de notas do curso.
O que é um algoritmo?
Implementação do algoritmo é uma série de passos para a resolução de problemas específicos.
O algoritmo a seguir para resolver os dois números juntos questões.
// 计算a和b的和
public static int plue(int a, int b){
return a + b;
}
O algoritmo a seguir para resolver n números e questões.
// 1+2+3+...+n
public static int sum(int n){
int result = 0;
for(int i = 1; i <= n; i++){
result += i;
}
return result;
}
Usando diferentes algoritmos para resolver o mesmo problema, a eficiência pode ser muito diferente.
Por exemplo: encontrar a n-ésima Fibonacci (número de Fibonacci)
Como julgar a qualidade de um algoritmo?
Se uma única avaliação da implementação da eficiência poderia esperar tal cenário um:
- Execução tempo de processamento para comparar diferentes algoritmos para o mesmo conjunto de entrada
- Este programa também é conhecido como: estatísticas ex post
A forma de realização acima descrita tem evidentes desvantagens:
- O tempo de execução é fortemente dependente do hardware e executar uma variedade de fatores ambientais de incerteza
- Você deve escrever as estimativas de código correspondente
- Selecione os dados de teste mais difícil garantir a imparcialidade
Geralmente são usados para avaliar o algoritmo a partir dos seguintes dimensões:
- Exactidão, legibilidade, robustez (contra a capacidade de resposta de entrada razoável e poder de processamento)
- complexidade de tempo (tempo de complexidade)
frequência e instruções do programa de execução estimado (tempo de execução) - complexidade espaço (complexidade espaço)
para estimar o espaço de armazenamento necessário ocupada
Agora que o desenvolvimento de melhor, em geral, hardware, estamos mais focados na complexidade de tempo .
Big O notação (Big O)
notação geral usado para descrever uma grande complexidade O, que representa os dados de complexidade que corresponde ao tamanho de n.
Ignorar o factor constante, baixa ordem:
- 9 >> O (1)
- 2n + 3 >> O (n)
- N 2 + 2 N + 6 >> O (N 2 )
- 4n 3 + 3n 2 + 22n + 100 >> O (n 3 )
- Em escrita, n- . 3 é equivalente a n ^ 3
Nota: Big O notação é apenas uma áspera modelo , uma estimativa pode ajudar-nos pouco tempo para entender a eficiência do algoritmo.
Detalhes da ordem de
Geralmente no fim omitido na base de
- log 2 9 * log 9 n >> log 2 n
- Portanto, O (log 2 N- ), O (log . 9 N- ) colectivamente referidos como O (log n- )
Complexidade comum
Uma pluralidade de tamanho dados
complexidade de tempo: O (n + k)
public static void test(int n, int k){
for(int i = 0; i < n; i++){
System.out.println("test");
}
for (int i = 0; i < k; i++){
System.out.println("test");
}
}
Guia LeetCode título escova
Primeiro, vá https://leetcode-cn.com/ registrado uma conta vigor dedução.
Nós forçar usar um tópico Fibonacci Fibonacci exemplo, a maneira de analisar a complexidade de tempo do algoritmo.
Tópico URL: LeetCode: 509. Fibonacci número de Fibonacci
Para executar um número de Fibonacci (de forma recursiva) , por exemplo, deve ser escrito assim:
colunas complexidade análise de Fibonacci
número de Fibonacci - recursão
código muito simples, eu acredito que os alunos a aprender estruturas de dados pode compreender.
// O(2^n)
public static int fib1(int n) {
if (n <= 1) return n;
return fib1(n - 1) + fib1(n - 2);
}
Análise complexidade:
Realizamos prestes a fivela em vigor: eficiência muito muito pobre!
número de Fibonacci - ciclo
Não abra qualquer espaço, usando apenas o ciclo está completo.
// O(n)
public static int fib2(int n) {
if (n <= 1) return n;
int first = 0;
int second = 1;
for (int i = 0; i < n - 1; i++) {
int sum = first + second;
first = second;
second = sum;
}
/*
// 也可以使用while循环
while (n-- > 1) {
second += first;
first = second - first;
}
*/
return second;
}
execução vigor Prender: velocidade torna-se mais rápido, ou um monte de consumo de memória ...
Abrir novo espaço array, com espaço para o tempo.
public static int fib3(int n){
if(n <= 1) return n;
int[] fib = new int[n+1];
fib[0] = 0;
fib[1] = 1;
for(int i = 2; i < fib.length; i++){
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n];
}
execução vigor Prender: uh, e acima parece nada diferente. .
função lorota de análise de complexidade de tempo
Diferença entre a função de dois lorota acima de quanto?
- Se houver um computador comum de 1 GHz, a velocidade de operação de 10 . 9 vezes por segundo, n-64
- O (n) leva aproximadamente 6,4 10-8segundo
- O (2 N- ) demora cerca de 584.94 anos
- Às vezes, a diferença entre algoritmo, mais frequentemente do que o lado do hardware do fosso é ainda maior
Linear Algébrica Solution Fibonacci - equação característica
A direção de algoritmos de otimização
- Como poucos espaço de armazenamento
- passo a exaustão (tempo de execução) de menos
- Conforme o caso
- Espaço para o tempo
- Tempo para o espaço
Após a ordem
[] Apaixone-se a estrutura de dados da estrutura de dados Daquan