Introdução à estrutura de dados

última atualização: 04 de fevereiro de 2021

Para melhor entender o conteúdo de “Estrutura de dados” é importante conhecer o funcionamento de um computador. Stallings (2017) afirma que “um computador é um sistema complexo” pois, pode conter milhões de componentes eletrônicos. Com o objetivo de revisar alguns conceitos importantes e melhor entender os computadores, esse post apresenta a definição de arquitetura e de organização, as funções e os níveis de um computador.

Inicialmente vamos rever alguns conceitos importantes, seguindo a definição proposta por Stallings (2017) .

Arquitetura de computador: atributos de um sistema visíveis ao programador – possuem impacto direto sobre a execução lógica de um programa. O ISA (Instruction Set Architecture) por exemplo, define os formatos de instruções, códigos de operação da instrução (opcodes), registradores, memória de dados e instrução; o efeito das instruções executadas nos registradores e na memória; e um algoritmo para o controle da execução das instruções.
– Definição de um inteiro com 32 bits. Operação de soma.

Organização de computador: unidades operacionais e suas interconexões que realizam as especificações arquiteturais. São detalhes de hardware transparentes ao programador, como sinais de controle, interfaces entre o computador e periféricos e a tecnologia de memória utilizada.
– Frequência de clock. Posições de memória.

Funções de um computador

Desde a arquitetura proposta por Von Neumann, é necessário que os computadores apresentem quatro as funções básicas: Processamento, Armazenamento, Movimentação e Controle. A Figura 01 apresenta a visão de Stallings (2010) sobre essas funções. Se você já está familiarizado com elas, pule a leitura para a Figura 01.

  • Processamento de dados: Os dados podem assumir diversas formas, em diferentes intervalos e necessitarem de diferentes operações de processamento. Não importam as condições, o computador deve ser capaz de processá-los.
  • Armazenamento de dados: Há dois tipos de armazenamento de dados. O armazenamento temporário, que mantém um dado armazenado (em registradores, memória RAM, etc…) apenas o tempo necessário para ser utilizado e depois o descarta. E o armazenamento permanente, que representa o armazenamento de dados em arquivos que são salvos pelo computador (em SSD, pendrive, etc…) e permitem recuperação, edição e exclusão dos mesmos a longo prazo.
  • Movimentação de dados: Se há armazenamento, recuperação, processamento e edição de dados, o computador deve ser capaz de movimentar esses dados. Seja entre um arquivo e o processador, entre um arquivo e outro ou entre posições de memória, etc. é necessário que ocorra movimentação da dados.
  • Controle: É necessário controlar a movimentação, o armazenamento e o processamento desses dados. Afinal, qual é a operação? De onde vem os valores? Para onde vão os resultados? “Uma unidade de controle gerencia os recursos do computador e coordena o desempenho de suas partes em resposta a essas instruções”.
Figura 01 – Uma visão Funcional do computador (STALLINGS, 2010)

Além de conseguir executar essas funções com sucesso é importante estabelecer um “contato” amigável com o usuário. Para facilitar o entendimento de como isso funciona leia a próxima seção.

Níveis de um computador

Do ponto de vista de usuário tudo parece gráfico, mas para o computador tudo é pulso elétrico (bits de valor, de endereço ou de instrução a serem armazenados, lidos ou processados,). Tanenbaum (2013) apresenta a Figura 02 para explicar um computador de seis níveis. Nessa Figura é possível visualizar os níveis indicados, embaixo de cada nível o método de suporte para o mesmo e o nome do programa que o suporta entre parênteses. Os parágrafos após a Figura 02, trata brevemente cada um dos níveis, se você os compreende pode pular a leitura.

Figura 02 – Um computador com seis níveis (TANENBAUM, 2013)

Em uma visão Up-Down (de cima para abaixo), observa-se no topo o nível 5, nível de linguagem orientada a problema. Nesse nível encontram-se as linguagens de alto nível utilizadas pela maioria dos programadores de aplicações. Programas escritos nessas linguagens em geral são traduzidos para os níveis 3 ou 4 por tradutores conhecidos como compiladores, embora às vezes sejam interpretados, em vez de traduzidos.

O nível 4 representa o nível de linguagem de montagem (Assembly), ele permite que programadores escrevam códigos para os níveis 1, 2 e 3 em uma forma não tão desagradável quanto às linguagens de máquina virtual em si. Programas em linguagem de montagem são primeiro traduzidos para linguagem de nível 1, 2 ou 3, e só depois podem ser interpretados pela máquina.

No nível 3, nível de máquina de sistema operacional, são encontradas instruções definidas no ISA (Intruction Set Architecture), essas intruções são executadas direto pelo controle do hardware (microprograma). Esse nível também possui um conjunto de novas instruções, organização de memória diferente, capacidade de executar dois ou mais programas simultaneamente e diversos outros recursos gerenciados pelo Sistema Operacional (que roda no nível 2). Desse nível para baixo as instruções deixam de ser compreensíveis para a grande maioria dos programadores de aplicações, pois passam a ser expressas por linguagens numéricas (estudadas por programadores de sistemas).

O nível 2 ISA é o nível apresentado pelos manuais, eles descrevem as instruções executadas de modo interpretativo pelo microprograma ou circuitos de execução do hardware. Em casos com dois ou mais interpretadores, é necessário fornecer dois ou mais manuais de referência da “linguagem de máquina” (um para cada interpretador).

No nível 01, de microarquitetura, se vê um conjunto de registradores que formam uma memória local e um circuito chamado ULA – Unidade Lógica e Artitmética (ou ALU – Arithmetic Logic Unit). Em algumas máquinas, a operação do caminho de dados é controlada por um programa chamado microprograma, em outras, diretamente pelo hardware. Em máquinas com controle do caminho de dados por software, o microprograma é um interpretador para as instruções no nível 2.

No nível 0, nível lógico digital, os objetos são chamados de portas (ou gates). Cada porta tem uma ou mais entradas digitais (sinais representando 0 ou 1) e calcula como saída alguma função simples dessas entradas, como AND (E) ou OR (OU). As portas podem ser combinadas para formar uma memória de 1 bit, que consegue armazenar um 0 ou um 1. As memórias de 1 bit podem ser combinadas em grupos de (8, 16, 32, 64) para formar registradores.

Abaixo do nível zero poderia ser considerado mais um nível, que poderia ser denominado nível de dispositivo. Esse nível representaria transistores individuais. Normalmente descrito por autores da área de eletrônica.

Algoritmos

Algoritmos determinam a execução de procedimentos computacionais que de forma geral, transformam entradas em saídas. Ahh, eles precisam ser bem definidos, se não, nada funciona! Cormen e Leiserson (2017) afirmam “que devemos considerar algoritmos como uma tecnologia, lado a lado com hardware rápido, interfaces gráficas do usuário, sistemas orientados a objetos e redes”.

Um exemplo muito comum, encontrado na literatura é o problema de ordenação. Tem se a necessidade de ordenar uma lista de códigos em ordem crescente. Formalmente pode-se definir esse problema como:

Entrada: Uma sequência de n números quaisquer (que provavelmente estarão desordenados). E = [n1, n2, n3…nn]
E = [ 3, 1, 2, 4, 5]

Saída: Uma sequência ordenada dos n números recebidos. S = [n1′, n2′, n3’…nn’] tal que n1′ ≤ n2′ ≤ n3’… ≤ nn’
S = [1, 2, 3, 4, 5]

Para solucionar esse problema, é necessário desenvolver uma sequência de procedimentos que recebam o conjunto E, comparem de algum modo, reorganizem os valores de forma ordenada e devolvam o conjunto S. Algoritmos de ordenação serão estudados com mais ênfase nos próximos posts, pois é um problema comum na vida real dos programadores e permite encontrar ou programar uma ampla gama de diferentes soluções. A seguir é apresentado um algoritmo simples de ordenação (bubbleSort), implementados em Python.

def ordenacaoBolha(entrada):
    if len(entrada) <= 1:
        saisa = entrada
    else:
        for j in range(0,len(entrada)):
            for i in range(0,len(entrada)-1):
                if entrada[i]>entrada[i+1]:
                    temporaria = entrada[i+1]
                    entrada[i+1] = entrada[I]
                    entrada[i] = temporaria
        saida = entrada
    return saida

Referências:
Cormen, Thomas, Leiserson, Charles,Rivest, Ronald. Algoritmos. GEN LTC.
Stallings, William. Arquitetura e organização de computadores.
Tanenbaum, Andrew S. Organização Estruturada de Computadores.

28 thoughts on “Introdução à estrutura de dados

  1. no ultimo nivel, de pulsos eletricos, quanto mais simples o codigo em alto nivel, menos energia consume, exigindo menos pulsos, e resolvendo o problema com mais eficiencia.

  2. Referente às funções de um computador, podemos simplificar a definição de sua função como transformar dados em informações. Considerando que um dado por si só não traz uma informação ao usuário, e sim a organização de mais de um, ou vários dados, precisou-se controlar e estruturar esta transformação de dado em informação.
    Como esta transformação gera um processo organizado e controlado, onde a movimentação dos dados acontece dentro de padrões pré estabelecidos até a sua armazenagem, tem-se as etapas deste processo como a definição das funções de um computador.

  3. Os computadores são maquinas programáveis que podem ser definidos como equipamentos que possuem entrada de dados, processamento e controle, armazenamento e saída de dados. Existem diversos níveis de um computador, iniciando desde o nível de pulsos elétricos até o nível de linguagem de programação de alto nível, que são a interface de comunicação entre o programador e a maquina. Os algoritmos são escritos em linguagem de programação de alto nível e em seguida ocorre a compilação ou interpretação dos comandos e a tradução do código para linguagem de maquina, os comandos posteriormente são convertidos em pulsos elétricos que são interpretados pelos componentes eletrônicos do computador.
    Na arquitetura de computadores defendida por John Von Neumann o computador é uma maquina digital que pode armazenar seus programas no mesmo espaço de memoria dos dados e em seguida manipular os programas. Assim, a maquina é composta por uma memoria, uma unidade lógica aritmética, uma unidade central de processamento (CPU) composta por vários registradores e uma unidade de controle que faz a busca pelo programa (instruções) na memória e o executa sobre dados de entrada.

  4. Na questão do armazenamento, a memória pode ter três classificações: memória primária, com a memória RAM (Random Access Memory) e memória ROM (Read-Only Memory), memória secundária, com o disco rígido e mídias removíveis, e a memória terciária, geralmente são encontradas em sistemas mais complexos, com acesso mais lento que a secundária, e não se limitando apenas a sua memória individual e física, podemos armazenar no ciberespaço através de discos virtuais.

  5. Pela leitura do post, é possível identificar que um computador é um sistema em cascata com seus 6 níveis. Tendo isso em vista, há dois possíveis gargalos nesse sistema: um hardware limitado e/ou um algoritmo mal projetado.
    Um algoritmo bem feito pode funcionar perfeitamente bem em hardwares competentes mas ao se deparar com um hardware limitado encontrar um gargalo que prejudique seu desempenho. Porém, algoritmos bons em hardwares limitados ainda podem ser capazes de executar sua função com eficácia.
    Isso posto, o inverso é mais difícil de existir. Mesmo hardwares poderosos podem não ser capazes de executar algoritmos ruins. Por mais poderosos que sejam, seus recursos ainda são limitados. Algoritmos ruins tornam o processamento difícil para qualquer hardware.
    Fazendo uma breve analogia, os algoritmos são o topo da hierarquia, sendo o topo mal projetado e mal executado, todo o resto irá mal. Não à toa a citação no post à Cormen e Leiserson(2017) afirma que algoritmos devem ser estudados como uma tecnologia em si, assim como hardware e redes.

  6. As linguagens de alto nível tem a função de facilitar a maneira de programar, tornando possível o programador se expressar de maneira mais simples, as linguagens de alto nível proporcionam um aprendizado facilitado.
    Já a linguagens de baixo nível são mais complexas com um aprendizado um pouco mais dificultado, porém tem um melhor aproveitamento da arquitetura da máquina e mais velocidade de processamento.
    Exemplo:

    Em Python (alto nível):

    print(“Hello World!”)

    Em Assembly (baixo nível):

    lea si, string
    call printf
    hlt
    string db “Hello World!”, 0
    printf PROC
    mov AL, [SI]
    cmp AL, 0
    je pfend
    mov AH, 0Eh
    int 10h
    inc SI
    jmp printf
    pfend:
    ret
    printf ENDP

  7. Existe dois tipos de programadores, os programadores de aplicação que desenvolvem sistemas a níveis de usuário, o software, e o programadores de sistema que são todos os programas em que o sistema operacional consegue identificar, chamadas em que o sistema operacional faz, nível 2 e 3.

  8. Existem varias operações básicas em Estruturas de Dados, como por exemplo:

    -Inserir um novo item;
    -Excluir um item existente;
    -Localizar (procurar) um elemento específico;
    -Varrer (percorrer) todos os itens constituintes da estrutura para visualização;
    -Classificar (ordenar), o que consiste em colocar os itens de dados em uma determinada ordem (numérica, alfabética, etc.).

  9. Como já citado no texto acima, cada porta tem duas entradas digitais representadas por 0 ou 1. Em computação cada 0 ou 1 é chamado de bit. Um agrupamento de 8 bits forma um byte.
    Abaixo estão algumas Portas Lógicas Básicas:

    AND – Utiliza como base o produto lógico.
    OR – Utiliza como base a soma lógica.
    NOT – Utiliza como base o operador de inversão.
    A partir da combinação delas, são criados sistemas mais complexos, capazes de realizarem operações bem mais avançadas.

  10. As principais linguagens de alto nível são: Java, C#, Ruby, Python, Swift, JavaScript e PHP. Dentre elas podemos destacar a Ruby e o Python, que colaboram extremamente com o programador, facilitando e muito a vida de iniciantes na programação.

  11. Referente a ordenação crescente, os algoritmos de ordenação, é um algoritmo que posiciona os elementos de uma dada sequência em uma certa ordem, efetua sua ordenação completa ou parcial com o objetivo de facilitar a recuperação dos dados de uma lista.

  12. Com o desenvolvimento das linguagens de alto nível, o objetivo da independência de
    máquina foi amplamente alcançada. Dado que os comandos das linguagens de alto nível
    não referenciam os atributos de uma dada máquina, eles podem ser facilmente
    compilados tanto em uma máquina como em outra. Assim, um programa escrito em
    linguagem de alto nível poderia, teoricamente, ser usado em qualquer máquina,
    bastando escolher o compilador correspondente.

  13. Ao analisar os níveis de um computador, podemos observar que tudo esta interligado, que isso foi criado para trabalhar em conjunto.
    O nível 5 é utilizado para programações de aplicações, mas esse só será realmente útil se existir os níveis 3 e 4 onde será feita a tradução do que foi programado e poderá ser colocado em prática.
    Já o nível 4 é utilizado para programar os níveis abaixo.
    Desta forma verificamos que os níveis acima são responsáveis pela programação dos níveis inferiores, e os inferiores são os que conseguem traduzir o que se é programado.

    Podemos analisar que os níveis 2 e 3 são sempre interpretados, enquanto os níveis 4 e 5 são, geralmente, traduzidos. As linguagens de máquina dos níveis 1, 2 e 3 são numéricas, ao passo que as dos níveis 4 e 5 são simbólicas, contento palavras e abreviaturas.

  14. Uma conclusão sobre o método bolha:
    Para listas já ordenadas em ordem crescente é o único algoritmo que não realiza movimentações, mas em compensação é o que tem o maior tempo e o maior número de comparações. Não só em listas já ordenadas, mas em todos os casos o método bolha se mostrou um algoritmo ineficiente.

  15. Sobre arquitetura de computadores o hardware e software sao equivalentes, pois qualquer operação efetuada pelo software pode ser tambem implementada pelo hardware, e instruções feitas pelo hardware podem ser simuladas pelo software atraves de maquinas virtuais.

  16. Atualmente com a grande variadade de aparelhos que se roda um software, os algoritmos que tem que ser mais bem pensados e estruturados para rodar sem muito esforço nos mesmos, assim surgiram mimificadores de código que reduzem o tamanho de algumas funções nativas e tamebm4os tranpiladores que transformam códigos de linguagens de maior nível em um nível mais baixo

  17. O processamento de dados pode ser entendido como um conjunto de atividades realizadas em ordem, que resulta em informações “modificadas”, conforme solicitado para que haja uma saída correspondente, pois o algoritmo/software recebem esses dados do usuário sem nenhum tratamento (como uma matéria prima) para depois processar esses dados/informações

  18. Analisando o texto pode se verificar que os computadores vem se tornando indispensáveis na vida das pessoas, empresas, etc…
    Com a evolução das tecnologias e melhoramentos dos hardwares e softwares, os gargalos que antes existiam vem reduzindo gradativamente.

  19. A linguagem de Alto nível oferece muitas vantagens, a compatibilidade, exige apenas que tenha o compilador certo mas pode ser executada em qualquer maquina que eu acho mais importante

  20. Partindo da definição descrita no post por Stallings (2017), arquitetura e organização de computadores é interessante ressaltar que muitos computadores e componentes são fabricados contendo diferentes famílias de modelos, todos com a mesma arquitetura, mas com diferenças de organização. O que resulta em modelos com preços e desempenhos diferentes, contudo podem executar os mesmos programas escritos. O que leva a arquitetura sobreviver por muitos anos, enquanto a sua organização pode ser alterada com novas tecnologias.

  21. Observando o texto, nos Níveis de Um Computador, mais precisamente o Nível 5, os programas são escritos utilizando uma Linguagem de Alto Padrão, sendo, normalmente, interpretados, para rodar nos Níveis 2 e 3. Porém além dos Interpretadores, que transformam as instruções somente no momento em que a mesma será executada, sendo que, para cada nova execução as instruções precisam ser novamente transformadas, já os Tradutores, transformam todo o programa para um nível mais baixo antes de ser executado, podendo ser executado várias vezes.

  22. Os computadores possuem quatro funções básicas: processamento de dados, armazenamento de dados (temporário ou permanente), movimentação de dados (entre a memória e o processador, por exemplo) e o controle (que define quais operações vão ocorrer e envolvendo quais dados).

    Os computadores não são capazes de compreender as linguagens de programação (Python, Java, C) que são utilizadas por desenvolvedores. Portanto, os programas escritos nestas linguagens são traduzidos para o nível de linguagem de montagem (Assembly), que por sua vez são traduzidos para nível de máquina de sistema operacional. Do nível de máquina de sistema operacional, os códigos são traduzidos para o nível ISA (apresentado pelos manuais de referência dos interpretadores). Em seguida, os códigos são traduzidos para o nível de microarquitetura (que envolve um conjunto de registradores e um circuito ULA – Unidade Lógica e Aritmética). Finalmente, os códigos são traduzidos para o nível lógico digital, que envolve portas e entradas digitais (0 ou 1).

    Os algoritmos são um conjunto de instruções que tem como objetivo realizar uma transformação em dados. Um exemplo são os algoritmos de ordenação. Existem diversas formas de resolver um mesmo problema. Portanto, é possível resolver um determinado problema com diversos algoritmos diferentes. Por exemplo, no caso dos algoritmos de ordenação, temos: Insertion sort, Selection sort, Bubble sort.

    • Nem todos os autores apresentam os mesmos níveis, mas de forma geral, é preciso lembrar que tradução e interpretação são termos diferentes.

  23. Em relação aos Algoritmos de Ordenação, e sua importância. A linguagem Python, nos fornece uma função que ordena a lista que solicitarmos (sort()). Entretanto devemos aprender os diversos métodos de ordenação que existem, pois nem sempre programaremos em Python, Muito provavelmente a linguagem que começarmos a programar, não será a mesma que estaremos programando quando formos nos aposentar. Porém a lógica por trás dos algoritmos que criarmos, sim. Principalmente quando o assunto é ordenação, podemos ter certeza que ele vai nos acompanhar por tudo.

    • As diferentes formas de ordenação também nos permitem identificarmos o melhor caso de acordo com o contexto (tamanho e pré-organização da entrada por exemplo).

  24. O computador possui funções básicas que controlam, armazenam, e processam os dados. Por meio da entrada, processamento, controle e saída. De acordo com o artigo, um computador possui 6 níveis, sendo os dois últimos (4 e 5) suportados por tradução e os demais por interpretação. Os Algoritmos estão presente em nosso dia-a-dia resolvendo nossos problemas, no computador não é muito diferente. Um algoritmo conta com uma entrada que é o “input” e uma saída, “output” de informações instruídas, em uma lista por exemplo é totalmente possível ordená-la, facilitando assim a recuperação de seus dados.

  25. Sobre o processamento de dados, a entrada acontece através do hardware, que age coletando os dados e os distribui para o processador. Em seguida, o software responsável faz a recepção, análise, tratamento e conclusão das informações que poderão ser utilizadas.
    Existem quatro tipo de modelos de processamento de dados:
    Em batch: os dados são enviados diretamente ao servidor central;
    Em streaming: o processamento de registros é imediato e sequenciado, ou seja, quando uma informação é processada, inicia-se um novo registro;
    Online: o processamento de dados acontece no momento exato em que a ação é computada;
    Offline: não há conexão direta entre o terminal e o servidor, assim os dados ficam armazenados em um dispositivo até que possam ser transmitidos.

  26. Em Armazenamentos de dados, sobre memória RAM, seria algo extremamente irritante fazer qualquer coisa no computador sem ela, pois a memória RAM, armazena dados temporários e quando não são mais utilizados são descartados, quanto mais memória, melhor é o funcionamento do PC, por experiência própria, sei que no Windows 10, para um bom comportamento e funcionamento do computador, é bom ter pelo menos 8Gb de memória RAM. Caso não tivesse memória RAM no computador seria muito lendo o desempenho, pois teríamos que buscar essas informações no disco rígido do computador(HD).

Leave a Comment