A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Estrutura de Dados (Linguagem C / C++) Prof. Msc.

Apresentações semelhantes


Apresentação em tema: "Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Estrutura de Dados (Linguagem C / C++) Prof. Msc."— Transcrição da apresentação:

1 Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Estrutura de Dados (Linguagem C / C++) Prof. Msc. Vladimir Camelo

2 Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Conceitos de Árvores e Árvores Binárias Prof. Msc. Vladimir Camelo

3 Estrutura de Dados Introdução Uma das mais importantes classes de estruturas de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas usando-se algoritmos relativamente simples, recursivos e de eficiência bastante razoável.

4 Estrutura de Dados Definições e representações básicas Uma árvore é uma estrutura de dados que se caracteriza por uma relação de hierarquia entre os elementos que a compõem. Exemplos de estruturas em forma de árvores são: O organograma de uma empresa; A divisão de um livro em capítulos, seções, tópicos, etc; A árvore genealógica de uma pessoa.

5 Estrutura de Dados Definições e representações básicas De um modo um pouco mais formal, podemos dizer que uma árvore é um conjunto finito de um ou mais nodos (nós ou vértices), tais que: existe um nodo denominado raiz; os demais nodos formam m>= 0 conjuntos disjuntos s1, s2,..., sm, tais que cada um desses conjuntos também é uma árvore (denominada sub-árvore).

6 Estrutura de Dados Definições e representações básicas Uma floresta é um conjunto de árvores. Se v é um nodo de A, a notação Av indica a subárvore de v com raiz A. Para visualizar esse conceito, pode-se representa-lo graficamente. Há formas diferentes de representações gráficas de uma árvore. Em todas elas, cada nodo poderá ser associado a um identificador, denominado rótulo.

7 Estrutura de Dados Definições e representações básicas a) Representação hierárquica b) Representação por conjuntos (diagrama de inclusão)

8 Estrutura de Dados Definições e representações básicas c) Representação por expressão parentetizada (parênteses aninhados) Cada conjunto de parênteses correspondentes contém um nodo e seus filhos. Se um nodo não tem filhos, ele é seguido por um par de parênteses sem conteúdo. ( A ( B ( D ( ) E ( ) ) ) ( C ( F ( ) ) ) ) d) Representação por expressão não parentetizada Cada nó é seguido por um número que indica a quantidade de filhos desse nodo, e em seguida por esses filhos, representados do mesmo modo. A 2 B 2 D 0 E 0 C 1 F 0

9 Estrutura de Dados Pode-se representar uma árvore de muitos outros modos, mas é interessante notar que, dentre os exemplos apresentados, a representação a) é a que permite uma melhor visualização da estrutura. As representações c) e d) não permitem boa visualização da estrutura, mas podem ser úteis para guardar em arquivos os dados de uma árvore. Como, por definição, os subconjuntos s1, s2,...,sm são disjuntos, cada nó só pode ter um pai. Assim, o desenho a seguir, por exemplo, não representa uma árvore: Definições e representações básicas

10 Estrutura de Dados Definições e representações básicas

11 Estrutura de Dados Dada uma árvore qualquer: A linha que liga dois nodos da árvore denomina-se aresta. Diz-se que existe caminho entre dois nodos V e W da árvore, se a partir do nodo V puder-se chegar ao nodo W percorrendo-se as arestas que ligam os nodos intermediários entre V e W. Observa-se que existe sempre um caminho entre a raiz e qualquer nodo da árvore. Definições

12 Estrutura de Dados Dada uma árvore qualquer: Se houver um caminho entre V e W, começando em V diz-se que V é um nodo ancestral de W e W é um nodo descendente de V. Se este caminho contiver uma única aresta, diz-se que V é o nodo pai de W e que W é um nodo filho de V. Dois nodos que são nodos filhos do mesmo nodo pai são denominados nodos irmãos. Definições

13 Estrutura de Dados Dada uma árvore qualquer: Uma característica inerente a árvores é que qualquer nodo, exceto a raiz, tem um único nodo pai. Se um nodo não possui nodos descendentes, ele é chamado de folha ou nodo terminal da árvore. Grau de um nodo é o número de nodos filhos do mesmo. Obviamente que um nodo folha tem grau zero. Definições

14 Estrutura de Dados Dada uma árvore qualquer: O Nível de um nodo é o número de nodos existentes no caminho entre a raiz e o próprio nodo. A raiz tem nível 1. O grau da árvore é igual ao grau do nodo de maior grau da árvore. O nível da árvore é igual ao nível do nodo de maior nível da árvore. Definições

15 Estrutura de Dados Definições

16 Estrutura de Dados Altura e Profundidade

17 Estrutura de Dados Nível e Profundidade

18 Estrutura de Dados Exercício

19 Estrutura de Dados Exercício Responda: Qual é a raiz da árvore? Quais são os nodos terminais? Qual o grau da árvore? Qual o nível da árvore? Quais são os nodos descendentes do nodo D? Quais são os nodos ancestrais do nodo #? Os nodos 4 e 5 são nodos irmãos?

20 Estrutura de Dados Exercício Responda: Há caminho entre os nodos C e S? Qual o nível do nodo 5? Qual o grau do nodo A?

21 Estrutura de Dados Percurso em árvore objetivo principal: visitar os nós da árvore percurso prefixo: um nó é visitado antes dos seus descendentes ex. de aplicação: impressão de um documento estruturado por capítulos e parágrafos percurso sufixo: um nó é visitado depois dos seus descendentes ex. de aplicação: determinação do espaço ocupado por um diretório num sistema de arquivos de um computador percurso por nível: os nós de determinado nível são visitados antes dos nós do nível seguinte

22 Estrutura de Dados Percurso em árvore Um percurso em extensão é visitar cada nó começando do menor nível e move-se para os níveis mais altos nível após nível, visitando cada nó da esquerda para a direita. Sua implementação é directa quando uma fila é utilizada. Depois que um nó é visitado, seus filhos, se houver algum, são colocados no final da fila e o nó no início da fila é visitado. Assim, os nós do nível n+1 serão visitados somente depois de ter visitados todos os nós do nível n.

23 Estrutura de Dados Percurso em árvore –Breadth - First Search (BFS) Fila: 13 Fila: 10, 25 Fila: 25, 2, 12 Fila: 2, 12, 20, 31 Fila: 12, 20, 31 Fila: 20, 31 Fila: 31 Fila: 29 Percurso: 13, 10, 25, 2, 12, 20, 31, 29

24 Estrutura de Dados void BreadthFirst() { Queue q; Node *p = root; if (p != 0) { q.enqueue(p); while (!q.empty()){ p = q.dequeue(); visit(p); if (p->left != 0) q.enqueue(p->left); if (p->right != 0) q.enqueue(p->right); } Percurso em árvore

25 Estrutura de Dados Percurso em árvore O percurso em profundidade prossegue tanto quanto possível à esquerda (ou direita), então se move para trás até a primeira encruzilhada, vai um passo para a direita (ou esquerda) e novamente, tanto quanto possível, para a esquerda (ou direita). Repete-se este processo até que todos os nós sejam visitados.

26 Estrutura de Dados Percurso em árvore –Depth - First Search (DFS) V – Visitar um nó L – Percorrer à esquerda R – Percorrer à direita VLR VRL LVR RVL LRV RLV

27 Estrutura de Dados Árvores binárias Conforme já mencionado, as árvores constituem as estruturas não seqüenciais com maior aplicação em computação. Dentre as árvores, as binárias são, sem dúvida, as mais comuns. Deve-se observar que a ordem em que estão posicionadas as sub-árvores em relação à raiz é fundamental.

28 Estrutura de Dados Árvores binárias Uma vez que cada nodo tem no máximo dois nodos filhos, cada um destes nodos (se houverem) são identificados segundo a sua posição relativa à raiz. Distingue-se, então, o nodo filho à esquerda do nodo filho à direita e, conseqüentemente, a sub-árvore à esquerda da sub-árvore à direita.

29 Estrutura de Dados Árvores binárias - Aplicações Expressões aritméticas. Processo de decisão. Busca. A B C F D E H I

30 Estrutura de Dados Árvores de expressões aritméticas Árvore binária associada com uma expressão aritmética Nós internos: operadores Nós externos: operandos Exemplo: árvore da expressão aritmética para a expressão (2 (a - 1) + (3 b)) 2 a1 3b

31 Estrutura de Dados Árvores de decisão Árvore binária associada com um processo de decisão Nós internos: questões com respostas sim/não Nós externos: decisões Exemplo: Onde jantar Refeição rápida? Que tal um café?Pode ser caro? CantinaShoppingAbadeTábua de carne Sim Não SimNãoSimNão

32 Estrutura de Dados Árvores binárias - Exemplo Nos exemplos anteriores, as árvores apresentadas são distintas, pois no primeiro exemplo, o nodo A tem somente um filho à esquerda e no segundo exemplo, o nodo tem um filho a direita. Transformação em árvore binária Transformação em árvore binária A raiz da árvore (sub-árvore) será a raiz da árvore (sub- árvore) binária.

33 Estrutura de Dados Árvores binárias - Exemplo O nodo filho mais à esquerda da raiz da árvore (sub- árvore) será o nodo filho à esquerda da raiz da árvore (sub-árvore) binária. Cada nodo irmão de V, da esquerda para a direita, será o nodo filho à direita do nodo irmão da esquerda, até que todos os nodos filhos da raiz da árvore (sub-árvore) já tenham sido incluídos na árvore binária em construção.

34 Estrutura de Dados Representações de árvores binárias (implementações) Cada nodo componente de uma árvore binária tem no máximo dois filhos, sendo necessários, portanto, dois campos de elos para representa-lo. A configuração de um nodo numa árvore binária é a que segue: Sendo que EloE (i) indica o endereço do nodo filho à esquerda do nodo de índice i e EloD (i) aponta para o nodo filho à direita.

35 Estrutura de Dados Representações de árvores binárias (implementações) Uma árvore binária pode, então, ser representada por; uma matriz Info que conterá os campos de informações dos nodos, e dois vetores de ligação, EloE e EloD. ou uma estrutura com um campo info, um campo EloE e um EloD. Sendo conhecido o índice do nodo raiz de uma árvore, a mesma é completamente definida (o índice da raiz esteja contido na variável RAIZ).

36 Estrutura de Dados Representações de árvores binárias (implementações) Exemplo: a seguinte árvore (os números abaixo de cada nodo indicam o índice do mesmo)

37 Estrutura de Dados Representações de árvores binárias (implementações) Pode ser representado por:

38 Estrutura de Dados Caminhos e, árvores binárias Há diversas formas de manipulação de árvores binárias e, em geral, estas supõem o exame dos conteúdos (informações) dos nodos. O acesso sistemático aos nodos de uma árvore de maneira que cada nodo seja examinado no máximo uma única vez (para que não haja repetição), sugere que a árvore seja percorrida segundo algum critério pré-estabelecido. Esta ação de percorrer a árvore, com a condição de que cada nodo seja examinado no máximo uma vez, denomina-se caminhamento na árvore binária.

39 Estrutura de Dados Caminhos e, árvores binárias Se for realizado um caminhamento numa árvore de forma que todos os seus nodos sejam visitados (acessados), os mesmos são implicitamente organizados segundo uma ordem linear. Dependendo do critério estabelecido para caminhar na árvore, obtém-se uma seqüência dos nodos correspondentes xi1 xi2... xin, em que:

40 Estrutura de Dados Caminhos e, árvores binárias n é o número de nodos da árvore; x j é o conteúdo do nodo que ocorre na j-ésima posição na seqüência de caminhamento da árvore; e x ik ocorre antes de xip na seqüência se o nodo com informação x ik é visitado antes do que o nodo xip, segundo o caminhamento escolhido.

41 Estrutura de Dados Caminhos e, árvores binárias Em geral são utilizadas três formas de caminhamentos em árvores binárias e estas são determinadas dependendo da ordem em que são visitados o nodo raiz, sua sub-árvore à esquerda e sua subárvore à direita (o termo visitar significa a realização de alguma operação sobre a informação do nodo, como modificação da mesma, impressão ou qualquer outra). Os três caminhamentos usuais são descritos como segue: Caminhamento PRÉ_FIXADO (raiz-esquerda-direita) a) visitar a raiz; b) caminhar na sub-árvore à esquerda, segundo este caminhamento; c) caminhar na sub-árvore à direita, segundo este caminhamento.

42 Estrutura de Dados Caminhos e, árvores binárias Caminhamento INFIXADO (esquerda-raiz-direita) a) caminhar na sub-árvore à esquerda, segundo este caminhamento; b) visitar a raiz; c) caminhar na sub-árvore à direita, segundo este caminhamento. Caminhamento PÓS-FIXADO (esquerda-direita-raiz) a) caminhar na sub-árvore à esquerda, segundo este caminhamento b) caminhar na sub-árvore à direita, segundo este caminhamento c) visitar a raiz;

43 Estrutura de Dados Percurso em árvore void inorder(Node *p) { if (p != 0) { inorder(p->left); visit(p); inorder(p->right); } void preorder(Node *p) { if (p != 0) { visit(p); preorder(p->left); preorder(p->right); } void postorder(Node *p) { if (p != 0) { postorder(p->left); postorder(p->right); visit(p); }

44 Estrutura de Dados Deterioração quando inserimos utilizando a inserção simples, dependendo da distribuição de dados, pode haver deterioração. Árvores deterioradas perdem a característica de eficiência de busca.

45 Estrutura de Dados Propriedades Ab (BT) Notação n número de nós e número de nós externos i número de nós internos h altura (height) Propriedades: –e i 1 –n 2e 1 –h i –h (n 1) 2 –e 2 h –h log 2 e –h log 2 (n 1) 1

46 Estrutura de Dados Propriedades Ab (BT) Nível Nós Número máximo de nós em um nível h é 2 h Número total de nós é, no máximo é 2 h+1 -1

47 Estrutura de Dados Tipo Abstrato de Dado (TAD) Árvores binária O TAD Árvore Binária possui os métodos de árvore. Métodos adicionais: No getFilhoEsquerdo() No getFilhoDireito() boolean éFilhoEsquerdo() boolean éFilhoDireito() Métodos de atualização podem ser definidos por estruturas de dados que implementam o TAD ArvoreBinaria

48 Estrutura de Dados Estrutura de dados para AB Um nó é um objeto que armazena –Elemento –Nó pai –Filho da esquerda –Filho da direita Objetos nós implementam o TAD Position B D A CE B AD CE

49 Estrutura de Dados Estrutura de dados para AB Podemos usar um array a bc defg hijklmno a b c d e f g h i j k l m n o

50 Estrutura de Dados Representação em C É possível definir um tipo para representar uma árvore binária. A informação a ser armazenada são valores de caracteres simples. Inicialmente será discutido como é possível representar uma estrutura de árvore binária em C. Que estrutura pode-se utilizar para representar um nó da árvore? Cada nó deve armazenar três informações: a informação propriamente dita, no caso um caractere, e dois ponteiros para as sub-árvores, à esquerda e à direita.

51 Estrutura de Dados Representação em C Da mesma forma que uma lista encadeada é representada por um ponteiro para o primeiro nó, a estrutura da árvore como um todo é representada por um ponteiro para o nó raiz.

52 Estrutura de Dados Criando árvores

53 Estrutura de Dados Árvore Vazia

54 Estrutura de Dados Exemplo

55 Estrutura de Dados Exemplo

56 Estrutura de Dados Exemplo Alternativamente, a árvore poderia ser criada recursivamente com uma única atribuição, seguindo a sua estrutura. Como isso pode ser feito?

57 Estrutura de Dados Exemplo

58 Estrutura de Dados Exibindo conteúdo da árvores Como é chamada essa forma de exibição? E para exibir na forma in-fixada? E na pós-fixada?

59 Estrutura de Dados Liberando memória

60 Estrutura de Dados Criação e Liberação

61 Estrutura de Dados Criação e Liberação

62 Estrutura de Dados Buscando um elemento

63 Estrutura de Dados Buscando um elemento

64 Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Conceitos de Árvores e Árvores Binárias Prof. Msc. Vladimir Camelo

65 Estrutura de Dados

66 Estrutura de Dados

67 Estrutura de Dados

68 Estrutura de Dados

69 Estrutura de Dados

70 Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Algoritmos de Ordenação Prof. MSc. Vladimir Camelo 70

71 Estrutura de Dados Quicksort eficiente naturalmente recursivo - implementação seria complicada sem recursão Algoritmo Básico "dividir para conquistar" particiona a lista de elementos em duas partes e as classifica independentemente a posição exata da partição depende da lista 71

72 Estrutura de Dados quicksort (int e, int d) { int i; if (d >e){ i = partition (e,d); /* importante * / quicksort(e,i-1); quicksort(i+1,d); } Quicksort: algoritmo básico 72

73 Estrutura de Dados A primeira chamada: quicksort(1,N) A função partition deve: rearrumar a lista de acordo com as três condições: o elemento a[i] está em seu lugar final na lista todos os elementos em a[e] a a[i-1] são menores que a[i] todos os elementos em a[i+1] a a[d] são maiores ou iguais a a[i] Quicksort: algoritmo básico 73

74 Estrutura de Dados Partition: escolha arbitrariamente um elemento pivot a[r] – elemento que estará na sua posição ao final percorra a lista da esquerda até que um elemento maior que a[r] seja encontrado percorra a lista da direita até um elemento menor que a[r] esses dois elementos estão fora de posição troque-os Quicksort: algoritmo básico 74

75 Estrutura de Dados parar a varredura toda vez que um elemento for igual ao pivot a[r] Continuando dessa forma garante-se que todos os elementos da lista esquerda são menores e os a direita são maiores Quicksort: algoritmo básico 75

76 Estrutura de Dados Quando os ponteiros de varredura se cruzam, o processo está quase completo falta trocar a[r] com o elemento mais a esquerda da sub-lista da direita – o elemento a[i] a posição i foi definida aplicar quicksort nas sublistas de e a i-1 e i+1 a d i é o elemento que já está na sua posição Quicksort: algoritmo básico 76

77 Estrutura de Dados fora do-while externo - trocas 7 - em sua posição definitiva partition retorna i = 4 i j i j 1 a iteração (do-while externo) 2 a iteração (do-while externo) Quicksort: Partition 77

78 Estrutura de Dados partition(int e, int d) {int v, i, j; v = a[d]; i = e -1; j = d; do { do{ i = i+1; /* esquerda*/ } while (a[i] < v) && (i< d) ; do{ j = j-1; /* direita*/ } while (a[j] > v) && (j > 0); t=a[i]; a[i]=a[j]; a[j]=t; } while (j > i) /* para desfazer a troca extra realizada quando j<= i e saiu do while interno (t já tem o valor de a[i]) */ a[j] = a[i]; a[i] = a[r]; a[r] = t; return (i); } Quicksort: Partition 78

79 Estrutura de Dados É difícil imaginar um loop interno mais simples simplesmente incrementam um ponteiro e fazem uma comparação é o que faz o quicksort ser realmente rápido pode-se garantir que a[d] nunca será o maior ou o menor elemento o particionamento da lista seria desequilibrado em relação ao número de elementos Quicksort 79

80 Estrutura de Dados Pegue arbitrariamente 3 elementos de a: a[d], a[e] e a[ (e+d)/2 ] Compare os 3 elementos e defina o valor médio Troque com a[d] Execute o partition Vantagem: acrescentam-se um número fixo de instruções e não testes que variam com o tamanho da lista Quicksort: Partition 80

81 Estrutura de Dados o algoritmo não é estável tempo de processamento depende da seleção do pivô quanto ao tratamento do cruzamento dos ponteiros na presença de chaves iguais tanto faz se a varredura de ambos os ponteiros parar, um continuar e outro parar, nenhum parar mudanças devem ser feitas no algoritmo apresentado para listas com grande número de chaves repetidas Quicksort: Características 81

82 Estrutura de Dados Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada sub-lista chamando MergeSort recursivamente Combinar as sub-lista ordenadas formando uma única lista ordenada caso base: lista com um elemento MergeSort 82

83 Estrutura de Dados Dividir entrada saída Combina r MergeSort 83

84 Estrutura de Dados MergeSort ordena as posições e, e+1,..., d-1, d da lista A MergeSort (e,d) { if (e < d ){ meio = (e+d)/2; MergeSort (e, meio); MergeSort (meio+1, d); Merge (e, meio, d); } MergeSort 84

85 Estrutura de Dados Merge (e, m, d) { i = e; j = m+1; k = e; while (i < m) && (j < d) do { if (A [i] < A[j]) { B [k] = A [i]; k++; i++; } else { B [k] = A [j]; k++; j++; } w hile (i < m) do { B [k] = A [i]; k++; i++; } while (j < d) do { B [k] = A [j]; k++; j++; } for (i = 0; i < d; i++) A [i] = B [i]; } MergeSort 85

86 Estrutura de Dados algoritmo de ordenação estável Se dois elementos são iguais eles nunca são trocados de ordem Importante, por exemplo, se os elementos já estão ordenados segundo alguma chave secundária poderiamos eliminar a lista B? a copia final de B para A é necessária? MergeSort 86

87 Estrutura de Dados O Selection Sort é um algoritmo que ordena itens verificando repetidamente os itens restantes para encontrar o menor deles e movê-lo para uma posição final. O Selection Sort é um algoritmo que ordena itens verificando repetidamente os itens restantes para encontrar o menor deles e movê-lo para uma posição final. A idéia por trás do selection sort é que para ordenar N itens você tem que passar por todos eles. A idéia por trás do selection sort é que para ordenar N itens você tem que passar por todos eles. No primeiro passo você encontra o maior valor, e então troca ele pelo último item. Assim o maior item está agora na posição N. No primeiro passo você encontra o maior valor, e então troca ele pelo último item. Assim o maior item está agora na posição N. SelectionSort 87

88 Estrutura de Dados No segundo passo você faz uma varredura apenas nos N-1 elementos. No segundo passo você faz uma varredura apenas nos N-1 elementos. O maior dos itens é troca de posição com o item na posição N-1. O maior dos itens é troca de posição com o item na posição N-1. Assim o maior de todos os itens está agora na última posição; o segundo maior na segunda maior posição. Assim o maior de todos os itens está agora na última posição; o segundo maior na segunda maior posição. Este processo é repetido, com um item sendo colocado na sua posição correta a cada vez. Este processo é repetido, com um item sendo colocado na sua posição correta a cada vez. SelectionSort 88

89 Estrutura de Dados Depois de N passos, a coleção inteira de dados está ordenada. Depois de N passos, a coleção inteira de dados está ordenada. Uma variação simples é encontrar o menor item a cada vez e colocá-lo na frente. Uma variação simples é encontrar o menor item a cada vez e colocá-lo na frente. Para ordenar em ordem decrescente, o maior item é encontrado a cada vez e movido para a frente. Para ordenar em ordem decrescente, o maior item é encontrado a cada vez e movido para a frente. SelectionSort 89

90 Estrutura de Dados PROCEDIMENTO SelectionSort(Matriz_de_Inteiro v[]) INICIO PARA( i <== 0 ENQUANTO i

91 Estrutura de Dados PROCEDIMENTO swap(Matriz_de_Inteiro v[], Inteiro J, inteiro aposJ) INICIO INTEIRO aux <== 0 aux <== v[j] v[j] <== v[aposJ] v[aposJ] <== aux FIM. SelectionSort: Algoritmo 91

92 Estrutura de Dados SelectionSort: Teste Teste de mesa com Selection Sort crescente dados as seguintes variáveis: v[0] = 48, v[1] = 23, v[2] = 15, v[3] = 5, v[4] = 3 Dados ª varredura ª varredura ª varredura ª varredura Impressão

93 Estrutura de Dados SelectionSort: Vantagens e Desvantagens Vantagens Vantagens É estável, pois sempre mantém os itens na mesma ordem em que foram inseridos. É estável, pois sempre mantém os itens na mesma ordem em que foram inseridos. Simples pela sua facilidade de uso. Simples pela sua facilidade de uso. Desvantagens Desvantagens Não é muito eficiente para listas longas. Não é muito eficiente para listas longas. 93

94 Estrutura de Dados RadixSort O Radix Sort é um algoritmo que ordena itens separando-os em grupos que tenham algo em comum para depois juntá-los novamente na ordem correta. O Radix Sort é um algoritmo que ordena itens separando-os em grupos que tenham algo em comum para depois juntá-los novamente na ordem correta. A idéia por trás do Radix Sort é de fazer a separação dos itens conforme o dígito com maior valor (dígito à esquerda) ou o menor valor (dígito à direita). A idéia por trás do Radix Sort é de fazer a separação dos itens conforme o dígito com maior valor (dígito à esquerda) ou o menor valor (dígito à direita). Radix Sort sendo implementado no modo de dígito com menor valor (o mais comum): Radix Sort sendo implementado no modo de dígito com menor valor (o mais comum): 94

95 Estrutura de Dados RadixSort No primeiro passo o algoritmo irá verificar os dígitos do campo da unidade de todos os itens do vetor. No primeiro passo o algoritmo irá verificar os dígitos do campo da unidade de todos os itens do vetor. Cada item então é, de um modo figurativo, jogado em uma caixa correspondente ao dígito da unidade de cada item. Ou seja 21 e 81 na caixa 1, 42 e 12 na caixa 2 e assim por diante. Cada item então é, de um modo figurativo, jogado em uma caixa correspondente ao dígito da unidade de cada item. Ou seja 21 e 81 na caixa 1, 42 e 12 na caixa 2 e assim por diante. No segundo passo o algoritmo irá verificar os dígitos do campo da dezena de todos os itens do vetor (que já foram organizados uma vez). No segundo passo o algoritmo irá verificar os dígitos do campo da dezena de todos os itens do vetor (que já foram organizados uma vez). 95

96 Estrutura de Dados RadixSort Cada item então é novamente jogado em sua caixa correspondente, mas respeitando a ordem estabelecida pela verificação anterior. Cada item então é novamente jogado em sua caixa correspondente, mas respeitando a ordem estabelecida pela verificação anterior. Quando é encontrado o item com maior número de dígitos, a verificação / ordenação para e então o Radix faz a junção dos dados e apresenta a lista ordenada. Quando é encontrado o item com maior número de dígitos, a verificação / ordenação para e então o Radix faz a junção dos dados e apresenta a lista ordenada. Como foi dito o processo pode ser feito inversamente, ou seja, indo do dígito de maior valor para o de menor valor (esquerda p/ direita). Como foi dito o processo pode ser feito inversamente, ou seja, indo do dígito de maior valor para o de menor valor (esquerda p/ direita). 96

97 Estrutura de Dados RadixSort: ALgoritmo PROCEDIMENTO radixexchange (esq, dir, b: inteiro; var A: Vetor) var t, i, j: inteiro; INICIO Se (dir > esc) E (b >= 0) ENTÃO INICIO i <== esc; j <== dir; REPITA ENQUANTO (bits(A[i], b, 1) == 0 ) E (i < j) FAÇA i<== i + 1 ENQUANTO (bits(A[j], b, 1) == 0 ) E (i < j) FAÇA j<== j - 1 t <== A[i]; A[i] <== A[j]; A[j] <== t ATÉ QUE j = i Se (bits(A[r], b, 1) = 0 ) ENTÃO j <== j = 1 radixexchange(esc, j - 1, b - 1) radixexchange(j, dir, b - 1) FIM SE FIM 97

98 Estrutura de Dados RadixSort: Vantangens e Desvantagens Vantagens: Vantagens: É estável, pois sempre mantém os itens na mesma ordem em que foram inseridos. É estável, pois sempre mantém os itens na mesma ordem em que foram inseridos. É mais rápido que alguns algoritmos comparativos. É mais rápido que alguns algoritmos comparativos. É simples e eficiente. É simples e eficiente. Desvantagens: Desvantagens: Não possui flexibilidade de ordenação, só trabalha com a ordem lexicográfica. Não possui flexibilidade de ordenação, só trabalha com a ordem lexicográfica. Se não for modificado, não trabalha bem com float e números negativos. Se não for modificado, não trabalha bem com float e números negativos. 98

99 Estrutura de Dados BubbleSort Bubblesort compara elementos adjacentes e troca estes elementos se não estiverem na ordem correta. Bubblesort compara elementos adjacentes e troca estes elementos se não estiverem na ordem correta. Este algoritmo de ordenação requer várias passagens pelos dados. Este algoritmo de ordenação requer várias passagens pelos dados. Durante a primeira passagem, comparamos os dois primeiros itens do vetor. Durante a primeira passagem, comparamos os dois primeiros itens do vetor. Se estiverem na ordem errada, são trocados. Se estiverem na ordem errada, são trocados.

100 Estrutura de Dados BubbleSort Comparam-se então os dois itens do par seguinte - ou seja, a posição 2 e 3 do vetor. Comparam-se então os dois itens do par seguinte - ou seja, a posição 2 e 3 do vetor. Se estiverem desordenados trocam-se. Se estiverem desordenados trocam-se. Continuamos a comparar os pares seguintes e a trocar os itens do par sempre que estiverem desordenados, até ao fim do vetor. Continuamos a comparar os pares seguintes e a trocar os itens do par sempre que estiverem desordenados, até ao fim do vetor.

101 Estrutura de Dados BubbleSort Embora o vetor não fique ordenado após a primeira passagem, o maior elemento foi bubbled para a sua posição, no fim do vetor. Embora o vetor não fique ordenado após a primeira passagem, o maior elemento foi bubbled para a sua posição, no fim do vetor. Na segunda passagem, volta para o início do vetor e é considerado os pares de itens como na primeira passagem. Na segunda passagem, volta para o início do vetor e é considerado os pares de itens como na primeira passagem. No entanto, não é incluído o último, e o maior, elemento. No entanto, não é incluído o último, e o maior, elemento.

102 Estrutura de Dados BubbleSort A segunda passagem só leva em conta N-1 elementos do vetor. Após a segunda passagem teremos o segundo maior elemento na sua posição correta. A segunda passagem só leva em conta N-1 elementos do vetor. Após a segunda passagem teremos o segundo maior elemento na sua posição correta. Agora, ignorando os últimos dois elementos, que já estão na ordem correta, continua com as passagens subseqüentes até que o vetor fique ordenado. Agora, ignorando os últimos dois elementos, que já estão na ordem correta, continua com as passagens subseqüentes até que o vetor fique ordenado.

103 Estrutura de Dados BubbleSort

104 Estrutura de Dados Insertion Sort Insertion sort parte um vetor em duas regiões: a região ordenada e a não ordenada. Insertion sort parte um vetor em duas regiões: a região ordenada e a não ordenada. Inicialmente, o vetor corresponde à região não ordenada. Inicialmente, o vetor corresponde à região não ordenada. Em cada passo, pega-se o primeiro elemento da região não ordenada e coloca-o na ordem correta da região ordenada. Em cada passo, pega-se o primeiro elemento da região não ordenada e coloca-o na ordem correta da região ordenada. O primeiro passo é trivial e pode ser omitido. O primeiro passo é trivial e pode ser omitido.

105 Estrutura de Dados Insertion Sort O movimento do primeiro elemento da região não ordenada para a região ordenada é ignorado O movimento do primeiro elemento da região não ordenada para a região ordenada é ignorado considerando a primeira posição do vetor como a região ordenada, e as restantes posições como a região não ordenada. considerando a primeira posição do vetor como a região ordenada, e as restantes posições como a região não ordenada.

106 Estrutura de Dados Insertion Sort Copia 10 Desloca o 29 Insere o 10; copia 14 Desloca o 29 Insere o 14 Copia o 13 Desloca o 14, 29, 37 Insere o 13

107 Estrutura de Dados Método que simula uma árvore binária completa, por meio deste método utiliza-se uma simulação de uma arvore binária completa e utiliza-se certas funções especiais deste tipo de dado para realizar a ordenação Método que simula uma árvore binária completa, por meio deste método utiliza-se uma simulação de uma arvore binária completa e utiliza-se certas funções especiais deste tipo de dado para realizar a ordenação Uma árvore com estrutura heap é aquela em que, para toda sub- árvore, o nó raiz é um divisor de valores, ou seja, os valores maiores estão sempre de um lado e os menores estão do outro lado. Uma árvore com estrutura heap é aquela em que, para toda sub- árvore, o nó raiz é um divisor de valores, ou seja, os valores maiores estão sempre de um lado e os menores estão do outro lado. Deste modo o elemento no topo da árvore é sempre o elemento de inicio da seqüência (em modo crescente o menor). Deste modo o elemento no topo da árvore é sempre o elemento de inicio da seqüência (em modo crescente o menor). Heapsort

108 Estrutura de Dados Este método tem em seu pior caso de inserção de um dado na árvore em razão de log n, o que seria realizado utilizando percorrer o tamanho da árvore, não a árvore inteira. Este método tem em seu pior caso de inserção de um dado na árvore em razão de log n, o que seria realizado utilizando percorrer o tamanho da árvore, não a árvore inteira. Este é um método bastante eficiente porém requer a construção e ordenação de uma árvore binária, o que o torna mais complexo de ser implementado, e utiliza mais recursos. Este é um método bastante eficiente porém requer a construção e ordenação de uma árvore binária, o que o torna mais complexo de ser implementado, e utiliza mais recursos. Heapsort - Utilização

109 Estrutura de Dados Método de ordenação linear. Requer o tamanho máximo de um valor dentro da seqüência para então utilizar uma seqüência virtual de contagem que tem este tamanho máximo, fazendo com que todos os valores da seqüência original sejam contados e que seja colocado na posição referente a seu valor nesta seqüência virtual a quantidade de valores referentes a cada posição. Método de ordenação linear. Requer o tamanho máximo de um valor dentro da seqüência para então utilizar uma seqüência virtual de contagem que tem este tamanho máximo, fazendo com que todos os valores da seqüência original sejam contados e que seja colocado na posição referente a seu valor nesta seqüência virtual a quantidade de valores referentes a cada posição. Então utiliza outra seqüência auxiliar com o tamanho da seqüência original que irá conter os valores da seqüência original ordenando-os através da busca nesta seqüência original na quantidade de vezes que contém cada uma das posições da seqüência virtual de contagem. Então utiliza outra seqüência auxiliar com o tamanho da seqüência original que irá conter os valores da seqüência original ordenando-os através da busca nesta seqüência original na quantidade de vezes que contém cada uma das posições da seqüência virtual de contagem. Counting Sort

110 Estrutura de Dados Este método só pode ser utilizado com números inteiros, visto que sua forma de ordenação é através de utilização de uma seqüência posicional que irá receber a quantidade de vezes que o valor referente a tal posição aparece na seqüência. Este método só pode ser utilizado com números inteiros, visto que sua forma de ordenação é através de utilização de uma seqüência posicional que irá receber a quantidade de vezes que o valor referente a tal posição aparece na seqüência. Para garantir estabilidade ele deve varrer os elementos do lado contrário a sua determinada ordenação, ou seja, para ordenação crescente ele deve varrer do último ao primeiro elemento. Para garantir estabilidade ele deve varrer os elementos do lado contrário a sua determinada ordenação, ou seja, para ordenação crescente ele deve varrer do último ao primeiro elemento. Counting Sort - Utilização

111 Estrutura de Dados Este é um método a ser implementado quando a comparação entre os elementos da seqüência é um problema, ele utiliza operações aritméticas e atribuições para realizar seu trabalho. Este é um método a ser implementado quando a comparação entre os elementos da seqüência é um problema, ele utiliza operações aritméticas e atribuições para realizar seu trabalho. No entanto para uma seqüência em que o valor máximo é muito grande ele utiliza muitos recursos sem necessidade. No entanto para uma seqüência em que o valor máximo é muito grande ele utiliza muitos recursos sem necessidade. Counting Sort - Utilização

112 Estrutura de Dados Método de ordenação linear que supõe que os elementos a serem ordenados possuem uma natureza peculiar. Método de ordenação linear que supõe que os elementos a serem ordenados possuem uma natureza peculiar. Pro exemplo, os elementos devem estar uniformemente distribuídos em um intervalo semi-aberto, a idéia é dividir este intervalo em n segmentos de mesmo tamanho (buckets) e distribuir os n elementos nos seus respectivos segmentos. Pro exemplo, os elementos devem estar uniformemente distribuídos em um intervalo semi-aberto, a idéia é dividir este intervalo em n segmentos de mesmo tamanho (buckets) e distribuir os n elementos nos seus respectivos segmentos. Bucket Sort

113 Estrutura de Dados Como os elementos estão distribuídos uniformemente, espera-se que o número de elementos seja aproximadamente o mesmo em todos os segmentos. Como os elementos estão distribuídos uniformemente, espera-se que o número de elementos seja aproximadamente o mesmo em todos os segmentos. Em seguida, os elementos de cada segmento são ordenados por um método qualquer e então os segmentos ordenados são concatenados em ordem Em seguida, os elementos de cada segmento são ordenados por um método qualquer e então os segmentos ordenados são concatenados em ordem Bucket Sort

114 Estrutura de Dados Este método pode ser utilizado em conjunto com outros métodos para realizar a separação de um problema grande em vários problemas pequenos, sendo mais simples de ordenar pelos métodos anteriormente descritos Este método pode ser utilizado em conjunto com outros métodos para realizar a separação de um problema grande em vários problemas pequenos, sendo mais simples de ordenar pelos métodos anteriormente descritos Bucket Sort - Utilização

115 Estrutura de Dados ShackerSort

116 Estrutura de Dados ShackerSort

117 Estrutura de Dados ShackerSort - Utilização

118 Estrutura de Dados ShackerSort - Utilização

119 Estrutura de Dados ShackerSort - Utilização

120 Estrutura de Dados ShellSort

121 Estrutura de Dados ShellSort

122 Estrutura de Dados ShellSort

123 Estrutura de Dados ShellSort

124 Estrutura de Dados ShellSort

125 Estrutura de Dados ShellSort

126 Estrutura de Dados ShellSort

127 Estrutura de Dados ShellSort

128 Estrutura de Dados ShellSort

129 Estrutura de Dados ShellSort

130 Estrutura de Dados ShellSort

131 Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Algoritmos de Ordenação Prof. MSc. Vladimir Camelo 131


Carregar ppt "Estrutura de Dados São Paulo, 2010 Universidade Paulista (UNIP) Estrutura de Dados (Linguagem C / C++) Prof. Msc."

Apresentações semelhantes


Anúncios Google