quarta-feira, 27 de agosto de 2014

Compressão de dados - Classificação

Com perdas e sem perdas


Esta é a forma mais conhecida de se classificar os métodos de compressão de dados. Diz-se que um método de compressão é sem perdas (em inglês, lossless) se os dados obtidos após a compressão são idênticos aos dados originais, ou os dados que se desejou comprimir. Esses métodos são úteis para dados que são obtidos diretamente por meios digitais, como textos, programas de computador, planilhas eletrônicas, etc., onde uma pequena perda de dados acarreta o não funcionamento ou torna os dados incompreensíveis. Um texto com letras trocadas, uma planilha com valores faltantes ou inexatos, ou um programa de computador com comandos inválidos são coisas que não desejamos e que podem causar transtornos. Algumas imagens e sons precisam ser reproduzidos de forma exata, como imagens e gravações para perícias, impressões digitais, etc.
Por outro lado, algumas situações permitem que perdas de dados poucos significativos ocorram. Em geral quando digitalizamos informações que normalmente existem de forma analógica, como fotografias, sons e filmes, podemos considerar algumas perdas que não seriam percebidas pelo olho ou ouvido humano. Sons de frequências muito altas ou muito baixas que os humanos não ouvem, detalhes muito sutis como a diferença de cor entre duas folhas de uma árvore, movimentos muito rápidos que não conseguimos acompanhar num filme, todos estes detalhes podem ser omitidos sem que as pessoas percebam que eles não estão lá. Nesses casos, podemos comprimir os dados simplesmente por omitir tais detalhes. Assim, os dados obtidos após a compressão não são idênticos aos originais, pois "perderam" as informações irrelevantes, e dizemos então que é um método de compressão com perdas (em inglês, lossy). Um exemplo bastante expressivo da citação acima é a imagem a seguir:

sexta-feira, 22 de agosto de 2014

Compressão de dados - Introdução

compressão de dados é o ato de reduzir o espaço ocupado por dados num determinado dispositivo. Essa operação é realizada através de diversos algoritmos de compressão, reduzindo a quantidade de Bytes para representar um dado, sendo esse dado uma imagem, um texto, ou um arquivo (ficheiro) qualquer.
Comprimir dados destina-se também a retirar a redundância, baseando-se que muitos dados contêm informações redundantes que podem ou precisam ser eliminadas de alguma forma. Essa forma é através de uma regra, chamada de código ou protocolo, que, quando seguida, elimina os bits redundantes de informações, de modo a diminuir seu tamanho nos ficheiros. Por exemplo, a sequência "AAAAAA" que ocupa 6 bytes, poderia ser representada pela sequência "6A", que ocupa 2 bytes, economizando 67% de espaço.
Além da eliminação da redundância, os dados são comprimidos pelos mais diversos motivos. Entre os mais conhecidos estão economizar espaço em dispositivos de armazenamento, como discos rígidos, ou ganhar desempenho (diminuir tempo) em transmissões.
Embora possam parecer sinônimos, compressão e compactação de dados são processos distintos. A compressão, como visto, reduz a quantidade de bits para representar algum dado, enquanto a compactação tem a função de unir dados que não estejam unidos. Um exemplo clássico de compactação de dados é a desfragmentação de discos.
Nas próximas postagens estudaremos sobre esse assunto, aguardem as postagens.

sexta-feira, 15 de agosto de 2014

Microsoft Azure

O Microsoft Azure é uma plataforma especial para execução de aplicativos e serviços, possui conceitos de
computação em nuvem é um serviço completamente controlado pela microsoft (hospedado) , desse modo o microsoft azure não é  vendido para maquinas físicas como computadores, tablets e etc, ou seja tudo é feito na nossa amiga intente, então você meu caro leitor deve se perguntar o que diabos estou falando sobre essa plataforma se o blog é sobre big data ?, cara criatura inocente computação em nuvem usa grande volume de dados não estruturados e podem definir perfis sobre os usuários e naturalmente essa plataforma prevê essa possibilidade, sendo assim é uma poderosa ferramenta para sistemas que usam Big data. Para uma descrição mais completa segue o link : http://azure.microsoft.com/pt-br/solutions/big-data/

terça-feira, 12 de agosto de 2014

Infoq

Boa noite galera!

Navegando na net achei um site legal que envolve um bocado de assuntos do meio da computação, o Infoq.
Lá vocês vão achar tanto a parte de hardware como também a parte de desenvolvimento, computação inteligente, big data e outros assuntos mais!

Bom aprendizado e aproveitem!

domingo, 10 de agosto de 2014

Especialização em Big Data

Bom meus caros, nosso blog não fala sobre carreira, mas porque não falar sobre especialização em Big Data? Se trata de algumas instituições no Brasil que oferecem ao publico especialização nessa área, que
consiste em capturar,processar e aplicar ao negocio de interesse(Empresa ou órgão), desse modo vale a pena ler a matéria da computer word.
Link: http://computerworld.com.br/carreira/2014/07/10/seis-universidades-passam-a-oferecer-especializacao-em-big-data/

sábado, 9 de agosto de 2014

Algoritmos de Ordenação - Merge Sort



merge sort, ou ordenação por mistura, é um exemplo de algoritmo de ordenação do tipo dividir-para-conquistar.
Sua ideia básica consiste em Dividir(o problema em vários sub-problemas e resolver esses sub-problemas através da recursividade) e Conquistar(após todos os sub-problemas terem sido resolvidos ocorre a conquista que é a união das resoluções dos sub-problemas).Como o algoritmo do Merge Sort usa a recursividade em alguns problemas esta técnica não é muito eficiente devido ao alto consumo de memória e tempo de execução.
Os três passos úteis dos algoritmos dividir-para-conquistar, ou divide and conquer, que se aplicam ao merge sort são:
  1. Dividir: Dividir os dados em subsequências pequenas;
  2. Conquistar: Classificar as duas metades recursivamente aplicando o merge sort;
  3. Combinar: Juntar as duas metades em um único conjunto já classificado.


Como todo código, ele também tem desvantagens. Por utilizar funções recursivas pra fazer a quebra do vetor, o código automaticamente precisa de mais poder de processamento, caso seja um vetor muito grande, por exemplo.

Por ser um algorítimo complexo, necessita de um gasto extra de memória. Ele cria uma cópia do vetor para cada nível da chamada recursiva, totalizando um uso adicional de memória igual a (n log n).

Animação:



quarta-feira, 6 de agosto de 2014

Algoritmos de Ordenação - Selection Sort



Este algoritmo é baseado em se passar sempre o menor valor do vetor para a primeira posição (ou o maior dependendo da ordem requerida), depois o segundo menor valor para a segunda posição e assim sucessivamente, até os últimos dois elementos.

Neste algoritmo de ordenação é escolhido um número a partir do primeiro, este número escolhido é comparado com os números a partir da sua direita, quando encontrado um número menor, o número escolhido ocupa a posição do menor número encontrado. Este número encontrado será o próximo número escolhido, caso não for encontrado nenhum número menor que este escolhido, ele é colocado na posição do primeiro número escolhido, e o próximo número à sua direita vai ser o escolhido para fazer as comparações. É repetido esse processo até que a lista esteja ordenada.


Figura 3: Esquema de funcionamento do Selection Sort
  • Neste passo o primeiro número escolhido foi o 3, ele foi comparado com todos os números à sua direita e o menor número encontrado foi o 1, então os dois trocam de lugar.
  • O mesmo processo do passo 1 acontece, o número escolhido foi o 5 e o menor número encontrado foi o 2.
  • Não foi encontrado nenhum número menor que 3, então ele fica na mesma posição.
  • O número 5 foi escolhido novamente e o único número menor que ele à sua direita é o 4, então eles trocam.
  • Vetor já ordenado.

Animações:



terça-feira, 5 de agosto de 2014

Arvore AVL

Mais uma vez meus leitores vamos falar sobre estrutura de dados, dessa vez vamos observar arvore AVL, primeiramente uma arvore AVL é uma arvore binaria de busca, ou seja possui limitações no modo de inserir e  no grau da arvore, bom mais uma vez vale lembrar sem ED não existe bons sistemas, nem tudo pode ser feito de maneira intuitiva, bom então essa é mais uma base para o uso efetivo de Big data em suas aplicações, segue o material :

Árvores Balanceadas AVL

Definição: Uma árvore é considerada AVL quando a altura de suas subárvores direita e esquerda diferem no máximo 1 unidade, isto é, a árvore permanece sempre balanceadaAVL vem da abreviatura dos nomes de seus criadores G.M. Adelson-Velskii e  E.M. Landis, em 1962.
Definição de uma árvore AVLtype
   TDirecao = (NoEsquerdo, NoDireito);
   PNo = ^No;
   No = record
           Dado : Tipo_do_Dado;
           Links : array[NoEsquerdo..NoDireito] of PNo;
           Balanco : -1..1;
   end;
   ArvoreAVL = PNo;
Exemplo: Observe os balanços de cada nó da árvore AVL abaixo


Exemplo: Efetuando uma inserção em uma árvore AVL

Após a inserção de B no exemplo acima, a árvore passou a ficar desbalanceada. Para corrigir tal situação, aplicamos rotações para tornar a árvore balanceada novamente.

Rotações


Rotação Simples para Direita: Quando pivô e filho esquerdo têm mais elementos no lado esquerdo.

Após a inserção do valor 3, a árvore AVL ficou desbalanceada. O pivô (nó que contém 8) tem balanço 2 e seu filho esquerdo (nó que contém 4) tem balanço 1. Ao aplicar a rotação simples para direita, a árvore volta a ficar balanceada.

procedure RotacaoParaDireita(var Pivo : PNo);
var Temp, FilhoEsq : PNo;
begin
   FilhoEsq := Pivo^.Links[NoEsquerdo];
   Temp := FilhoEsq^.Links[NoDireito];
   FilhoEsq^.Links[NoDireito] := Pivo;
   Pivo^.Links[NoEsquerdo] := Temp;
end;

Rotação Simples para Esquerda: Quando pivô e filho direito têm mais elementos no lado direito.

Após a inserção do valor 13, a árvore AVL ficou desbalanceada. O pivô (nó que contém 10) tem balanço -2 e seu filho esquerdo (nó que contém 12) tem balanço -1. Ao aplicar a rotação simples para esquerda, a árvore volta a ficar balanceada.

procedure RotacaoParaEsquerda(var Pivo : PNo);
var Temp, FilhoDir : PNo;
begin
   FilhoDir := Pivo^.Links[NoDireito];
   Temp := FilhoDir^.Links[NoEsquerdo];
   FilhoDir^.Links[NoEsquerdo] := Pivo;
   Pivo^.Links[NoDireito] := Temp;
end;

Rotação Dupla uma para Esquerda outra para Direita: Quando pivô tem mais elementos do lado esquerdo e filho tem mais elementos do lado direito.

Após a inserção do valor 7, a árvore fica desbalanceada. Como o pivô (nó com valor 8) tem mais elementos do lado esquerdo, mas seu filho esquerdo (nó com valor 4) possui mais elementos do lado direito, é preciso primeiro fazer uma rotação à esquerda em torno do filho esquerdo para depois efetuar a rotação para a direita sobre o pivô.

Rotação Dupla uma para Direita outra para Esquerda: Quando pivô tem mais elementos do lado direito e filho tem mais elementos do lado esquerdo.

Após a inserção do valor 11, a árvore fica desbalanceada. Como o pivô (nó com valor 10) tem mais elementos do lado direito, mas seu filho direito (nó com valor 12) possui mais elementos do lado esquerdo, é preciso primeiro fazer uma rotação à direita em torno do filho direito para depois efetuar a rotação para a esquerda sobre o pivô (nó com valor 10).

De forma geral, teríamos o quadro abaixo:

Fonte:http://200.17.141.213/~alberto/2012-2/ed1/aulas/arvores_avl.htm

quinta-feira, 31 de julho de 2014

Porto Seguro e Big Data

É meus caros leitores nem no transito teremos mais privacidade, no caso a inovação da vez vem da seguradora Porto Seguro, como sua nossa aplicação ela tenta atrair os jovens e por consequência criar uma
fidelidade de loga data (só é não bater muito o carro), bom o caso é simples o jovem (18 - 24)  que possui um seguro recebe uma aplicação que é instalada no rasteador do carro essa aplicação verifica se esse individuo atingiu uma certa pontuação na qual pode levar ao contratante a receber descontos de 30% na renovação do seguro, bacana né ? então segue o link com a reportagem na integra : http://convergenciadigital.uol.com.br/cgi/cgilua.exe/sys/start.htm?infoid=36846&sid=97#.U8Pyq_ldWAU

sábado, 26 de julho de 2014

Arvore Binaria de Busca

A campeã de uso, pois é em postagens anteriores relacionei arvore a banco de dados e essa estrutura é a mais usada em SGBDs, nesse caso aumentamos a nível de exigência, antes na arvore binaria, o grau era dois mas inserir elementos era feita de maneira live leve e solta, sendo assim agora vamos restringir ainda mais,
essa ED usa o conceito que todos os elementos a esquerda do nó pai é menor que o valor nó pai ( não vou especificar em números pois a chave quem implementa é o programador) e os valores da direita são maiores que o valor do pai então e se for igual ? depende da implementação do programador se vai ou não aceitar chaves repetidas e se aceitar como ria proceder com ela, então segue o material :

Árvores Binárias de Busca

Definição: É uma árvore binária em que todos os valores na subárvore esquerda são menores que o da raiz e todos os valores da subárvore direita são maiores (ou iguais) que o da raiz.
Exemplos de árvores binárias de busca:




Usando o caminhamento central, teríamos:
Seqüência (1° árvore): A, B, C, D, E, F e G.
Seqüência (2° árvore): 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 e 110.

 

Implementação de uma Árvore Binária de Busca


A função EncontrarChave busca na árvore passada a chave informada. Se encontrar, P apontará para o nó que a contém e a função retorna true. Caso não encontre, a função retorna false e P aponta para o nó que seria o seu pai caso existisse.
A função Inserir usa EncontrarChave para verificar se a chave já existe. Caso exista, retorna false. Se não existir, aproveita o apontador P (aponta para o pai correto do nó a ser inserido) e inclui na subárvore esquerda de P se a chave sendo inserida for menor ou na direita se for maior, retornando true.
A remoção de um nó pode ser mais simples ou complexa de acordo com o número de subárvores que possui.
a) Removendo um nó sem subárvore (folha):

Nesse caso, basta apagar o nó e atualizar o apontador para ele no pai para nil.

b) Removendo um nó com uma subávore:

Nesse caso basta desviar o apontador que apontava para o nó a ser removido para a sua única subárvore. Por último, elimina-se o nó.

c) Removendo um nó com duas subávore:

Nesse caso é necessário encontrar o sucessor imediato, copiar o seu conteúdo para o nó a ser removido e remover o nó que continha o sucessor imediato.
Para remover um nó nesse caso teremos que colocar um outro nó no lugar daquele que vai ser removido. Para a escolha desse nó podemos usar duas abordagens:
  1. Sucessor imediato: utilizamos o nó mais à esquerda da subárvore direita do nó a ser removido.
  2. Predecessor imediato: utilizamos o nó mais à direita da subávore esquerda do nó a ser removido.

quarta-feira, 23 de julho de 2014

Tire aqui as suas dúvidas sobre a apresentação de hoje (23/07/14)

Olá, você que viu nossa apresentação de hoje (23/07/14) sobre Big Data, estruturas de dados e noções de algoritmos e ficou com alguma dúvida ou alguma observação a fazer, fique à vontade, esse post está dedicado exclusivamente a isso.
Deixe aqui nos comentários sua dúvida ou observação.






Link para o Slide: http://www.slideshare.net/maicsongabriel/fec-37285189

segunda-feira, 21 de julho de 2014

Arvore Binaria.

Mais uma vez vamos conversar sobre ED, mais então meu caros leitores poque falar tanto sobre ED? nessa altura do campeonato poucos sabem mas, sem Estrutura de Dados, sem Big Data ou talvez até sem computação, esse é o ramo onde estudamos eficiência e eficacia dos nosso códigos, aqui não basta
solucionar tem que ser da melhor maneira otimizando as aplicações facilitando a busca por dados e por consequência complicando a vida de muitos programadores , mas o nosso foco são Arvores Binarias, nesse caso é basicamente a continuação de nossa ultima postagem, arvores são complicadas de se manter, então uma arvore binaria cria uma restrição quanto ao grau, no caso o grau máximo passa a ser 2 e não n grau como foi na nossa ultima postagem, sem mais conversa segue o material :
Árvores Binárias

Definição: São estruturas do tipo árvore com as seguintes características:
  • A árvore tem grau 2.
  • Cada subárvore é identificada como subárvores esquerda e direita.
  • Pode haver uma ordenação entre as subárvores.
Exemplo:

Implementação Encadeada


A implementação encadeada de árvore binária tem as seguintes características:
  • Usa um estrutura dinâmica com apontadores.
  • Cada nó contém os dados e os apontadores para as subárvores esquerda e direita.
Graficamente, teríamos:


A implementação encadeada de árvore binária é mais usada do que a estática porque e mais eficiente em termos de espaço em memória.
Definição de uma árvore binária em pascaltype
   ArvoreBinaria = ^No;
   No = record
           Dado: tipo_do_dado;
           Esquerdo,
           Direito,
           Pai : ArvoreBinaria;
        end;

O procedimento CriarNo recebe um apontador ArvoreBinaria e o dado que será colocado no nó. Além de alocar uma variável dinâmica para o nó, copia o dado para esta variável e faz com que os apontadores para o pai, para o nó esquerdo e para o nó direito sejam inicializados através do procedimento Inicializar.
A função ExisteNo retorna true se existe um nó na árvore binária passada seguindo pela direção especificada.
O procedimento Deslocar move o apontador do tipo ArvoreBinaria na direção especificada. Se a direção for nó raiz, Deslocar só encerra quando ArvoreBinaria não tiver mais um nó pai.
O procedimento ObterDado coloca em Dado (parâmetro), o valor contido no nó passado.
O procedimento AlterarDado modifica o valor do dado contido no nó passado para o valor passado como parâmetro.
O procedimento AdicionarFilho coloca um novo nó na direção especificada (nó esquerdo ou nó direito) e copia o dado passado para ele.
Fonte : http://200.17.141.213/~alberto/2012-2/ed1/aulas/arvores_binarias.htm

sexta-feira, 18 de julho de 2014

Power Systems

Como coletar grande volume da dados ? a IBM sabe, atualmente a IBM deselvolve uma aplicação muito bacana para auxiliar o controle de volume de dados através do fluxo desses, ou seja controlar a saida e
entrada de dados, desse modo é possivel prever o estado do mercado futuro(), senda assim sua empresa sabe como será as coisas amanhã dando uma vantagem sem tamanho sobre todas as outras, então você caro empresario visite a IBM e caro leitor aprenda a usar esse tipo de aplicação, segue o link da IBM :http://www-03.ibm.com/systems/br/power/solutions/bigdata-analytics.html

quinta-feira, 17 de julho de 2014

Algoritmos de Ordenação - Insection Sort

Insertion sort


Mais um vídeo hilário com o algoritmo: 




O Insertion sort é um algoritmo simples e eficiente quando aplicado em pequenas listas. Neste algoritmo a lista é percorrida da esquerda para a direita, à medida que avança vai deixando os elementos mais à esquerda ordenados.
O algoritmo funciona da mesma forma que as pessoas usam para ordenar cartas em um jogo de baralho como o pôquer.


Esquema de funcionamento do Insertion Sort:
  • Neste passo é verificado se o 5 é menor que o 3, como essa condição é falsa, então não há troca.
  • É verificado se o quatro é menor que o 5 e o 3, ele só é menor que o 5, então os dois trocam de posição.
  • É verificado se o 2 é menor que o 5, 4 e o 3, como ele é menor que 3, então o 5 passa a ocupar a posição do 2, o 4 ocupa a posição do 5 e o 3 ocupa a posição do 4, assim a posição do 3 fica vazia e o 2 passa para essa posição.

O mesmo processo de comparação acontece com o número 1, após esse processo o vetor fica ordenado.

Pseudocódigo


Animações




Fontes: http://pt.wikipedia.org/wiki/Insertion_sort;
            Youtube;
            Devmedia.


quarta-feira, 16 de julho de 2014

Algoritmos de Ordenação - Bubble Sort

Bubble Sort



Primeiramente um vídeo simples e bem divertido em que é usado "Folk Dance" para explicar como ele funciona:




Bubble sort (ou método da bolha) é o algoritmo mais simples, mas o menos eficientes. Neste algoritmo cada elemento da posição i será comparado com o elemento da posição i + 1, ou seja, um elemento da posição 2 será comparado com o elemento da posição 3. Caso o elemento da posição 2 for maior que o da posição 3, eles trocam de lugar e assim sucessivamente. Por causa dessa forma de execução, o vetor terá que ser percorrido quantas vezes que for necessária, tornando o algoritmo ineficiente para listas muito grandes.

Esquema de funcionamento do Buble Sort:
  • É verificado se o 3 é maior que 5, por essa condição ser falsa, não há troca.
  • É verificado se o 5 é maior que 1, por essa condição ser verdadeira, há uma troca.
  • É verificado se o 5 é maior que 2, por essa condição ser verdadeira, há uma troca.
  • É verificado se o 5 é maior que 4, por essa condição ser verdadeira, há uma troca.
  • O método retorna ao início do vetor realizando os mesmos processos de comparações, isso é feito até que o vetor esteja ordenado.

Complexidade

Com relação a complexidade do algoritmo, no melhor caso, ele executa n operações relevantes, onde n representa o número de elementos do vetor. No pior caso, são feitas n^2operações. A complexidade desse algoritmo é de Ordem quadrática. Por isso, ele não é recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.
 

Segue abaixo uma animação que demonstra como o processo funciona:





Fontes: http://pt.wikipedia.org/wiki/Bubble_sort;
              Youtube

Big Data e o mercado de trabalho

Olá, aqui já foi falado sobre Big Data, sobre seu uso e mais diversos campos de aplicação, também sobre seu crescimento, mas você que leu e se interessou por Big Data se pergunta, "legal, mas como eu posso trabalhar com Big Data ?"  pois é, boa pergunta e aqui está a resposta para essa pergunta.
Estava navegando nas nets qualquer dia desse, quando me deparei com esse artigo sobre áreas de trabalho com Big Data e as suas devidas explicações.
Tem muitas áreas, alguns exemplos são: Analista de Mercado, Desenvolvedor de Software, Administradores de Bancos de Dados, entre outras, segue o link com a lista das profissões mais lucrativas:

Estruturas de dados (definição)

Olá, nesse post irei falar um pouco mais sobre estruturas de dados.

No maravilhoso mundo da computação, uma estrutura de dados é um modo particular de armazenar e organizar dados em um computador de modo que possam ser usados com eficiência.
Existem diferentes tipos de estruturas para diferentes tipos de aplicação, enquanto algumas são bem simples, existem outras que são altamente especializadas que se destinam a tarefas específicas. Um exemplo das estruturas especializadas são as B-trees, que são particularmente indicadas para a implementação de bases de dados.
Estruturas de dados e algoritmos são temas fundamentais na computação, sendo utilizados nas mais diversas áreas do conhecimento e com os mais diferentes propósitos de aplicação. Sabe-se que algoritmos manipulam dados. Quando estes dados estão organizados de forma coerente, caracterizam uma estrutura de dados. A organização e os métodos para manipular essa estrutura é que lhe conferem singularidade e diminuição do espaço ocupado pela memória RAM, além de tornar o código-fonte do programa mais enxuto e simplificado.
Existem estruturas de dados homogêneas, por exemplo, vetores e matrizes, que são formadas pelo mesmo tipo de dado primitivo, e existem estruturas heterogêneas (registros) que são conjuntos de dados formados por tipos de dados primitivos diferentes em uma mesma estrutura.
As estruturas de dados podem transformar um problema que antes era enorme em um probleminha de fácil resolução.
Essas estruturas estão em constante desenvolvimento, mas, apesar disso, existem estruturas que são clássicas e se comportam como padrões. São elas os vetores e os arrays.


Esse post foi apenas uma leve explanação sobre estruturas de dados, já existem alguns posts mais específicos sobre tipos de dados no Blog.

Aqui estão alguns links sobre estruturas:
 Estruturas de Dados e os ponteiros da vida
Array
Lista encadeada
Lista Ordenada
___________________________________________________________
Qualquer dúvida deixe nos comentários que procurarei responder em breve.
___________________________________________________________
Fonte:Estrutura de dados

Técnicas de Projetos de algoritmos

Olá, nesse post irei falar um pouco sobre técnicas de projetos de algoritmos.

O que são Técnicas de Projetos de Algoritmos ?

São técnicas que compreendem os métodos de codificação de algoritmos de forma a acentuar sua complexidade, levando em conta a forma que determinado algoritmo chega a solução desejada.

Técnicas comuns são: 'Força Bruta' e a 'Divisão e conquista'.

Força Bruta:
A força bruta (ou busca exaustiva) é um algoritmo de uso geral que consiste em enumerar todos os possíveis candidatos de uma solução e verificar se cada um satisfaz o problema.
Ex.: Um algoritmo para encontrar os divisores de um número natural n é enumerar todos os números naturais de 1 a n e verificar para cada um se ele dividido por n resulta em resto 0;
Esse algoritmo possui uma implementação muito simples, e sempre encontrará uma solução se ela existir. Entretanto, seu custo computacional é proporcional ao número de candidatos a solução, que, em problemas reais, tende a crescer exponencialmente. Portanto, a força bruta é tipicamente usada em problemas cujo tamanho é limitado, ou quando há uma heurística usada para reduzir o conjunto de candidatos para uma espaço aceitável. Também pode ser usado quando a simplicidade da implementação é mais importante que a velocidade de execução, como nos casos de aplicações críticas em que os erros de algoritmo possuem em sérias consequências.

Divisão e conquista:
Esta técnica consiste em dividir um problema maior recursivamente em problemas menores até que o problema possa ser resolvido diretamente. Então a solução do problema inicial é dada através da combinação dos resultados de todos os problemas menores computados.
A técnica soluciona o problema em 3 técnicas: Divisão, conquista e combinação.
Problemas que utilizam esta técnica podem tirar proveito de máquinas com múltiplos processadores pois a fase de divisão em problemas menores proporciona uma divisão natural do trabalho. Cada um dos problemas menores obtidos pode ser calculado separadamente em um processador sem depender dos demais.
A solução por esta técnica também é eficiente no uso da memória cache pois ao final da fase de divisão grande parte dos dados necessários para a fase de combinação já estão disponíveis na cache proporcionando um acesso mais veloz aos dados. Porém o caráter recursivo das soluções acaba gerando um trabalho de processamento maior devido ao uso de chamadas recursivas e o uso da pilha de chamadas.


Bom, espero que tenha entendido, em breve postarei mais sobre o assunto. Qualquer dúvida deixe nos comentário que procurarei responder em breve.

Fonte:Técnicas de Projetos de Algoritmos

Arvores

Falemos agora sobre Arvores, mas não as que você caro leitor encontra na rua e sim as que vão reprovas muitos calouros de EC, CC e SI. Arvores são estruturas puramente recursivas (pode ser usado o paradigma
intuitivo, porem se torna complexo) recursividade poderia ser um tema bacana , quem sabe mais a frente, uma arvore é uma estrutura de dados vastamente utilizada seu conceito é de utilizar dados não homogêneo e os organizar (lembra os conceitos de Big Data né?) de modo a facilitar o seu armazenamento e por consequência busca de dados, mais a frente veremos que os SGBDs usam muito esse tipo de ED.

Árvores

Definição: É uma estrutura onde a relação entre seus elementos é de um para vários, também denominada estrutura hierárquica.

Uma árvore consiste em um conjunto de nós, tal que:
  • Existe um nó denominado raiz.
  • Os demais nós formam m (m >= 0) conjuntos onde cada um deles também é uma árvore.
Notações gráficas para representar árvores:

Aplicações de Árvores


Árvores podem ser usadas em diversos tipos de aplicações:
  • Aplicações onde é necessário recuperar informações rapidamente (SGBD)
  • Programas onde as informações têm que ser estruturadas de forma hierárquica.
  • Aplicações onde é necessário armazenar expressões matemáticas.
Para representar as expressões matemáticas A + B * 3 e (A + B) * 3 poderíamos usar as árvores A e B abaixo:


Fonte : http://200.17.141.213/~alberto/2012-2/ed1/aulas/arvores.htm

terça-feira, 15 de julho de 2014

Chef Watson with Bon Appetit

Achei uma publicação muito bacana da IBM para variar, bom se trata do usos de Big data na gastronomia, então já pensou chegar em um restaurante e seu pedido já estar na mesa sem você pedir? é isso mesmo "Chef Watson with Bon Appetit" se trata de uma aplicação que utiliza um conjunto de informações para traçar um perfil gastronômico de um cozinheiro para criar novas receitas, ratatouille que se cuide, segue o link : http://info.abril.com.br/noticias/ti/2014/06/app-para-supercomputador-watson-leva-big-data-para-a-gastronomia.shtml
o

segunda-feira, 14 de julho de 2014

Fila

Quem nunca se revoltou em passar horas e horas em filas? bom nesse caso fila é algo muito bom, continuando os conceitos de Estrutura de dados, vamos abordar um pouco de uma estrutura muito
importante, no caso fila, se trata de uma estrutura restrita onde os dados são armazenados seguindo a restrição que o primeiro a entrar é o primeiro a sair, ou seja existe concentos FIFO(first in first out), uma fila possui inicio e fim por consequência, sem mais delongas segue um material bacana sobre fila:
Fila

Definição: É uma lista na qual as inserções são feitas em uma extremidade chamada "cauda" ou "fundo", e as remoções são feitas na outra extremidade, chamada "cabeça" ou "frente".
Numa fila, o primeiro a entrar é o primeiro a sair. Esta política de acesso é denominada FIFO ("First In, First Out"). Ilustrando teríamos:


A tabela abaixo descreve as principais operações:
OperaçãoDescrição
InicializarCria uma fila vazia.
InserirInsere um elemento no fundo (cauda) da fila.
RetirarRetira um elemento que está na frente (cabeça) da fila.
FrenteRetorna o elemento que está na frente (cabeça) da fila.
VaziaIndica se a fila está vazia.
Há basicamente 2 formas de implementar uma fila:
  1. Usando uma lista encadeada:
    1. O elemento inserido é colocado no fim da lista (cauda).
    2. A retirada é feita no início (cabeça).
  2. Usando um array:
    1. há duas variáveis (Início e Fim) que indicam as extremidades da fila (cabeça e cauda).
    2. Ao retirar um elemento, isto é feito na posição Início.
    3. Ao inserir, o novo elemento é colocado na posição Fim + 1.
Fonte : http://200.17.141.213/~alberto/2012-2/ed1/aulas/listas_restritas.htm

sexta-feira, 4 de julho de 2014

Aplicações que usam Big Data

Olá pessoal, estamos ai mais uma vez falando sobre Big Data, naturalmente é uma revolução devido ao grande volume dados cujo a internet ou aplicação cujo efetue uma coleta de grande volume de dados, ou
seja trabalhar com diversos tipos de dados não estruturados, mas falamos muito e mostramos pouco então resolvi buscar algumas aplicações que usam Big Data e acabei encontrando uma publicação bacana do Olhar Digital então segue ai o link aproveitem e botem a cabeça para pensar. link : http://olhardigital.uol.com.br/pro/video/39376/39376
Fonte : http://olhardigital.uol.com.br/

quarta-feira, 2 de julho de 2014

Lista Restrita.

Agora vamos falar um pouco listas restritas, nesse caso falaremos de pilhas, o que é uma pilha ? a noção básica de pilha é que os últimos serão os primeiros e os primeiros serão os últimos, pensando desse modo como se retira o primeiro prato colocado em uma pilha de pratos, sabendo que foram colocados 10 pratos acima deste?, intuitivamente vamos ter que retirar os 10 pratos para enfim chegar ao prato alvo ou o primeiro prato, outro exemplo é o seu navegador que é uma estrutura de dados que usa de uma pilha para os botões e voltar ou avançar, então porque restrita? exatamente devido a ordem na qual são adicionados
os meus elementos tudo somente pode ser feito por meio do topo, onde retiramos ou colocamos itens.

Pilha

Definição: Uma pilha é uma lista em que as operações de inserção e remoção são feitas na mesma extremidade da lista, conhecido como topo da pilha.
Esta restrição de acesso (ou disciplina) que caracteriza a pilha é denominada LIFO, abreviação de "Last In First Out", isto é, o último a entrar será o primeiro a sair.
Graficamente temos:


A tabela abaixo descreve as principais operações:
OperaçãoDescrição
InicializarExecuta as ações necessárias para aprontar a pilha.
EmpilharColoca um elemento no topo da pilha.
DesempilharRemove o elemento que está no topo da pilha.
TopoRetorna o elemento que está no topo da pilha.
VaziaIndica se a pilha está vazia.
Há basicamente 2 formas de implementar uma pilha:
  1. Usando uma lista encadeada: o elemento inserido é colocado na cabeça da lista.
  2. Usando um array: o elemento inserido é colocado na posição nº de elementos + 1.




fonte : http://albertocn.sytes.net/2010-2/ed1/aulas/listas_restritas.htm

domingo, 29 de junho de 2014

Sintaxe de Algoritmos

Para facilitar o entendimento dos algoritmos e, conseqüentemente, sua tradução para as diversas linguagens de programação existentes atualmente, adotaremos uma sintaxe de descrição padrão.
Nossa sintaxe será baseada na linguagem Pascal.
Hierarquias - As hierarquias serão denotadas pelas identações entre as linhas. Ou seja, terão a mesma ordem hierárquica todas as instruções que estiverem a uma mesma distância da margem esquerda da tela.
  • Variáveis - Não serão declaradas variáveis ou mesmo tipos de variáveis. Todas as variáveis utilizadas aparecerão ao longo do código e serão representadas por conjuntos de letras e números.
Ponteiros receberão uma representação diferenciada, para destacá-los das variáveis comuns:
^pt - variável do tipo ponteiro (armazena um endereço de memória).
[^pt] - acesso ao conteúdo no endereço que ^pt armazena.
$var - endereço da variável var.
  • Operadores
  • matemáticos
OPERAÇÃO         OPERADOR

adição           +
subtração        -
multiplicação    *
divisão          /
módulo           MOD
quociente        DIV
  • lógicos
OPERAÇÃO         OPERADOR

e (and)          E
ou (or)          OU
não (not)        ~
  • relacionais
OPERAÇÃO         OPERADOR

maior            >
maior ou igual   >=
menor            <
menor ou igual   <=
igual            =
diferente        ~=
  • Condicionais (ou blocos de seleção) - As possíveis formas de uma estrutura condicional serão:
SE (...) ENTÃO
   (...)
SENÃO SE (...) ENTÃO
   (...)
SENÃO
   (...)
SELECIONE (...) DENTRE
   [valores]:
      (...)
      SAIA
  • Laços - A estrutura dos laços de repetição serão:
ENQUANTO (...) FAÇA
   (...)
PARA var <- 1="" fa="" pre="">
FAÇA
   (...)
ATÉ (...)
  • Valores de retorno
Sempre que um algoritmo especificar um campo SAÍDA em sua definição (ver a seguir), em seu corpo deverá ocorrer ao menos uma instrução RETORNA. Os algoritmos definirão os valores a serem retornados como a seguir:
RETORNE a
Estrutura dos Algoritmos

Sempre que um novo algoritmo seguir, será da seguinte forma:
ALGORITMO: NomeAlgoritmo(i, nome, ^pt)
ENTRADA: inteiro i, frase nome
[SAÍDA: quantidade de letras de nome]
[REQUISITOS: nome deve iniciar por caractere alfabético]
--------------------------------------------------------
    (instruções)
Os campos entre colchetes são utilizados somente quando necessário.

sábado, 28 de junho de 2014

Lista Ordenada.

Continuando com minha promessa, vamos falar sobre listas ordenadas, mais uma vez adotando o pascal,
bom já definimos o que é uma lista simplesmente encadeada, porém um array possui um índice ou seja uma posição, então com o intuído de tornar uma lista familiar a estrutura de um array, o registro passa a adotar um campo chamado índice ou posição ou chave onde esse vai determinar a posição do registro tornado mais intuitiva a busca ou posição de uma informação  dentro de uma estrutura de dados.

Lista Ordenada

Definição: É uma lista que mantém os seus elementos sempre ordenados por algum critério.
Deve ser usada quando é necessário acessar os elementos da lista de forma ordenada. Quando a ordem não for importante, deve-se considerar o uso de outro tipo de lista pois as operações de inserção e remoção são mais caras (exigem mais processamento)  nas listas ordenadas.
A forma mais comum de se implementar uma lista ordenada é usando uma lista encadeada, onde o primeiro nó é menor que o segundo e assim por diante. Graficamente teríamos:

Para
Para ver uma implementação de uma lista Ordenada, abra a unit LstOrd e para um programa que demonstra como usá-la, veja DLstOrd.
O procedimento inicializar faz com que a cabeça da lista aponte para nil, indicando que não há elementos na lista.
O procedimento apagar e as funções vazia e tamanho são iguais à da lista encadeada, recebendo apenas um parâmetro com tipo diferente.
A função inserir coloca o item passado na posição correta da lista, ou seja, mantendo a ordem da mesma. A lista não deve conter uma chave igual à do item passado. Se a chave do item passado for menor do que a do primeiro da lista, será inserido no início e tornar-se-á a cabeça da lista (situação 1). Caso contrário, será inserido no meio (situação 3) ou no final (situação 2) da lista, dependendo do valor de sua chave e dos elementos contidos na lista (situação 2).
Situação 1: Inserindo um valor no início da lista:


Situação 2: Inserindo um valor no final da lista:


Situação 3: Inserindo um valor no meio da lista:


A função remover encontra um item na lista com a chave passada, libera a memória alocada pelo item e ajusta apontadores. No caso da remoção, encontramos 2 situações: remoção do elemento da cabeça ou que não está na cabeça.
Situação 1: Removendo um item da cabeça da lista:


Situação 2: Removendo um item que não está na cabeça da lista:


fonte: http://albertocn.sytes.net/2010-2/ed1/aulas/listas_lineares.htm