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

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

Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Apresentações semelhantes


Apresentação em tema: "Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS."— Transcrição da apresentação:

1 Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS

2 Introdução aos métodos de classificação Uma tarefa muito comum em programação é se colocar em ordem uma lista de valores. Uma tarefa muito comum em programação é se colocar em ordem uma lista de valores. Na prática os valores a serem ordenados raramente serão valores isolados, em geral cada um deles fará parte de um registro. Cada registro irá conter uma chave, que é o valor a ser ordenado e o restante é chamado de dados satélite (estes valores tem que ser permutados junto com a chave). Na prática os valores a serem ordenados raramente serão valores isolados, em geral cada um deles fará parte de um registro. Cada registro irá conter uma chave, que é o valor a ser ordenado e o restante é chamado de dados satélite (estes valores tem que ser permutados junto com a chave).

3 Introdução aos métodos de classificação Se cada registro incluir uma quantidade muito grande de dado satélite, pode-se ser permutado um arranjo de ponteiros para os registros em lugar de se permutar o próprio registro. Se cada registro incluir uma quantidade muito grande de dado satélite, pode-se ser permutado um arranjo de ponteiros para os registros em lugar de se permutar o próprio registro. O fato de ordenarmos números individuais ou grandes registros que contém números é irrelevante para o estudo de um método pelo qual um procedimento de ordenação determina a seqüência ordenada. O fato de ordenarmos números individuais ou grandes registros que contém números é irrelevante para o estudo de um método pelo qual um procedimento de ordenação determina a seqüência ordenada. Para tornar a notação mais simplificada, neste estudo consideraremos que a entrada será somente arrays de inteiros Para tornar a notação mais simplificada, neste estudo consideraremos que a entrada será somente arrays de inteiros

4 Classificação Bolha por Seleção Algoritmo não recursivo baseado em seleção de elementos. Algoritmo não recursivo baseado em seleção de elementos. Não é tão eficiente, mas é considerado o mais fácil de todos; Não é tão eficiente, mas é considerado o mais fácil de todos; Consiste em fixar uma posição e percorrer o restante do conjunto, cada vez que for encontrado um elemento menor que o fixado este é trocado pelo elemento fixado. Consiste em fixar uma posição e percorrer o restante do conjunto, cada vez que for encontrado um elemento menor que o fixado este é trocado pelo elemento fixado. Fixa o próximo elemento do conjunto. Fixa o próximo elemento do conjunto. Desta forma ao fixarmos o penúltimo elemento do conjunto o mesmo estará ordenado Desta forma ao fixarmos o penúltimo elemento do conjunto o mesmo estará ordenado Visto em Programação I Visto em Programação I

5 Classificação Bubble Sort (1/2) Bolha por troca Algoritmo não recursivo, baseado em trocas de elementos, que consiste do seguinte: Algoritmo não recursivo, baseado em trocas de elementos, que consiste do seguinte: Para I variando de 1 até N – 1, compara-se A I com A I+1, trocando-se os dois valores se A I > A I+1. Após esse passo o maior valor ficará na última posição. Para I variando de 1 até N – 1, compara-se A I com A I+1, trocando-se os dois valores se A I > A I+1. Após esse passo o maior valor ficará na última posição. Percorre-se novamente o array para I variando de 1 até N – 2, comparando-se os elementos adjacentes, efetuando a troca se houver necessidade. Após esse passo o segundo maior valor ficará na penúltima posição. Percorre-se novamente o array para I variando de 1 até N – 2, comparando-se os elementos adjacentes, efetuando a troca se houver necessidade. Após esse passo o segundo maior valor ficará na penúltima posição. Continua-se até que não haja nenhuma troca ou se chegar a situação de se comparar A 1 com A 2. Continua-se até que não haja nenhuma troca ou se chegar a situação de se comparar A 1 com A 2.

6 Classificação Bubble Sort (2/2)

7 Algoritmo Bubble Sort

8 Classificação por Seleção Direta (1/2) Esse método consiste do seguinte: Esse método consiste do seguinte: Procura-se o menor valor entre os elementos A1, A2,... AN e coloca-se em A1; Procura-se o menor valor entre os elementos A1, A2,... AN e coloca-se em A1; Procura-se o menor valor entre os elementos A2, A3,... AN e coloca-se em A2; Procura-se o menor valor entre os elementos A2, A3,... AN e coloca-se em A2; Continua-se com o processo até chegar a condição de procurarmos o menor valor entre AN-1 e AN. Neste caso colocamos o menor em AN-1 e o maior em AN e terminamos o processo. Continua-se com o processo até chegar a condição de procurarmos o menor valor entre AN-1 e AN. Neste caso colocamos o menor em AN-1 e o maior em AN e terminamos o processo. Como exemplo consideremos o seguinte array: Como exemplo consideremos o seguinte array:

9 Classificação por Seleção Direta (2/2)

10 Seleção direta

11 Classificação por Inserção (1/4) Esse método consiste em se dividir a lista em duas: uma classificada e a outra desclassificada. A seguir, cada elemento da lista desclassificada é inserido na classificada, aumentando-se consequentemente o tamanho da classificada e diminuindo-se o tamanho da desclassificada. Por exemplo, suponhamos que o array que desejamos classificar tenha os seguintes valores: Esse método consiste em se dividir a lista em duas: uma classificada e a outra desclassificada. A seguir, cada elemento da lista desclassificada é inserido na classificada, aumentando-se consequentemente o tamanho da classificada e diminuindo-se o tamanho da desclassificada. Por exemplo, suponhamos que o array que desejamos classificar tenha os seguintes valores: (8, 2, 5, 3, 10, 7, 1, 4, 6, 9) (8, 2, 5, 3, 10, 7, 1, 4, 6, 9) Uma maneira de proceder a classificação é criar uma outra lista e, à medida que formos percorrendo os elementos da primeira lista iremos inserindo na segunda na posição correta, como mostrado a seguir: Uma maneira de proceder a classificação é criar uma outra lista e, à medida que formos percorrendo os elementos da primeira lista iremos inserindo na segunda na posição correta, como mostrado a seguir:

12 Classificação por Inserção (2/4)

13 Classificação por Inserção (3/4) Para implementar esse algoritmo, a primeira idéia que nos vem à mente é usar dois arrays. Mas, se for observado atentamente, notamos que a lista da esquerda cresce exatamente na mesma velocidade com que a da direita diminui. Assim nós só precisamos de um array, ficando uma lista à esquerda do array e a outra à direita. A figura abaixo mostra a mesma figura anterior porém usando somente um array Para implementar esse algoritmo, a primeira idéia que nos vem à mente é usar dois arrays. Mas, se for observado atentamente, notamos que a lista da esquerda cresce exatamente na mesma velocidade com que a da direita diminui. Assim nós só precisamos de um array, ficando uma lista à esquerda do array e a outra à direita. A figura abaixo mostra a mesma figura anterior porém usando somente um array

14 Classificação por Inserção (4/4)

15 Algoritmo de Inserção Direta

16 Classificação por QuickSort (1/4) Classificação por QuickSort (1/4) Método recursivo usa a técnica de dividir e conquistar, ou seja ele resolve um problema dividindo-o em dois ou mais subproblemas e depois combinando a solução dos problemas menores para obter a solução do problema original. Método recursivo usa a técnica de dividir e conquistar, ou seja ele resolve um problema dividindo-o em dois ou mais subproblemas e depois combinando a solução dos problemas menores para obter a solução do problema original. Em sua execução o Quicksort realiza os seguintes passos: Em sua execução o Quicksort realiza os seguintes passos:

17 Classificação por QuickSort (2/4) 1 – Escolhe um elemento do conjunto para pivô. Pode-se ser escolhido qualquer elemento. 1 – Escolhe um elemento do conjunto para pivô. Pode-se ser escolhido qualquer elemento. 2 – Particione os elementos restantes em duas sequências L e G, tais que todo elemento em L seja menor ou igual ao pivô e todo elemento em G seja maior que o pivô. No caso geral tanto L quanto G não estão ordenados. 2 – Particione os elementos restantes em duas sequências L e G, tais que todo elemento em L seja menor ou igual ao pivô e todo elemento em G seja maior que o pivô. No caso geral tanto L quanto G não estão ordenados. Realize o QuickSort recursivamente para as sequências L e G não ordenadas. Realize o QuickSort recursivamente para as sequências L e G não ordenadas. Um conjunto de um único elemento é considerado ordenado. Um conjunto de um único elemento é considerado ordenado.

18 Classificação por QuickSort (3/4) Exemplos de classificação Exemplos de classificação O algoritmo possui complexidade média O(n log n) e pior caso de O(n²), entretanto a probabilidade de ocorrer o pior caso é muito pequena, sendo um dos algoritmos mais usados em ordenação. O algoritmo possui complexidade média O(n log n) e pior caso de O(n²), entretanto a probabilidade de ocorrer o pior caso é muito pequena, sendo um dos algoritmos mais usados em ordenação.

19 AlgoritmoAlgoritmoAlgoritmoAlgoritmo

20 Classificação por MergeSort É um algoritmo do tipo dividir e conquistar que realiza uma classificação por Fusão. É um algoritmo do tipo dividir e conquistar que realiza uma classificação por Fusão. Um problema com o Quicksort é que sua complexidade no pior caso é O(n²) por ser difícil controlar o processo de particionamento, não se tem garantias que os vetores particionados serão mais ou menos de mesmo tamanho Um problema com o Quicksort é que sua complexidade no pior caso é O(n²) por ser difícil controlar o processo de particionamento, não se tem garantias que os vetores particionados serão mais ou menos de mesmo tamanho Desenvolvido por John Von Newmann foi um dos primeiros algoritmos de ordenação usados em um computador. Desenvolvido por John Von Newmann foi um dos primeiros algoritmos de ordenação usados em um computador. Um vetor temporário tem que ser usado para o processo de fusão. Após a fusão estar completa o conteúdo do vetor temporário é transferido para o vetor original. Um vetor temporário tem que ser usado para o processo de fusão. Após a fusão estar completa o conteúdo do vetor temporário é transferido para o vetor original.

21 Classificação por MergeSort O algoritmo segue os seguintes passos: O algoritmo segue os seguintes passos: Se o conjunto tiver pelo menos 2 elementos Se o conjunto tiver pelo menos 2 elementos Chama recursivamente MergeSort com a metade esquerda do conjunto Chama recursivamente MergeSort com a metade esquerda do conjunto Chama recursivamente MergeSort com a metade direita do conjunto Chama recursivamente MergeSort com a metade direita do conjunto Na volta das chamadas recursivas as metades vão sendo fundidas ordenadamente no vetor temporário Na volta das chamadas recursivas as metades vão sendo fundidas ordenadamente no vetor temporário Após concluída a fusão o conteúdo do vetor temporário é transferido para o vetor original. Após concluída a fusão o conteúdo do vetor temporário é transferido para o vetor original.

22 AlgoritmoAlgoritmoAlgoritmoAlgoritmo

23 Classificação por HeapSort Desenvolvido em 1964 por Robert Floyd e John Willians Desenvolvido em 1964 por Robert Floyd e John Willians Tem um desempenho em tempo de execução muito bom em conjuntos ordenados aleatoriamente. Tem um desempenho em tempo de execução muito bom em conjuntos ordenados aleatoriamente. Seu desempenho no pior caso é praticamente igual ao seu desempenho no caso médio. Seu desempenho no pior caso é praticamente igual ao seu desempenho no caso médio. O tempo de execução em pior cenário para ordenar é de O(n log n). O tempo de execução em pior cenário para ordenar é de O(n log n). É um algoritmo de ordenação por seleção. É um algoritmo de ordenação por seleção. Esta ordenação usa uma estrutura chamada heap (monte). Esta ordenação usa uma estrutura chamada heap (monte).

24 Classificação por HeapSort Um heap é uma árvore binária completa. Um heap é uma árvore binária completa. A árvore está completamente preenchida em todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda até certo ponto. A árvore está completamente preenchida em todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda até certo ponto. Cada nó da árvore corresponde a um elemento do conjunto. Cada nó da árvore corresponde a um elemento do conjunto. Este heap pode ser armazenado como um vetor. Este heap pode ser armazenado como um vetor. Antes de vermos como relacionar o vetor com o heap vejamos alguns conceitos sobre árvores. Antes de vermos como relacionar o vetor com o heap vejamos alguns conceitos sobre árvores.

25 Classificação por HeapSort (Alguns conceitos básicos sobre árvores) Uma árvore consiste em um conjunto de elementos chamados de NÓS. Uma árvore consiste em um conjunto de elementos chamados de NÓS. Um dos nós da árvore, o que estiver situado acima de todos os outros é chamado de RAIZ. Um dos nós da árvore, o que estiver situado acima de todos os outros é chamado de RAIZ. Esquematicamente, uma árvore pode ser representada da seguinte forma:

26 Cada nó da árvore é a raiz de uma subárvore. Cada nó da árvore é a raiz de uma subárvore. Um nó que não possua outros nós abaixo dele é chamado de folha ou nó terminal. Um nó que não possua outros nós abaixo dele é chamado de folha ou nó terminal. A raiz de uma árvore é chamada de pai das raízes das suas subárvores. A raiz de uma árvore é chamada de pai das raízes das suas subárvores. As raízes das subárvores de um nó são chamadas de irmãos, que por sua vez são filhos de um nó pai. As raízes das subárvores de um nó são chamadas de irmãos, que por sua vez são filhos de um nó pai. Um árvore binária é uma estrutura do tipo árvore, onde cada nó pode ter no máximo dois filhos, que serão chamados respectivamente de filho da esquerda e filho da direita. Um árvore binária é uma estrutura do tipo árvore, onde cada nó pode ter no máximo dois filhos, que serão chamados respectivamente de filho da esquerda e filho da direita. Classificação por HeapSort (Alguns conceitos básicos sobre árvores)

27 Exemplo de árvore binária: Exemplo de árvore binária:

28 Classificação por HeapSort (Alguns conceitos básicos sobre árvores)

29 Uma árvore binária é denominada cheia se todas as folhas estão no mesmo nível e todos os nós não-folhas têm dois filhos. Uma árvore binária é denominada cheia se todas as folhas estão no mesmo nível e todos os nós não-folhas têm dois filhos. Uma árvore binária de altura h é denominada completa se ela for cheia até o nível h-1 e os nós do nível h ocupam as posições mais à esquerda da árvore. Uma árvore binária de altura h é denominada completa se ela for cheia até o nível h-1 e os nós do nível h ocupam as posições mais à esquerda da árvore.

30 Classificação por HeapSort Revendo os conceitos sobre heap: Revendo os conceitos sobre heap: Um heap é uma árvore binária completa. Um heap é uma árvore binária completa. A árvore está completamente preenchida em todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda até certo ponto. A árvore está completamente preenchida em todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda até certo ponto. Cada nó da árvore corresponde a um elemento do conjunto. Cada nó da árvore corresponde a um elemento do conjunto. Este heap pode ser armazenado como um vetor. Este heap pode ser armazenado como um vetor.

31 Classificação por HeapSort A raiz da árvore é dada por vet[1]. Dado o índice i de um nó os índices de seu pai, de seu filho da esquerda e filho da direita podem ser calculados facilmente por:

32 Classificação por HeapSort Pai (i) = i/2 Pai (i) = i/2 Filho da esquerda (i) = 2 * i Filho da esquerda (i) = 2 * i Filho da direita (i) = 2*i + 1 Filho da direita (i) = 2*i + 1 Um heap pode ser máximo ou mínimo. Um heap máximo obedece a seguinte propriedade: Um heap pode ser máximo ou mínimo. Um heap máximo obedece a seguinte propriedade: O pai de um nó sempre é maior ou igual a seus filhos O pai de um nó sempre é maior ou igual a seus filhos Desta forma o maior valor de um heap máximo sempre estará em sua raiz. Desta forma o maior valor de um heap máximo sempre estará em sua raiz. Neste método de classificação trabalharemos com heaps máximos. Neste método de classificação trabalharemos com heaps máximos.

33 Classificação por HeapSort A idéia do Heapsort é organizar o vetor como uma árvore binária completa. A idéia do Heapsort é organizar o vetor como uma árvore binária completa. Transformar esta árvore em um heap máximo usando o método de Floyd base para cima. Transformar esta árvore em um heap máximo usando o método de Floyd base para cima. Trocar a raiz com a última folha da árvore. Trocar a raiz com a última folha da árvore. Podar a última folha da árvore. Podar a última folha da árvore. Regenerar o heap, que agora está com n-1 elementos. Regenerar o heap, que agora está com n-1 elementos. Trocar a raiz com a última folha da árvore e assim por diante até que se tenha uma árvore de um único elemento. Trocar a raiz com a última folha da árvore e assim por diante até que se tenha uma árvore de um único elemento.

34 Em outras palavras a idéia do algoritmo HeapSort é encontrar o maior elemento (se construirmos um heap será a raiz do heap) entre n elementos e o trocar com a última posição do vetor (a última folha). Em outras palavras a idéia do algoritmo HeapSort é encontrar o maior elemento (se construirmos um heap será a raiz do heap) entre n elementos e o trocar com a última posição do vetor (a última folha). Considerar como se esta posição tivesse sido tirada do vetor (na verdade vamos apenas decrementar o fim da parte válida do vetor). Considerar como se esta posição tivesse sido tirada do vetor (na verdade vamos apenas decrementar o fim da parte válida do vetor). Procura novamente o maior elemento entre os n-1 elementos restantes colocando-a na última posição válida do vetor atual, decrementar o fim válido do vetor. Procura novamente o maior elemento entre os n-1 elementos restantes colocando-a na última posição válida do vetor atual, decrementar o fim válido do vetor. Continua fazendo isto enquanto a parte válida do vetor conter mais de um elemento. Continua fazendo isto enquanto a parte válida do vetor conter mais de um elemento. Classificação por HeapSort

35 Vejamos no quadro como funciona o método Floyd Base para cima de criação e regeneração de um heap: Vejamos no quadro como funciona o método Floyd Base para cima de criação e regeneração de um heap: Percorre-se todos os pais da árvore indo do fim da mesma para o começo. Cada vez que se encontrar um pai que possua um filho maior que ele troca-se o valor do pai pelo valor de seu maior filho. Após todos os pais da árvore terem sido percorridos ela será um heap. Poderemos então trocar o valor da raiz da árvore com o do último elemento do vetor. Considerando um conjunto de n-1 elementos, começamos tudo novamente. Percorre-se todos os pais da árvore indo do fim da mesma para o começo. Cada vez que se encontrar um pai que possua um filho maior que ele troca-se o valor do pai pelo valor de seu maior filho. Após todos os pais da árvore terem sido percorridos ela será um heap. Poderemos então trocar o valor da raiz da árvore com o do último elemento do vetor. Considerando um conjunto de n-1 elementos, começamos tudo novamente. O algoritmo HeapSort será divido em quatro métodos: O algoritmo HeapSort será divido em quatro métodos:

36 A l g o r i t m o Parte 1

37 A l g o r i t m o A l g o r i t m o Parte 2

38 O método heapSort recebe como argumento um vetor desordenado e após sua execução o vetor estará ordenado. O método heapSort recebe como argumento um vetor desordenado e após sua execução o vetor estará ordenado. O método maxHeapify é uma importante rotina. Ela recebe como entrada o arranjo v e um índice pos para o arranjo, além do tamanho válido do vetor. Quando este método é chamado supomos que suas subárvores esquerda e direita são heap máximos mas que o próprio nó v[pos] pode ser menor que seus filhos violando assim a propriedade de heap máximo. A função de maxHeapify é deixar que o valor em v[pos] flutue para baixo tornando assim esta subárvore, com raiz em pos, também um heap máximo. O método maxHeapify é uma importante rotina. Ela recebe como entrada o arranjo v e um índice pos para o arranjo, além do tamanho válido do vetor. Quando este método é chamado supomos que suas subárvores esquerda e direita são heap máximos mas que o próprio nó v[pos] pode ser menor que seus filhos violando assim a propriedade de heap máximo. A função de maxHeapify é deixar que o valor em v[pos] flutue para baixo tornando assim esta subárvore, com raiz em pos, também um heap máximo. O método buildMaxHeap percorre os pais da árvore de baixo para cima executando maxHeapify sobre cada um deles. O método buildMaxHeap percorre os pais da árvore de baixo para cima executando maxHeapify sobre cada um deles. O método swap simplesmente faz a troca entre dois elementos da árvore. O método swap simplesmente faz a troca entre dois elementos da árvore.


Carregar ppt "Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS."

Apresentações semelhantes


Anúncios Google