[] Apaixone-se com a complexidade do conhecimento estrutura de dados e escova LeetCode título Guia

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

Aqui Insert Picture Descrição
Aqui Insert Picture Descrição
Aqui Insert Picture Descrição

Aqui Insert Picture Descrição

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

Aqui Insert Picture Descrição
Para executar um número de Fibonacci (de forma recursiva) , por exemplo, deve ser escrito assim:
Aqui Insert Picture Descrição

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:
Aqui Insert Picture Descrição
Realizamos prestes a fivela em vigor: eficiência muito muito pobre!
Aqui Insert Picture Descrição

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 ...
Aqui Insert Picture Descrição

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. .Aqui Insert Picture Descrição
Aqui Insert Picture Descrição

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

Aqui Insert Picture Descrição

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

Publicado 170 artigos originais · ganhou elogios 47 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/weixin_43734095/article/details/105116064
Recomendado
Clasificación