Estruturas de Dados 101: Arrays – A Visual Introduction for Beginners

Conheça as estruturas de dados que você usa todos os dias.

👋 Bem-vindo! Vamos começar com algum Contexto Vital. Deixe-me perguntar-lhe isto:
✅ Ouve música no seu smartphone?
✅ Mantém uma lista de contactos no seu telefone?
✅ Alguma vez viu um quadro de líderes durante uma competição?

Se a sua resposta for “sim” a alguma destas perguntas, então é quase certo que usou arrays e nem sequer o sabia! 😃 Os arrays são estruturas de dados muito poderosas que armazenam listas de elementos. Eles têm aplicações infinitas. Eles são muito importantes no mundo da informática.

Neste artigo, você aprenderá os prós e contras dos arrays, sua estrutura, operações e casos de uso.

Comecemos! 👍

🔎 Mergulhe profundamente na estrutura básica das arrays

Para entender como elas funcionam, é muito útil visualizar a memória do seu computador como uma grade, assim como a que se segue. Cada peça de informação é armazenada em um daqueles pequenos elementos (quadrados) que fazem a grade.

Arrays aproveita esta estrutura de “grade” para armazenar listas de informações relacionadas em locais de memória adjacentes para garantir extrema eficiência para encontrar esses valores. 🔳🔳🔳🔳🔳

Pode pensar em arrays como este:

Os seus elementos estão ao lado uns dos outros na memória. Se você precisar acessar mais de um deles, o processo é extremamente otimizado, pois seu computador já sabe onde o valor está localizado.

Fantástico, certo? Vamos aprender como isto funciona nos bastidores! 😃

📚 Classification

Arrays are classified as Homogeneous Data Structures because they store elements of the same type.

They can store numbers, strings, boolean values (true and false), characters, objects, and so on. Mas uma vez definido o tipo de valores que seu array irá armazenar, todos os seus elementos devem ser do mesmo tipo. Você não pode “misturar” diferentes tipos de dados.

👀 Reading Values – The Magic Begins!

O incrível poder dos arrays vem de sua eficiência para acessar valores. Isto é conseguido graças à sua estrutura em forma de grelha. Vamos dar uma olhada mais detalhada nisto.🔍

Quando você cria um array, você:
– Atribua-o a uma variável. 👈
– Defina o tipo de elementos que ela irá armazenar. 🎈
– Define o seu tamanho (o número máximo de elementos). 📚

💡 Nota: O nome que você atribui a esta variável é muito importante porque você a usará mais tarde em seu código para acessar valores e modificar o array.

Mas como você pode dizer ao computador qual valor em particular você gostaria de acessar? Aqui é onde os índices têm um papel vital!

1️⃣ Indices

Você usa o que é chamado de “index” (“índices” no plural) para acessar um valor em um array. Este é um número que se refere ao local onde o valor é armazenado.

Como você pode ver no diagrama abaixo, o primeiro elemento no array é referido usando o índice 0. Conforme você se move mais para a direita, o índice aumenta em um para cada espaço na memória.

💡 Nota: Eu sei que parece estranho no início começar a contar a partir de 0 ao invés de 1, mas isto é chamado de Numeração Baseada em Zero. É muito comum na informática.

A sintaxe geral para acessar um elemento é: <ArrayVariable>

Por exemplo:
Se o seu array está armazenado na variável myArray e você quer acessar o primeiro elemento (no índice 0), você usaria myArray

2️⃣ Memória

Agora que você sabe como acessar valores, vamos ver como os arrays são armazenados na memória do seu computador. Quando você define o tamanho do array, todo esse espaço na memória é “reservado” a partir daquele momento para valores futuros que você pode querer inserir.

💡 Nota: Se você não preencher o array com valores, esse espaço será mantido reservado e vazio até que você o faça.

Por exemplo:
Vamos dizer que você define um array de tamanho 5 mas apenas insira um valor. Todo esse espaço restante será vazio e “reservado” na memória, esperando por futuras atribuições.

Esta é a chave porque os arrays são extremamente eficientes no acesso aos valores porque todos os elementos são armazenados em espaços contíguos na memória. Desta forma, o computador sabe exatamente onde procurar para encontrar as informações solicitadas.

Mas… há uma desvantagem: 😞 porque isto não é eficiente em termos de memória. Você está reservando a memória para operações futuras que podem não ocorrer. É por isso que as arrays são recomendadas em situações em que você sabe de antemão quantos elementos você vai armazenar.

🔧 Operações – Bastidores!

Agora você sabe o que são arrays quando eles são usados, e como eles armazenam elementos, vamos mergulhar em suas operações como inserção e remoção.

1️⃣ Inserção – Bem-vindo!

Vamos dizer que temos uma matriz de tamanho 6 e ainda há um espaço vazio. Queremos inserir um elemento “e” no início do array (índice 0), mas este lugar já está ocupado pelo elemento “a”. O que devemos fazer?

Para inserir em arrays, movemos todos os elementos localizados à direita do local de inserção, um índice para a direita. O elemento “a” estará agora no índice 1, o elemento “b” estará no índice 2 e assim por diante…

💡 Nota: Você precisará criar uma variável para acompanhar o último índice que contém elementos. No diagrama acima, o array é preenchido até o índice 4 antes da inserção. Desta forma, você pode determinar se o array está cheio e que índice você deve usar para inserir um elemento no final.

Depois de fazer isso, nosso elemento é inserido com sucesso. 👏

⚠️ Espere um minuto! O que acontece se o array estiver cheio?

O que você acha que vai acontecer se o array estiver cheio e você tentar inserir um elemento? 😱

Neste caso, você precisa criar um novo e maior array e copiar manualmente todos os elementos para este novo array. Esta operação é muito cara, em termos de tempo. Imagine o que aconteceria se você tivesse um array com milhões de elementos! Isso poderia demorar muito tempo para ser concluído. ⏳

💡 Nota: A única exceção a esta regra, quando a inserção é muito rápida, é quando você insere um elemento no final do array (no índice localizado à direita do último elemento) e ainda há espaço disponível. Isto é feito em tempo constante O(1).

2️⃣ Deletion- Bye, Bye!

Agora vamos dizer que você quer excluir um elemento do array.

Para manter a eficiência do acesso aleatório (podendo acessar o array através de um índice extremamente rápido) os elementos devem ser armazenados em espaços contíguos de memória. Você não pode simplesmente apagar o elemento e deixar esse espaço vazio.

Você deve mover os elementos que vêm depois do elemento que você quer apagar um índice a esquerda.

E finalmente, você tem este array resultante 👇. Como você pode ver, “b” foi excluído com sucesso.

💡 Nota: A exclusão é muito eficiente quando você remove o último elemento. Como você precisa criar uma variável para acompanhar o último índice que contém elementos (no diagrama acima, índice 3), você pode remover diretamente esse elemento usando o índice.

3️⃣ Finding an Element

Você tem três opções para encontrar um elemento em um array:

  • Se você sabe onde ele está localizado, use o index.
  • Se você não sabe onde ele está localizado e seus dados estão ordenados, você pode usar algoritmos para otimizar sua busca, como a Busca Binária.
  • Se você não sabe onde ele está localizado e seus dados não estão ordenados, você precisará pesquisar em cada elemento do array e verificar se o elemento atual é o elemento que você está procurando (por favor veja a seqüência de diagramas abaixo).

👋 Em Resumo…

  • Arrays são estruturas de dados extremamente poderosas que armazenam elementos do mesmo tipo. O tipo de elementos e o tamanho do array são fixos e definidos quando você o cria.
  • A memória é alocada imediatamente após a criação do array e fica vazia até que você atribua os valores.
  • Os seus elementos estão localizados em locais contíguos na memória, assim eles podem ser acessados de forma muito eficiente (acesso aleatório, O(1) = tempo constante) usando índices.
  • Índices começam em 0, não 1 como estamos acostumados.
  • Inserir elementos no início ou no meio do array envolve mover elementos para a direita. Se o array estiver cheio, criando um novo array maior (que não é muito eficiente). Inserir no final do array é muito eficiente, tempo constante O(1).
  • Removendo elementos do início ou do meio do array envolve mover todos os elementos para a esquerda para evitar deixar um espaço vazio na memória. Isto garante que os elementos sejam armazenados em espaços contíguos na memória. Remover no final do array é muito eficiente porque você só apaga o último elemento.
  • Para encontrar um elemento, você precisa verificar o array inteiro até encontrá-lo. Se os dados estiverem ordenados, você pode usar algoritmos como Binary Search para otimizar o processo.

“Learn from yesterday, live for today, hope for tomorrow”. O importante é não parar de questionar”
– Albert Einstein

👋 Obrigado!

Eu realmente espero que você tenha gostado do meu artigo. ❤️
Siga-me no Twitter para encontrar mais artigos como este. 😃

Deixe uma resposta

O seu endereço de email não será publicado.