---
breaks: false
tags: edb1
title: '2022-10-10 slide 7 edb1'
---
# EDB1 - slide 7
**Tipo Abstrato de Dados: Conjuntos e Sequências**
# Tipo Abstrato de Dados (TAD)
- Os tipos trabalhados até o momento, como inteiro e ponto flutuante, são tipos já previamente implementados pela linguagem de programação. Não há a preocupação, por parte do programador, sobre como esses tipos são implementados em diferentes sistemas operacionais;
- Já quando falamos de um tipo abstrato de dados, este define a natureza do dado que será armazenado e as operações que podem ser realizadas;
- Modelo matemático que não tem compromisso com a implementação em um computador.
- Existem alguns tipos de dados mais complexos, como os conjuntos, onde a natureza desse tipo é um conjunto de dados de algum outro tipo;
- Podemos aplicar várias operações sobre os esses conjuntos (inserção, remoção, comparação, etc);
# Tipo Abstrato de Dados x Estrutura de Dados
- Uma estrutura de dados é a implementação de um tipo abstrato de dados. Ela define qual o mapeamento entre o tipo de dados e a memória, como um dado específico será armazenado na memória de um computador. Também deve definir quais os algoritmos que vão implementar as operações definidas sobre estes dados.
- A partir de agora vamos explorar os TAD que chamamos de estruturas lineares, os conjuntos e sequências.
- Serão avaliadas as diferentes formas de implementar esses dados através de diferentes estruturas, vamos diferenciar as diferentes implementações, avaliar a qualidade de cada uma delas, entendendo a mais adequada para cada uma delas.
| Tipo abstrato de dados | Estrutura de Dados |
| ----- | ------------------ |
| Define o dado | Define o mapeamento de memória |
| Define as operações | Define o algoritmo da operação |
# Conjuntos e Sequências
## Conjuntos - conceitos
- Conjuntos: Símbolos, letras, números.
- Operações sobre os conjuntos: inserção, remoção, intersecção, união, busca por elementos nos conjuntos.
- Como mapear esses conjuntos? como que implementa-se essas operações?
## Sequências: Tipo especial de um conjunto
- Elementos dispostos numa ordem específica. Inserções, remoções devem observar a posição em que serão realizadas.
- Busca: Por ex, um elemento específico está contido nessa sequencia?
- Ordenação.
## Sequências – no caso de uso de vetor
- Como é mapeado na memoria do computador?
- Vetor: considera um bloco de memoria (sequência) e armazena direto sobre o bloco. Cada elemento da sequência em cada uma das posições de memória.
- Pra implementar é necessária a indicação do início do bloco e do tamanho do bloco.
**Alocando um vetor.**
- Estática: Ocorre na declaração, por ex:
```c
int var [9]
```
- Dinâmica:
```c
int *var = (int *) malloc (9* sizeof(int));
```
- Operações a serem trabalhadas:
- Inserção
- remoção
- acesso (ex qual o elemento está na 10ª posição)
- busca (verificar se um elemento está contido no vetor)
- ordenação.
- Análise de diferentes algoritmos para fazer a mesma operação. Quais as diferenças na implementação sobre sequencias ou conjuntos.
:::info
**Obs**: Outro exemplo que será visto mais adiante é a lista ligada, ao invés de vetores.
:::
## Busca em Sequencia
- Verificar se um elemento está ou não contido em uma sequencia.
- Definição do problema:
- Quais são as saídas possíveis (qual a resposta que se pode esperar), quais as condições que levam a cada um dessas respostas.
- Entradas: Sequência e uma chave de busca. Saídas possíveis: verdadeiro e falso. Dependendo se a chave está ou não contida na sequência.
- Instância do problema, por ex: S = 3, 4, 5 , 9, 8, 6, 1. x = 1.
- Solução: verificar se é verdadeiro, se a chave é igual ao elemento pesquisado.
- Objetivo: Encontrar um algoritmo que faça isso.
## Implementação do problema de busca na sequencia
- Vetor: aloca um bloco, cada posição com seu endereço, precisa-se de um apontador que vai apontar para a primeira posição do vetor e um inteiro com o tamanho do número de elementos inseridos no vetor. Também é preciso a chave, o elemento a ser buscado.
Função:
```c
bool busca(char* V, int N, char x)
```
- `char* V`: Ponteiro que aponta para o início do vetor
- `int N`: valor do tamanho dos dados inseridos
- `char x`: chave de busca
## Exemplo de implementação – Jogo da memória
- 3 operações:
- 1a: selecionar uma carta para avaliar.
- 2a: identificar a carta, acessar.
- 3a: comparar com a chave.
- Essas operações são repetidas, até que a chave seja igual a carta acessada.
- Algoritmos diferentes para fazer as operações, com estratégias diferentes.