Menu

Estrutura de Dados - Teoria

Domínio de Dados

É um conjunto determinado de objetos que pode ser finito ou infinito.

Exemplos: 

Domínio de dados números inteiros: D = {..., -4, -3, -2, -1, 0, 1, 2, 3, 4, ...}
Domínio de dados letras do alfabeto brasileiro: A={A, a, B, b, ..., Z, z}
Domínio de dados de um despertador D={horaAtual, horaAlarme, modoAlarme}
Domínio de dados de uma agenda telefônica A={nome, endereço, telefone}

Quando queremos representar objetos de um determinado domínio criamos maneiras especiais para representá-los. Daí podemos ter um domínio simples ou estruturado.

Domínio simples

São objetos indivisíveis, atômicos, não acessíveis ao programador. 
  1. Primitivos: embutidos na linguagem de programação, não precisamos defini-los (garante invisibilidade e proteção). (ex em c++: int, float, char, double, bool).
  2. Definidos: enumeração ou restrição.(ex em c++: enum, short, signed e unsigned)

Domínio Estruturado

Construídos por componentes que são objetos de domínios  menos complexos.
  1. Homogêneo: componentes que pertencem ao mesmo domínio. (string, array, ponteiro)
  2. Heterogêneo: componentes que não são necessariamente do mesmo domínio. (struct)

Tipo de Dados

É um conjunto de objetos e um conjunto de operações aplicáveis a estes objetos.

Objetos + Operações = Tipo de Dados

Exemplo: 

Conjunto de objetos: Números naturais
Conjunto de operações: operações algébricas (+, -, *) + operações lógicas em que podem ser usados (&&, ||, !)

Tipos primitivos

Qualquer linguagem de programação oferece tipos de dados primitivos (próprios da linguagem), por exemplo: inteiro, float, character, booleano. E estas linguagens também nos permitem combinar esses tipos primitivos, por exemplo, conjunto de inteiros formando um vetor de números inteiros.


Em suma:


Listas - Html

Há três tipos de listas em HTML:

  1. Listas Ordenadas,
  2. Listas Não Ordenadas e,
  3. Listas de Definição

Listas Ordenadas

<ol>
<li>Primeiro Item</li>
<li>Segundo Item</li>
</ol>


Isso deve gerar itens numerados. Há estilos que podemos aplicar as listas ordenadas, assim como podemos definir o item do qual ela começará.

Atributos:

type:
"A" - A, B, C, D...
"a" - a, b, c, d....
"I" - I, II, III, IV, ...
"i" - i, ii, iii, iv, ....
"1" - 1, 2, 3, 4, ....

start: para indicar o elemento inicial.


Exemplo:

<ol type="I" start=3>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ol>

Este código gerará um lista ordenada do tipo algarismos romanos iniciando no terceiro (III).

Listas Não Ordenadas

Cria listas com pontinhos... 
Exemplo de código:

<ul>
<li>LNO 1</li>
<li>LNO 2</li>
<li>LNO 3</li>
</ul>

Listas de Definição

Cria listas para definição de algo, por exemplo, café.

<dl>
<dt>Café</dt>
<dd>Bebida quente e gostosa</dd>
<dt>Leite</dt>
<dd>Bebida derivada de animal</dd>
</dl>
Teste e veja como fica (:

Para quem quer aprender a programar...

Num mundo tão curto e com tanta informação fica difícil saber filtrar adequadamente como investir seu tempo. Neste planeta capitalista e egocêntrico, em que as pessoas são um pouco canibais - e eu realmente acho, além da metáfora, que elas só não comem umas as outras pra manter o status social -, ainda existem almas salvadoras que não te comem por você não saber quem é o prefeito da indonésia.

No que tange a educação, o site Codecademy se destaca. Para quem não sabe é uma startup que tem pouco mais de um ano, criada por dois jovens de 22 anos - Zach Sims e Ryan Rubinski.  O site tem o projeto de ensinar linguagem de programação sem custo nenhum a qualquer pessoa do mundo conectada a internet. Ao entrar no site, você já é incitado a programar numa pequena apresentação pessoal... e logo depois pode "guiar" seus estudos através de trilhas, de acordo com seu ritmo, quase um método Kumon virtual...

“Programação é parte das linguagens necessárias no século 21. Nós achamos que programar ajuda a pessoa a ter diferentes pontos de vista e a alcançar seus sonhos”

Palavras de Sims (co-fundador). Realmente, neste mundo canibal quem tem conhecimento se destaca e porque não conhecimento em programação? Até o prefeito de Nova York, no ano passado, postou no Twitter que utiliza o site. Qual a sua desculpa agora?

E aos colegas da área afobados de plantão, que acham que saber só uma linguagem é suficiente, tenho uma triste noticia: não é. Mesmo quem trabalha com suporte, nunca se sabe quando vai precisar saber SQLServer para implementar alguma coisa urgente (já tendo esse conhecimento, polpa-se tempo, e tempo costumam dizer é dinheiro). Uma vez que você aprende os conceitos em uma linguagem (ainda que não seja pseudo-linguagem) aprender outra linguagem [semelhante] torna-se intuitivo e quase uma brincadeira. Então nada de conversinhas do tipo "Ah, lá não tem java, não quero!". Desculpa. Lá tem sim conceitos de orientação a objetos... pode não estar com as definições formais, mas a idéia é a mesma. O principal é realmente entender como funciona, caso contrário nunca estará apto a criar nada sozinho...

E se você já tem experiência em programação e deseja participar de alguma maratona, o site SPOJ Brasil pode te ajudar. Tem a mesma "interface" do Codecademy, porém voltado para questões de maratona. Não te ensina absolutamente nada, mas te ajuda a saber se seu código é válido.. e possui suporte a praticamente todas as linguagens de programação existentes.

Classes e ID's

Classe

Classes aplicam estilos específicos a grupos de elementos.
Utilizamos o ponto para o seletor e class para a tag. 
Exemplo: 

p {
     font-family: Verdana;
     color: #000;}
p.azul {
          color:  #00F;}
p.verde {
          color: #0F0;}
No HTML, devemos usar a tag class, assim:

<p>Parágrafo comum</p>
<p class="azul"> Parágrafo Azul</p>
<p class="verde">Parágrafo Verde</p>

Este código deve produzir parágrafos com cores distintas.

Também é possível definir classes genéricas que podem ser usadas em qualquer atributo:

CSS:
.verde { color: #0F0;}

HTML:
<h1 class="verde">Título Verde</h1>
<p class="verde">Paragrafo Verde</p>

ID

Os IDs, assim como as classes, definem formatações especificas mas a diferença é que IDs atribuem estilos a um único elemento.
Utilizamos o # para o seletor e o id para a tag.
Exemplo:

No CSS:
p { color: #00F;}
#verde { color: #0F0;}

No HTML:
<p>Paragrafo comum</p>
<p id="verde">id = verde</p>

Recapitulando

Classes podem ser usadas para definir formatações genéricas ou especificas de vários elementos html (tags). Podem ser usados livremente quando declarados de forma genérica. Ao contrario, IDs são válidos apenas para o seletor ao qual foi declarado, tornando a formatação restrita. 

CSS - Posicionamento Absoluto e Relativo

Esse tipo de marcação permite posicionar elementos na página de acordo com as margens (topo, esquerda, direita e abaixo). É exatamente como definir a moldura de um quadro e sua posição na parede.
Há o caso de termos uma parede lisa, nunca furada. Podemos posicionar o quadro em qualquer lugar, bastando indicar a que posição do topo e da esquerda que queremos, por exemplo.

Posicionamento Absoluto

Se na nossa parede já existe anteriormente um quadro, podemos escolher novas posições ao lado, em cima.. etc que não interferem na visualização do quadro atual. Mas no posicionamento absoluto podemos colocar um quadro em cima do outro. Sim. A arte contemporânea dá um risinho de leve nesse momento.
E para termos controle sobre qual deve aparecer primeiro, há algumas regrinhas.

Precisamos definir a "profundidade" de cada quadro. Essa profundidade é marcada através do atributo "z-index". Quanto menor o z-index mais "escondido" um objeto estará. Se o z-index não for definito esta ordem será expressa através da ordem de escrita dos elementos no código. O primeiro objeto colocado será o primeiro "do fundo".. ate o último que ficará "por cima".
Exemplo de código:

.img1 {
      position: absolute;
      top: 0px;
      left: 0px;
      z-index: 1;
      width: 100px;}

.img2 {
      position: absolute;
      top: 20px;
      left: 20px;
      z-index: 2;
      width: 100px;}

.img3 {
      position: absolute;
      top: 40px;
      left: 40px;
      x-index: 3;
      width: 100px;}


Esse código deve produzir um efeito de imagens em cascata...

Posicionamento Relativo

Esse tipo de posicionamento define a posição do quadro de acordo com os outros quadros na parede. O espaço reservado para determinado quadro é mantido e a sobreposição de elementos só acontece quando há um quadro não definido no meio. Um jão perdido.
Exemplo de código:

span {
          font-size: 10px;}

.super {
           position: relative;
           top: -1px;}

.sub {
          position: relative;
          bottom: -1px;

.shiftleft {
          position: relative;
          left: -1px;}

.shiftright {           position: relative;           right: -1px;}

Este código pode ser usado para se escrever sobrescrito, subscrito, a esquerda e a direita, respectivamente.

OBS

Há possibilidade de brincar com o posicionamento dos elementos na página, dependendo da finalidade. É possível criar uma div com posicionamento relativo e inserir dentro dela outra div com posicionamento absoluto. As definições do top, left, right e bottom da div interna absoluta, neste caso, vão se referir a div relativa externa e não a página inteira.

Leitura Recomendada:

Contém exemplos e outras explicações

Métodos Simples de Ordenação

Pra que?

Tornar mais simples e rápido recuperar determinada informação dentro de um conjunto enorme de informações.

Quais são os tipos simples?

  • Troca
  • Seleção
  • Inserção

Aviso

Não existe um método de ordenação que seja universalmente reconhecido como o melhor, que atende a todas as necessidades e seja o único que você precisa saber. Não. Se alguém te disser isso, ignore. Cada caso é um caso e é necessário analisá-lo antes de decidir qual melhor método se aplica a sua necessidade.


Ordenação por Troca

Bubble Sort - Bolha


Neste tipo de ordenação dois elementos são comprados e se o segundo for menor que o primeiro ocorrerá a troca desses elementos numa passagem direta por uma lista (não volta atrás).

Vantagem: estabilidade e simplicidade do algoritmo
Desvantagem: lentidão.

Procedimento (em C) para ordenar o vetor V de números inteiros em que tam é o tamanho do vetor V.

void bubbleSort (int v[], int tam)
{   int i, j, aux;   for(j=0; j<tam-1;j++)     for (i=0;i<tam-1;i++)     {       if(a[i]>a[i+1])       {       aux = a[i];       a[i] = a[i+1];       a[i+1] = aux;       }     } }

Ordenação por Inserção

Insertion Sort


Neste método é feita uma única passagem com vários retornos.
Dois elementos são comparados iniciando no segundo numero da sequência de números que desejamos ordenar. Se o primeiro for maior que o segundo, há a troca entre esses números. Depois, pegamos o terceiro número da sequência e comparamos com o segundo elemento, se o segundo for maior que o terceiro, eles trocam de lugar; a comparação continua entre o segundo e o primeiro; sendo o segundo maior que o primeiro haverá troca de posições caso contrário, nada é feito. O próximo número é o quarto.... e vamos "voltando" e comparando até terminar a sequência.

Vantagem: simplicidade do algoritmo (mais rápido que o BubbleSort)
Desvantagem: lento

void InsertionSort(int v[], int tam)
{
int i,j,aux;
  for(i=1;i<tam;i++)
  {
    aux = v[i];
    j=i-1;
    while (j>=o && v[j]>aux)
    {
      v[j+1] = v[j];
      j=j-1;
    }
    v[j+1] = aux;
  }
}


Ordenação por Seleção

Selection Sort


A cada passagem o menor elemento do vetor é selecionado e colocado na sua posição correta. Durante a ordenação a parte do vetor já ordenada é desconsiderada.
Pegamos o primeiro elemento do vetor e armazenamos seu índice. O vetor inteiro é percorrido a procura de um numero menor que o primeiro. Caso esse número exista, o índice dele é armazenado e a troca é feita, assim por diante..  Neste método de ordenação é o "contrário" do Insertion Sort. Ao invés de voltarmos o vetor, o percorremos a partir do primeiro.

Vantagem: simplicidade do algoritmo
Desvantagem: lentidão.

void SelectionSort (int v[], int tam)
{
int i,j,aux, indiceAux;
  for(i=0;i<(tam-1);i++)
  {
    aux = v[i];
    indiceAux = i;
    for(j=(i+1);i<tam;i++)
    {
      if(v[j] < aux)
      {
        aux = v[j];
        indiceAux = j;
      } 
      v[indiceAux] = v[i];
      v[i] = aux;
    }
  }
}