Vetor D Relatório
Vetor D Relatório
Vetor D Relatório
e Desenvolvimento de Sistemas
Algoritmos – 2024.1
Trabalho – Vetor dinâmico
Exemplo de Expansão:
02 - Vetores Dinâmicos
Definição e Funcionamento
Um vetor dinâmico é uma estrutura de dados que simula o comportamento de arrays, mas com
a capacidade de redimensionar-se automaticamente quando o limite é atingido. Isso é obtido
alocando um novo array maior e copiando os elementos para ele.
Exemplo de Expansão:
Os vetores dinâmicos são essencialmente arrays que podem crescer e encolher conforme
necessário. Quando o limite de capacidade é atingido, um vetor dinâmico aloca um novo array
com uma capacidade maior e copia os elementos do array antigo para o novo. Esse processo
de redimensionamento geralmente dobra a capacidade atual para minimizar o número de
redimensionamentos necessários. A operação de inserção no final do vetor é eficiente na
maioria dos casos, mas pode ser custosa quando ocorre o redimensionamento.
Análise de Desempenho
● Inserção no Final:
○ Complexidade Amortizada: O(1)
○ Descrição: Inserir um elemento no final do vetor dinâmico é geralmente uma
operação O(1) No entanto, quando o vetor atinge sua capacidade máxima, ele
precisa ser redimensionado. O redimensionamento envolve alocar um novo
array maior (geralmente o dobro do tamanho atual), copiar todos os elementos
do array antigo para o novo, e então inserir o novo elemento. Esse
redimensionamento ocasional torna a inserção no final O(n) no pior caso, mas
O(1) em média, considerando várias inserções.
● Inserção em Posições Intermediárias:
○ Complexidade: O(n)
○ Descrição: Inserir um elemento em uma posição intermediária requer o
deslocamento de todos os elementos subsequentes para a direita para abrir
espaço para o novo elemento. Esse deslocamento é uma operação linear em
relação ao número de elementos nnn no vetor.
Remoção:
● Remoção no Final:
○ Complexidade: O(1)
○ Descrição: Remover o último elemento do vetor é uma operação direta e
constante, pois não há necessidade de deslocar outros elementos.
● Remoção em Posições Intermediárias:
○ Complexidade: O(n)
○ Descrição: Remover um elemento de uma posição intermediária implica
deslocar todos os elementos subsequentes para a esquerda para preencher o
espaço vazio. Assim como na inserção intermediária, essa operação é linear em
relação ao número de elementos n.
Acesso:
● Complexidade: O(1)
● Descrição: O acesso a um elemento por índice em um vetor dinâmico é muito eficiente,
pois os elementos são armazenados em um array contíguo. Isso permite o acesso
direto por meio de aritmética de ponteiros, resultando em complexidade constante.
Redimensionamento:
Exemplo de Expansão:
Para analisar o desempenho dos vetores dinâmicos, foi realizado testes de inserção e
remoção de elementos utilizando uma série de valores pré-determinados. Medimos o tempo
total de inserção e remoção usando a biblioteca chrono do C++. Os valores de teste incluíram
números inteiros em uma sequência específica para garantir a reprodutibilidade dos resultados.
Inserção: Valores: [15, 1, 3, 5, 4, 2, 12, 89, 32, 12, 32, 8, 6, 9, 1, 2, 10, 11, 9]
03 - Lista Ligada
Uma lista duplamente ligada é uma estrutura de dados que consiste em nós onde cada nó
contém um valor e dois ponteiros, um apontando para o próximo nó e outro para o nó anterior.
Isso permite uma navegação bidirecional.
Inserção
● Lista Duplamente Ligada: Inserção no início e no final são operações O(1), pois
envolvem apenas a atualização de ponteiros.
● Vetor Dinâmico: Inserção no final é O(1) amortizado, mas inserção em posições
intermediárias pode ser O(n) devido ao deslocamento de elementos.
Remoção
Acesso
● Lista Duplamente Ligada: Acesso a um elemento é O(n) na média, pois pode ser
necessário percorrer metade da lista.
● Vetor Dinâmico: Acesso a um elemento é O(1), pois é realizado por índice.
04 - Implementação
Construtor e Destrutor
O construtor inicia a lista vazia, e o destrutor limpa a lista para liberar a memória.
Método inserir_inicio
Método inserir_final
Método remover_inicio
Método remover_final
Método tamanho
Método limpar
Remove todos os elementos da lista, liberando a memória.
Método Desempenho
Construtor O (1)
Destrutor O (n)
Tamanho O (1)
Capacidade O (1)
Porcentagem O (1)
Inserir em O (n)
Remover em O (n)
Get em O (n)
Limpar O (n)
Final O (1)
Início O (1)
Remover O (n)
Encontrar O (n)
Contar O (n)
Somar O (n)
O vetor dinâmico é uma estrutura de dados que oferece acesso aleatório eficiente aos
elementos. Ele é implementado usando um array subjacente que pode redimensionar-se
automaticamente quando necessário. As operações principais incluem inserção, remoção,
acesso e busca de elementos.
Método Redimensionar
Este método redimensiona o array quando ele fica cheio ou quando o número de elementos cai
abaixo de um quarto da capacidade.
Construtor e Destrutor
O construtor inicia o vetor com uma capacidade padrão de 10 e o destrutor libera a memória
alocada.
Método Inserir
Método remover_em
● Verificação de índice: Certifica-se de que o índice está dentro dos limites válidos antes
de retornar o valor.
Inserir_Inicio O (n) -
Inserir_em O ( n) -
Remover_em O (n) -
apagar_inicio O (n) -
capacidade O (1) -
porcentagem_ocupada O (1) -
inicio O (1) -
encontrar O (n) -
contar O (n) -
soma O (n) -
limpar O (n) -
03.03 - Medição do Tempo de Execução
Para medir o tempo de execução das operações, utilizamos a biblioteca ‘chrono’ do C++.
Explicação do Código:
04 - Teste de Inserção
O teste de inserção mede o tempo total para inserção de elementos em um vetor dinâmico Os
elementos são lidos da entrada padrão e inseridos no vetor usando o método ‘inserir’.
Inserção 4,529,953
05 - Teste de remoção
O código de remoção mede o tempo total para remoção de elementos de um vetor dinâmico.
Inicialmente 10000 elementos são inseridos no vetor. Em seguida, elementos são lidos da
entrada padrão e removidos do vetor usando o método ‘remover_em’.
128 2861.02
1. Ferramentas Necessárias:
○ Compilador C++ (GCC, Clang, etc.)
○ Ambiente de desenvolvimento (IDE como Visual Studio Code ou CLion, ou linha
de comando)
○ Biblioteca chrono do C++ para medir o tempo de execução
○ GitHub Codespaces (ou qualquer ambiente de desenvolvimento configurado)
2. Estrutura dos Arquivos:
○ listaligada.cpp: Implementação da lista duplamente ligada;
○ vetordinamico.cpp: Implementação do vetor dinâmico;
○ testeligada.cpp: Código de teste para a lista duplamente ligada;
○ testearray.cpp: Código de teste para o vetor dinâmico;
○ testeinsercao.cpp : Arquivo teste inserção;
○ testeRemover.cpp: Arquivo teste remoção;
○ TesteREMOVER.txt : Pasta com todos os testes de remoção;
○ TesteInserir.txt: Pasta com todos os arquivos testes de inserção.
Copiar código
./testevetor
./testeligada
Após analisar os tempos de execução e comparar as duas estruturas de dados, podemos tirar
algumas conclusões importantes:
Acesso Aleatório: No entanto, a lista duplamente ligada pode ser menos eficiente para
acesso aleatório. Para encontrar um elemento específico, é necessário percorrer
metade da lista em média, resultando em uma complexidade de tempo O(n).
● Vetor Dinâmico:
Prioridade nas Operações: A escolha entre lista duplamente ligada e vetor dinâmico
depende das prioridades do seu programa. Se inserções e remoções frequentes em
posições arbitrárias forem mais comuns, a lista duplamente ligada pode ser mais
adequada.