Algoritmos e Estruturas de Dados I Aula 09 Revisão + Simulado Prof. Jesús P. Mena-Chalco jesus.mena@ufabc.edu.br 1Q-2019 1
Vetores 2
Vetores 3
Vetores vetor 4
Vetores... vetor... 5
Ponteiros 6
Processo na memória INSTRUÇÕES PILHA (STACK) Armazena o código compilado (na linguagem máquina) Armazena as variáveis ao longo da execução do programa. Espaço de memória principal gerenciado pelo SO. [~bytes] [~Mbytes] [~Toda a memória RAM] Alocação estática int x; double M[10][20]; char *c; HEAP Alocação dinâmica double M = malloc(...); 7
Ponteiros? Processo na memória INSTRUÇÕES PILHA (STACK) HEAP Em Java e Python o uso é transparente. Não precisa se preocupar de alocar e liberar memória 8
Fenômeno: Stack Overflow Processo na memória INSTRUÇÕES PILHA (STACK) HEAP 9
Endereços A memória de qualquer computador (arquitetura de Von Neumann) é uma sequência de bytes. Cada byte armazena um de 256 possíveis valores. Os bytes são numerados sequencialmente e o número de um byte é o seu endereço (*) Fonte: http://codingfox.com/3-1-computer-memory-and-data-representation/ 10
Endereços Em c o endereço de um objeto é dado pelo operador & Se x é uma variável, então &x é o seu endereço int s = -999 int* p = &s p s 0x89422-9999 0x60001 0x89422 p = 0x89422 &p = 0x60001 *p = -9999 p aponta para a s p é o endereço de s p aponta a s *p é o mesmo que escrever s 11
Structs 12
Linguagem C: Tipos de dados Tipos de dados primários. Tipos de dados derivados. Tipos definidos pelo usuário. (*) Fonte: http://www.studytonight.com/c/datatype-in-c.php 13
Por que precisamos saber de structs? Em determinadas aplicações é necessário associar diferentes dados a um objeto. Objeto: Ponto em 3D x y z Ponto 1 Ponto 2 Ponto 3 Ponto 4 Ponto 5... 14
Por que precisamos saber de structs? Podemos usar 3 vetores para armazenar as posições de cada ponto no espaço 3D Vx Vy Vz void plot3d(double Vx[], double Vy[], double Vz[]) {... } 15
Por que precisamos saber de structs? Podemos usar 7 vetores para armazenar as posições de cada ponto no espaço 3D e a sua cor RGB Vx Vy Vz Vr Vg Vb Va void plot3d(double Vx[], double Vy[], double Vz[], ) {... } 16
Por que precisamos saber de structs? Por que não simplificar? Vx Vy void plot3d(struct Ponto3D V[], int n) {... } Vz Vr Vg Vb Va As structs fornecem uma forma simples para programar 17
Estruturas Uma estrutura para armazenar um ponto 3D Uma estrutura para armazenar um ponto 3D e sua cor (RGBA) 18
Maior segmento de reta 2D Crie um programa, na linguagem C, em que dada uma sequência de n pares de números reais, apresente o comprimento do maior segmento de reta. Deve ser obrigatoriamente utilizada a estrutura: struct Ponto2D { double x; double y; }; Exemplo de entrada: 5 11 22 00 33 44 Saída: 5.66 Apresente apenas os 2 primeiros digitos após o ponto decimal Obs.: Não use colchetes. Use apenas ponteiros. 19
Exemplo de segmentos de reta Maior segmento 20
Maior segmento de reta 2D pow(2,2) sqrt(2) 21
Maior segmento de reta 2D 22
Área do Menor Triângulo Crie um programa, na linguagem C, em que dada uma sequência de n (n>=3) pares de números reais, apresente a área do menor triângulo composto por 3 pontos. Deve ser obrigatoriamente utilizada a estrutura: struct Ponto2D { double x; double y; }; Exemplo de entrada: 3 15 15 20 30 28 30 Saída: 60.00 Apresente apenas os 2 primeiros digitos após o ponto decimal Obs.: Não use colchetes. Use apenas ponteiros. 23
Exemplo de triângulos para 4 pontos 24
Área de um triângulo https://www.mathopenref.com/coordtrianglearea.html 25
Área do Menor triângulo 26
Área do Menor triângulo 27
Listas 28
Definição Suporemos que os objetos armazenados nos nós são do tipo int. A estrutura de nós pode ser definida como: 3 7 29
Imprimir uma lista (rec) 30
Busca por um elemento p r Busca (dado um elemento) x x O(n) Se o elemento não existir, na lista, a função devolve NULL. 31
Outros tipos de listas encadeadas: Lista circular p 7-3 4 A última célula aponta para a primeira 0 8 13 32
Outros tipos de listas encadeadas: Lista duplamente encadeada q p 7 9-2 NULL 75 NULL Cada célula contém o endereço da célula anterior e o da seguinte 33
4) Eliminar elemento em uma posição Dado um ponteiro para o primeiro nó de uma lista ligada, e um número inteiro p. Elimine da lista o nó que está na posição p da lista. A função deve devolver um ponteiro ao primeiro elemento da lista. Assuma que a posição p sempre será uma posição válida. Uma posição igual a 0 indica o início da lista. Uma posição igual a 1 indica o nó seguinte ao início da lista e assim por diante. O ponteiro dado pode ser nulo, o que significa que a lista inicial está vazia. Obs.: Deve implementar apenas a função eliminarelementoemumaposicao Entrada Saída Descrição 5 11 22 33 44 55 2 11 22 44 55 Na lista ligada de 5 nós, composta pelos elementos: 11 22 33 44 55 Deve ser eliminado o elemento da posição 2. Resultando a lista: 11 22 44 55 34
4) Eliminar elemento em uma posição 35
5) Inverter uma lista ligada Dado um ponteiro para o primeiro nó de uma lista ligada, crie uma função que permita inverter a ordem na lista. Isto é, as ligações devem ser invertidas. O último elemento da lista deve apontar a NULL. A função deve devolver um ponteiro ao primeiro elemento da lista. O ponteiro dado pode ser nulo, o que significa que a lista inicial está vazia. Obs.: Deve implementar apenas a função inverterlistaligada Entrada Saída Descrição 5 11 22 33 44 55 55 44 33 22 11 A lista ligada de 5 elementos, composta por: 11 22 33 44 55 NULL Deve ser transformada na lista: 55 44 33 22 11 NULL 36
5) Inverter uma lista ligada 37
6) Comparar duas listas ligadas Dados dois ponteiros para os primeiros nós de duas listas ligadas, crie uma função que permita comparar os dados nos nós das listas para verificar se eles são iguais. As listas são iguais apenas se tiverem o mesmo número de nós e os nós correspondentes tiverem os mesmos dados. O ponteiro dado pode ser nulo, o que significa que a lista está vazia. Obs.: Deve implementar apenas a função compararlistasligadas Entrada Saída Descrição 2 11 22 1 11 0 Dadas as duas listas: Lista 1: 11 22 NULL Lista 2: 11 NULL 2 55 66 2 55 66 1 A resposta deve ser 0 dado que são listas diferentes. Dadas as duas listas: Lista 1: 55 66 NULL Lista 2: 55 66 NULL A resposta deve ser 1 dado que são listas iguais. 38
6) Comparar duas listas ligadas 39
7) Valor em uma determinada posição Dado um ponteiro para o primeiro nó de uma lista ligada e um inteiro que representa uma posição p, crie uma função que permita obter o valor do nó dada na posição p, contando de trás para frente. Assuma que a posição p sempre será uma posição válida. Uma posição igual a 0 indica o último elemento da lista. Uma posição igual a 1 indica o penúltimo e assim por diante. O ponteiro dado pode ser nulo, o que significa que a lista está vazia. Obs.: Deve implementar apenas a função valoremposicao Entrada Saída Descrição 5 11 22 33 44 55 1 44 Na lista ligada de 5 elementos, composta por: 11 22 33 44 55 NULL O elemento na posição 1 (de trás para frente) é 44 40
7) Valor em uma determinada posição 41
8) Eliminar elementos duplicados Dado um ponteiro para o primeiro nó de uma lista ligada com elementos organizados na ordem crescente. Crie uma função que permita eliminar o mínimo dos nós para que a lista não contenha nenhum valor repetido. A função deve devolver um ponteiro ao primeiro elemento da lista. O ponteiro dado pode ser nulo, o que significa que a lista está vazia. Obs.: Deve implementar apenas a função eliminarelementosduplicados Entrada Saída Descrição 7 11 22 22 33 44 44 55 11 22 33 44 55 A lista ligada de 7 elementos, composta por: 11 22 22 33 44 44 55 NULL Deve ser transformada na lista: 11 22 33 44 55 NULL 42
8) Eliminar elementos duplicados 43
9) Intercalar duas listas ligadas Dados dois ponteiros para os primeiros nós de duas listas ligadas, crie uma função que permita intercalar os dados nos nós das listas de tal forma a criar uma (nova) terceira lista ligada mas organizada na forma crescente. Os dados em ambas as listas iniciais estão organizados na sua forma crescente. O ponteiro dado pode ser nulo, o que significa que a lista está vazia. Obs.: Deve implementar apenas a função intercalarlistasligadas Entrada Saída Descrição 2 11 44 4 22 33 55 66 11 22 33 44 55 66 Dadas as duas listas: Lista 1: 11 44 NULL Lista 2: 22 33 55 66 NULL 1 99 1 99 99 99 Dadas as duas listas: Lista 1: 99 NULL Lista 2: 99 NULL O resultado de intercalar as duas listas deve ser: 11 22 33 44 55 66 NULL O resultado de intercalar as duas listas deve ser: 99 99 NULL 44
9) Intercalar duas listas ligadas 45
10) Segundo menor elemento Dado um ponteiro para o primeiro nó de uma lista ligada. Crie uma função que permita devolver o valor do segundo menor elemento presente na lista ligada. Considere que a lista inicial sempre terá no mínimo 2 elementos. Obs.: Deve implementar apenas a função segundomenorelemento Entrada Saída Descrição 5 11 99 44 33 66 33 A lista ligada de 5 elementos, composta por: 11 99 44 33 66 NULL 3 44 44 44 44 Tem como segundo menor valor: 33 A lista ligada de 3 elementos, composta por: 44 44 44 NULL Tem como segundo menor valor: 44 46
10) Segundo menor elemento 47
Resumo Listas Listas com com arranjos arranjos ---- Listas Simples Simples para para usar usar Alocação Alocação em em bloco bloco contínuo contínuo Acesso Acesso aa um um item item em em tempo tempo constante constante -- Requer Requer saber saber aa quantidade quantidade de de itens itens previamente previamente (para (para alocação) alocação) -- Inserção/Remoção Inserção/Remoção requer requer deslocamentos deslocamentos -- Expansão Expansão custosa custosa (realocar (realocar ee copiar) copiar) Listas Listas ligadas/encadeadas/enlaçadas ligadas/encadeadas/enlaçadas -- Não Não requer requer conhecer conhecer aa quantidade quantidade de de itens itens previamente previamente -- Inserção Inserção ee remoção remoção não não requer requer deslocamentos deslocamentos -- Acesso Acesso aa uma uma posição posição necessita necessita percorrer percorrer aa lista lista -- Memória Memória extra extra para para os os ponteiros ponteiros
listas e árvores 49
Vetor (array): Elementos contiguos na memória. Todos do mesmo tipo de dado Listas ligadas: Elementos não necessariamente contiguos na memória. Podem ter atributos diferentes. Árvores: Elementos não necessariamente contiguos na memória. Podem ter atributos diferentes. 50
Structs Para uma lista ligada: Para uma lista duplamente ligada e também para uma árvore em que cada nó tenha no máximo 2 ligações: 51
Varredura Como seria a varredura e-r-d? 52
Varredura Na figura abaixo, os nós estão numeradas na ordem da varredura e-r-d. 5 3 1 0 8 4 2 6 9 7 53
Custos de algoritmos 54
O número de comparações, no algoritmos, depende dos inteiros registrados no vetor. No melhor caso: o elemento está na primeira posição No pior caso: o elemento está na última posição ou não está no vetor. No caso médio? 55
Busca de um elemento Seja f uma função de complexidade tal que f(n) é o número de elementos consultados. Melhor caso: Quando o elemento procurado é o primeiro consultado Pior caso: Quando o elemento procurado é o último consultado ou Não está presente no vetor Caso médio: 56
(*) Fonte: http://algs4.cs.princeton.edu/14analysis/ 57
http://bigocheatsheet.com/ 58
Simulado 59
Q1 (a) Devolve a diferença entre o maior e o menor valor presente no vetor V. (b) Para qualquer caso o número de comparações é proporcional a 2n. 60
Q2 61
Q3 62
Q4 63