A Necessidade de Estruturas de Dados
Wise men say
Only fools rush in
But I can’t help
Falling in love with you(Can’t Help Falling In Love — Elvis Presley)
Sumário
- Definição e Importância das Estruturas de Dados
- Exemplos de Estruturas de Dados
- Desafios para Estrutura de Dados
- Conclusão
Definição e Importância das Estruturas de Dados
Estruturas de dados são como os alicerces de um edifício na computação. Assim como um bom alicerce sustenta um prédio, as estruturas de dados apoiam o processamento e a organização eficientes dos dados. São essenciais para a criação de programas eficazes e ajudam a gerenciar e organizar os dados de forma que possam ser usados eficientemente. Você verá que impossível não se apaixonar por elas.
Imagine um armazém com prateleiras, caixas e etiquetas. Cada item armazenado tem um lugar específico e um método de identificação. Da mesma forma, estruturas de dados organizam e mantêm dados de forma que possam ser acessados, manipulados e armazenados de maneira eficiente. Diversas vezes permitindo o desenvolvimento de algoritmos importante na computação e ajudando na resolução de problemas. Ou seja, de forma resumida é como se você escolhesse organizar os dados de uma determinada maneira, como se fosse um “layout”.
Estruturas de dados permite que escalabilidade de diversos algoritmos e sistemas de computação e ajuda a melhorar o desempenho, pois com a ferramenta certa o trabalho de desenvolvimento pode ser realizado da maneira correta.
Uma comparação que pode-se fazer acerca das estruturas de dados é que podem ser vistas como diferentes ferramentas em uma caixa de ferramentas, cada uma com seu uso específico, ou seja, possuímos alguns tipos e cada um com a sua peculiaridade e momento de ser usada.
Exemplos de Estruturas de Dados
Como foi dito, vamos pensar em estruturas de dados como ferramentas a serem usadas. Algumas dessas ferramentas são:
- Arrays: São como itens numerados em ordem em uma prateleira (memória) e acessa-os diretamente pela posição que ela ocupa na fileira. Perceba que os elementos são armazenados em regiões consecultivas de memória. Veja um exemplo da declaração de array de inteiros em Go:
var numeros [4]int
- Listas Encadeadas: São como um trem de brinquedo, onde cada vagão (nó) está ligado ao próximo, facilitando adicionar ou remover vagões. O dado(vagão) sempre aponta para o seu seguinte, mas eles estão em lugares não consecutivos de memória, é assim que funciona uma lista encadeada, isso facilita a remoção e o seu tamanho não precisa ser estático como um Array, pois sempre temos informação do seu vizinho. Diferente do array, para acessar o “vagão” 4, por exemplo, temos que passar pelo vagão 0, 1, 2 e 3, necessariamente. Portanto, o acesso aos elementos se torna mais lento do que no array.
- Pilhas: Funciona basicamente como uma pilha de pratos você só podemos adicionar ou remover o prato do topo. (Last In, first Out — Último a entrar, primeiro a sair). É a estrutura de dados utilizada internamente pelo computador para armazenar suas informações. Podemos verificar sua existência, por exemplo, quando ocorre um erro em linguagens de alto nível e nos aparece a pilha de chamada de funções.
- Filas: São como uma fila no banco; o primeiro que chega é o primeiro a ser atendido (First In, First Out — Primeiro a entrar, primeiro a sair). Estrutura de dados implemementada dentro dos roteadores, visto que a prioridade é processar as primeiras requsições que entraram por aquele roteador..
- Árvores: São como uma árvore genealógica, onde temos um ancestral (o nó raiz), e esse ancestral tem filhos, formando uma hierarquia. Essa estrutura de dados é muito utilizada dentro dos sistemas operacionais para discriminar arquivos. Já percebeu que uma pasta sempre pertence a outra? No final das contas, elas formam uma árvore. Veja uma representação de como é representado as pastas no seu sistema operacional.
- Tabela Hash: São como catálogos, onde você pode encontrar rapidamente uma informação com base em uma chave. Ou seja, é uma estrutura de dados chamada de Key-Value, porque você possui uma chave e aquela chave está associada a um valor específico. Sua utilização é bastante quando desejamos buscar rapidamente algum elemento de um conjunto de dados. Vamos representar como podemos usar essa estrutura de dados em Go.
func main() {
// Criando um map para armazenar idades e a chave é o nome da pessoa
idades := make(map[string]int)
// Atribuindo valores ao map
idades["Eliabe"] = 27
idades["gabriel"] = 20
idades["Ruslanna"] = 18
// Acessando e imprimindo um valor
fmt.Println("Idade de Ruslanna:", idades["Ruslanna"])
// Iterando sobre o map
for nome, idade := range idades {
fmt.Printf("%s tem %d anos\n", nome, idade)
}
}
Além disso, vê-se que ele não ficou na ordem que foi preenchido, isso é comum de acontecer, porque a tabela Hash geralmente não possui uma ordem.
- Há outros tipos de estruturas de dados comuns, porém vamos especificando mais sobre elas a medida que fomos resolvendo mais problemas do NeetCode.
Desafios para Estrutura de Dados
A escolha da estrutura de dados certa em programação é crucial e pode ser comparada à escolha do equipamento certo para uma expedição. Cada decisão traz consigo uma série de prós e contras, e a escolha adequada depende de uma variedade de fatores.
Se escolhermos uma tabela hash para algum problema que exige uma ordenação é pedir para provavelmente escrever um algoritmo ineficiente, sendo que poderíamos ter outras soluções melhores. Porém se você precisa verificar a existência de um elemento, com certeza é mais interessante utilizar uma tabela hash, pois se, por exemplo, utilizassemos um Array teríamos que varrer completamente o Array e isso levaria mais tempo do que utilizar uma tabela hash que era basicamente verificar se a chave tem um valor associado a ela.
Esses são apenas alguns exemplos de como uma escolha correta da estrutura de dados para um determinado problema pode ser importante, como se fosse realmente fosse a chave de fenda certa para o tamanho do parafuso.
Conclusão
Em suma, estruturas de dados são a espinha dorsal da computação, essenciais para o armazenamento, manipulação e recuperação eficiente de diversos dados. Não há como construir um software eficiente sem pelo menos um conhecimento básico de estruturas de dados, são formas de se construir algoritmos importantes e resolver problemas cada vez mais difíceis.
Por Gabriel Palitot e revisado por Eliabe Bastos.