Estruturas de dados e algoritmos - Visão geral de estruturas de dados e algoritmos

1.1 O que é uma estrutura de dados

Explicação oficial:
Estrutura de dados é uma disciplina que estuda os objetos operacionais em problemas de programação de computação não numérica, bem como o relacionamento e funcionamento entre eles e outros assuntos relacionados.

Vernáculo:
Estrutura de dados é uma coleção de elementos de dados organizados de acordo com um determinado relacionamento, usado para organizar e armazenar dados

1.2 Classificação da estrutura de dados

Tradicionalmente, podemos dividir as estruturas de dados em duas categorias: estruturas lógicas e estruturas físicas.

Classificação da estrutura lógica:
A estrutura lógica é um modelo abstraído de problemas específicos. É uma estrutura em um sentido abstrato. É classificada de acordo com a relação entre elementos de dados em objetos. É também um problema que precisamos prestar atenção e discutir nos tópicos a seguir.

a. Estrutura do conjunto: Além de pertencerem ao mesmo conjunto, os elementos de dados na estrutura do conjunto não possuem outra relação entre si.
insira a descrição da imagem aqui
b. Estrutura linear: existe uma relação um-para-um entre os elementos de dados em uma estrutura linear

insira a descrição da imagem aqui
c. Estrutura da árvore: existe uma relação hierárquica de um para muitos entre os elementos de dados na estrutura da árvore
insira a descrição da imagem aqui

d. Estrutura gráfica: Os elementos de dados da estrutura gráfica são relacionamentos muitos-para-muitos.
insira a descrição da imagem aqui
Classificação da estrutura física:
A representação real da estrutura lógica no computador (também conhecida como imagem) é chamada de estrutura física e pode também pode ser chamada de estrutura de armazenamento. Estruturas físicas comuns incluem estrutura de armazenamento sequencial e estrutura de armazenamento em cadeia.

Estrutura de armazenamento sequencial:
Coloque os elementos de dados em unidades de armazenamento com endereços contínuos, e as relações lógicas e físicas entre os dados são consistentes. Por exemplo, nossas matrizes comumente usadas são estruturas de armazenamento sequencial.

insira a descrição da imagem aqui
Existem certas desvantagens na estrutura de armazenamento sequencial, assim como na vida, ao entrar na fila, algumas pessoas podem pular na fila ou algumas pessoas podem sair repentinamente em circunstâncias especiais. Neste momento, toda a estrutura está mudando e um armazenamento encadeado estrutura é necessária neste momento.

Estrutura de armazenamento em cadeia:
armazena elementos de dados em qualquer unidade de armazenamento, e esse grupo de unidades de armazenamento pode ser contínuo ou descontínuo. Neste momento, a relação lógica entre os elementos de dados não pode ser refletida entre os elementos, então um ponteiro é introduzido na estrutura de armazenamento encadeado para armazenar o endereço do elemento de dados, para que a localização do elemento de dados associado possa ser encontrada por meio de o endereço;
insira a descrição da imagem aqui

1.3 O que é um algoritmo

Explicação oficial:
Algoritmo refere-se a uma descrição precisa e completa de uma solução de resolução de problemas, uma série de instruções claras para resolver problemas, e um algoritmo representa um
mecanismo de estratégia para resolver problemas de maneira sistemática. Ou seja, a saída necessária pode ser obtida dentro de um tempo limitado para uma determinada entrada padrão.

Vernáculo:
De acordo com certas condições, calcule alguns dados para obter os resultados necessários.

1.4 Experiência inicial do algoritmo

Na vida, se nos deparamos com um determinado problema, muitas vezes a solução não é a única.

Por exemplo, como ir de Xi'an a Pequim? Haverá soluções diferentes. Podemos pegar um avião, um trem, um carro ou até mesmo caminhar. O custo de tempo e custo de dinheiro de diferentes soluções são diferentes. Por exemplo, leva menos tempo para voar, mas O custo é o mais alto, e a caminhada é a mais barata, mas leva mais tempo.

Outro exemplo é como pagar por uma casa com pátio dentro do Segundo Anel Viário em Pequim? Também haverá diferentes soluções, que podem ser um pagamento único em dinheiro ou uma hipoteca através do banco. Os custos trazidos por essas duas soluções também são diferentes. Pagamento único, embora o dinheiro pago na época fosse alto e a pressão fosse alta, não havia juros. O juro total por 30 anos é quase o dobro do valor do empréstimo, o que é um pagamento a mais.

No programa, também podemos usar diferentes algoritmos para resolver o mesmo problema, e o custo de diferentes algoritmos também é diferente. Em geral, um algoritmo excelente persegue os dois objetivos a seguir:

  1. Gaste o mínimo de tempo para concluir os requisitos;
  2. Ocupar o menor espaço de memória para completar os requisitos;

Abaixo utilizamos alguns casos práticos para experimentar alguns algoritmos.

Requisito 1:
Calcule a soma de 1 a 100.
A primeira solução:

public static void main(String[] args) {
    
    
	int sum = 0;
	int n=100;
	for (int i = 1; i <= n; i++) {
    
    
		sum += i;
	}
	System.out.println("sum=" + sum);
}

A segunda solução:

public static void main(String[] args) {
    
    
	int sum = 0;
	int n=100;
	sum = (n+1)*n/2;
	System.out.println("sum="+sum);
}

A primeira solução precisa concluir as seguintes ações:

  1. Defina duas variáveis ​​inteiras;
  2. Execute 100 operações de adição;
  3. Imprima o resultado no console;

A segunda solução precisa concluir as seguintes ações:

  1. Defina duas variáveis ​​inteiras;
  2. Execute 1 operação de adição, 1 operação de multiplicação e 1 operação de divisão, para um total de 3 operações;
  3. Imprima o resultado no console;

Obviamente, o segundo algoritmo completa os requisitos e leva menos tempo.

Requisito 2:
Calcular o fatorial de 10
A primeira solução:

public class Test {
    
    
	public static void main(String[] args) {
    
    
		//测试,计算10的阶乘
		long result = fun1(10);
		System.out.println(result);
	}
	//计算n的阶乘
	public static long fun1(long n){
    
    
		if (n==1){
    
    
		return 1;
		}
		return n*fun1(n-1);
	}
}

A segunda solução:

public class Test {
    
    
	public static void main(String[] args) {
    
    
		//测试,计算10的阶乘
		long result = fun2(10);
		System.out.println(result);
	}
	//计算n的阶乘
	public static long fun2(long n){
    
    
		int result=1;
		for (long i = 1; i <= n; i++) {
    
    
			result*=i;
		}
		return result;
	}
}

A primeira solução, usando recursão para completar os requisitos, o método fun1 será executado 10 vezes, e a primeira execução não é concluída, a segunda execução é chamada, a segunda execução não é concluída, a terceira execução é chamada... Finalmente , no máximo, é necessário abrir 10 blocos de memória na pilha de memória para executar 10 métodos fun1 respectivamente.

A segunda solução é usar o loop for para completar os requisitos.O método fun2 será executado apenas uma vez.No final, você só precisa abrir um pedaço de memória na memória da pilha para executar o método fun2.

Obviamente, o segundo algoritmo atende aos requisitos e ocupa menos espaço de memória.

Acho que você gosta

Origin blog.csdn.net/qq_33417321/article/details/121944884
Recomendado
Clasificación