MC3305 Algoritmos e Estruturas de Dados II Aula 22 && Revisão geral Prof. Jesús P. Mena-Chalco jesus.mena@ufabc.edu.br 2Q-2015 1
Medida de custo/complexidade de um algoritmo 2
(1) medida de custo pela execução de um programa em uma plataforma real Tais medidas são bastante inadequadas e os resultados jamais devem ser generalizados: Os resultados são dependentes do compilador que pode favorecer algumas construções em detrimento de outras; Os resultados dependem de hardware; Quanto grandes quantidades de memória são utilizadas, as medidas de tempo podem depender deste aspecto. 3
(1) medida de custo pela execução de um programa em uma plataforma real Apesar disso, há argumentos a favor de se obterem medidas reais de tempo: Exemplo: Quando há vários algoritmos distintos para resolver o problema; Assim, são considerados tanto os custos reais das operações como os custos não aparentes, tais como alocação de memória, indexação, carga, dentre outros. 4
(2) medida de custo por meio de um modelo matemático Usa um modelo matemático baseado em um computador idealizado. Deve ser especificado o conjunto de operações e seus custos de execuções. É mais usual ignorar o custo de algumas das operações e considerar apenas as mais significantes. Em algoritmos de ordenação: Consideramos o conjunto de comparações entre os elementos do conjunto a ser ordenado e ignoramos as operações aritméticas, de atribuição e manipulação de índices, caso existam. 5
Função de complexidade Para medir o custo de execução de um algoritmo, é comum definir uma função de custo ou função de complexidade f. Função de complexidade de tempo: mede o tempo necessário para executar um algoritmo para um problema de tamanho n. Função de complexidade de espaço: mede a memória necessária para executar um algoritmo para um problema de tamanho n. Utilizaremos f para denotar uma função de complexidade de tempo daqui para frente. Na realidade, f não representa tempo diretamente, mas o número de vezes que determinada operação (considerada relevante) é realizada. 6
Melhor caso, pior caso e caso médio Melhor caso: Menor tempo de execução sobre todas as entradas de tamanho n. Pior caso: Maior tempo de execução sobre todas as entradas de tamanho n. Caso médio (caso esperado): Média dos tempos de execução de todas as entradas de tamanho n. Aqui supoe-se uma distribuição de probabilidades sobre o conjunto de entradas de tamanho n. 7
Comparação de programas Estudamos o comportamento assintótico das funções de custo (comportamento de suas funções de custo para valores grande de n). O comportamento assintótico de f(n) representa o limite do comportamento de custo, quando n cresce. 8
Comparação de programas: exemplo O programa1 leva O programa2 leva vezes para ser executado. vezes para ser executa. Qual dos dois é o melhor? Depende do tamanho do problema. Para n<50, o programa 2 é melhor Para n>50, o programa 1 é melhor 9
Comparação de programas Se uma função não é O(f(n)) isso implica que a função seja Omega(f(n))? 10
11
Tratabilidade do problema Um problema é considerado Intratável (difícil): Se ele é tão difícil que não se conhece um algoritmo polinomial para resolvê-lo Ex. Algoritmo do caixeiro viajante Tratável / bem resolvido (fácil): Se existe um algoritmo polinomial para resolvê-lo. Ex. Algoritmo de multiplicação de matrizes. Algoritmo de Strassen 12
Questão importante 13
Questão importante 14
Recursividade 15
Recursividade Uma função recursiva é aquela que se chama a si mesma (obrigatoriamente)? 16
Recursividade Uma função recursiva não necessariamente é aquela que se chama a si mesma 17
Ordenação 18
Ordenação Os métodos de ordenação são classificados em 2 grandes grupos: Ordenação Interna: Se o arquivo a ser ordenado cabe todo na memória principal Ordenação Externa: Se o arquivo a ser ordenado não cabe todo na memória principal 19
Ordenação 20
Ordenação Os métodos de ordenação são classificados em 2 grandes grupos: Ordenação Interna: Se o arquivo a ser ordenado cabe todo na memória principal Algoritmos Baseados em Comparações Algoritmos Não Baseados em Comparações 21
Ordenação Algoritmos basedos em Comparações Insertion sort Selection sort Bubble sort Merge sort Quick sort Complexidade computacional [limite matemático] [limite assintótico para a ordenação] 22
Ordenação Algoritmos basedo em Comparações Insertion sort Selection sort Bubble sort Merge sort Quick sort Algoritmos não baseados em Comparações (utilizam alguma informação sobre os dados) Counting sort Radix sort Bin sort / Bucket sort Algoritmos que fazem a ordenação em tempo linear 23
Ordenação 24
Ordenação (bogosort.c) 25
Ordenação parcial 26
Ordenação parcial Os algoritmos de Ord. Parcial que estudamos: Seleção parcial Inserção parcial Heapsort parcial Quicksort parcial (implementado muito bem por vocês!) 27
Seleção parcial Um dos algoritmos mais simples. Principio de funcionamento: Selecione o menor item do vetor. Troque-o com o item que está na primeira posição do vetor. Repita estas duas operações com os itens: n-1, n-2, n-3,, n-(k-1), n-k k=7 Animação: https://www.cs.usfca.edu/~galles/visualization/comparisonsort.html 28
Comparação entre algoritmos 29
Heurísticas de pesquisa Procedimento simplificador (embora não simplista) 30
Heurísticas proposta por Rivest Move To Front (MTF) para listas: Elemento vai para a primeira posição. Transposição (T) para vetores: Elemento vai para a uma posição mais perto do início. 31
Heurísticas proposta por Rivest MTF Elemento vai para a primeira posição. T Elemento vai para a uma posição mais perto do início. É possível fazer melhor que MTF e T? Sim Aplicar a regra apenas quando o elemento é acessado k vezes seguidas, para k=2,3, ou 4. Leva mais tempo para estabilizar, mas faz de uma melhor maneira. 32
Árvores 33
Árvores de pesquisa A árvore de pesquisa é uma estrutura muito eficiente para armazenar informação. Apropriada quando existe necessidade de considerar todos ou alguma combinação de: Acesso direto e sequencial eficientes. Facilidade de inserção e retirada de elementos. Boa taxa de utilização de memória. Utilização de memória principal e secundária. 34
Representação hierárquica Representação por barras Representação por parênteses 35
Nós e filhos Carga útil Campos que dão estrutura à árvore O nó folha (=leaf) é um nó que não tem filho algum. Se x tiver um pai, essa árvore é uma subárvore de alguma árvore maior. 36
Varredura Uma função recursiva que faz a varredura e-r-d de uma árvore binária r: 37
Varredura 38
Complexidade de busca em uma ABB Busca em ABB = caminho da raiz até a chave desejada (ou até a folha, caso a chave não exista) Pior caso: Maior caminho até a folha = altura da árvore Complexidade: Uma árvore binária balanceada é aquela com altura 39
Árvore AVL 40
AVL Georgy M. Adelson-Velsky Russia Evgenii Mikhailovich Landis Ucrania (1922-2014/abril/26) (1921-1997) 41
AVL G.M. Adelson-Velskii y E.M. Landis An algorithm for the organization of information. Proceedings of the USSR Academy of Sciences, vol. 146, pp. 263 266, 1962 AVL foi a primeira estrutura (conhecida) de árvore de altura balanceada ou altura equilibrada. 42
Árvores AVL 43
Árvores AVL: Fator de balanceamento O fator de balanceamento/equilibrio de um nó T em uma ABB é definido como: Para qualquer nó T em uma árvore AVL, o fator de balanceamento assume o valor: +1, 0, -1. O fator de balanceamento de uma folha? 44
Árvores AVL: Fator de balanceamento 45
Árvores AVL: Rotações O processo de rebalanceamento é conduzido utilizando 4 tipos de rotações LL RR LR RL 46
Árvores AVL Há um custo adicional para manter uma árvore balanceada, mesmo assim garantindo O(log2 n), mesmo no pior caso, para todas as operações. Em testes empíricos: Uma rotação é necessária a cada duas inserções. Uma rotação é necessária a cada cinco remoções. 47
Árvore Rubro-Negras 48
Árvore Rubro-Negra Rudolf Bayer Computer scientist 49
Árvore Rubro-Negra Somente em 1978, Leo Guibas e Robert Sedgewick, atribuiram a 'coloração' na árvore. A cor "vermelho" foi escolhida porque era a mais bonita produzida pela impressora laser a cores disponíveis para os autores, enquanto trabalhavam na Xerox PARC 50
Propriedades de Árvore Rubro-Negra As propriedades da árvore rubronegra são: 1- Todo nó da árvore ou é vermelho ou é preto 2- A raiz e as folhas (nil) são pretas 3- Se um nó é vermelho, então seus filhos são pretos 4- Para todo nó, todos os caminhos do nó até as folhas descendentes contêm o mesmo número de nós pretos. 51
Altura de uma Árvore Rubro-Negra As ARNs com n nós/chaves internas tem altura, no máximo, igual a 2 lg(n+1) = O(log(n)) A prova é por indução. Ver detalhes no livro de Cormen et al. 52
Inserção 53
Altura de uma Árvore Rubro-Negra Nenhum caminho é maior do que duas vezes o comprimento de qualquer outro caminho 54
AVL vs Rubro-Negra Altura (pior caso) AVL: 1.44 lg(n+1) ARN: 2 lg(n+1) Árvores AVL são mais rigidamente balanceadas que ARN: AVL A inserção e remoção são mais lentas. AVL A busca (recuperação) são mais rápidas. AVL: Eficiente para árvores que mudam pouco. ARN: Eficiente para árvores de mudam muito. 55
AVL vs Rubro-Negra 56
Árvores Digitais (Trie) 57
TRIE originado de 'Information retrieval' TRIE = digital tree = radix tree = prefix tree 58
Árvores digitais (Árvore de prefixos) Palavras/Chaves: A to tea ted ten inn 59
Árvores TRIE A busca se inicia na raiz. As busca continua com a subárvore associado ao símbolo/caratere procurado até chegar a uma folha (ou nó interno) Essa estrutura permite fazer buscas eficiente de cadeias que compartilham prefixo. 60
Implementando uma ATRIE 61
Árvores P.A.T.R.I.C.I.A. acrônimo de Practical Algorithm To Retrieve Information Coded In Alphanumeric 62
PATRICIA 63
Árvores PATRICIA TRIE compactada binária. Caminhos que possuem nós com apenas 1 filho são agrupados em uma única aresta. Diferente das TRIE, não armazena informações nos nós internos, apenas contadores e ponteiros para cada subárvore descendente. Ou seja, nenhuma chave é prefixa de outra. 64
PATRICIA: Exemplo de representação Registro acumulativo que integra todos os nós exeto nas folhas. Indica o caractere que deve ser comparado ao caractere da chave informada. Identifica qual a posição do caratere da chave informada que deve ser analisado Similar às ABBs: Se a chave é menor ou Igual ao nó, ela é consultada à esquerda, caso contrário, à direita. 65
PATRICIA Vantagem Permite armazenar um número de posições para qual é movido para fentre antes de fazer a próxima comparação. [elimina comparações desnecessárias melhora o desempenho] 66
PATRICIA Desvantagem Considera apenas 2 subárvores. Se mais do que duas chaves são distintas na mesma posição do caratere, é necessário adicionar nós extras ao índice para separa-lo. [Se n chaves são distintas na mesma posição, então serão necessários n-1 nós para separá-los. Se muitos casos destes acontecem, é preferível utilizar TRIE] 67
Árvores 50 60 70 80 90 Anos log(m) log(n) 1960 TRIE 1968 PATRICIA 1962 AVL 1972 Symmetric Binary B-Trees 1978 Red-Black 68
Árvores B 69
Artigo: R. Bayer, E. McCreight Organization and Maintenance of Large Ordered Indexes. Acta-Informatica, 1:173-189, 1972. 70
P D A B C D M P G I W T M N P R S W T U W 71
http://blog.hackerrank.com/the-unhealthy-obsession-with-tree-questions/ 72
HASHING (tabelas de dispersão) 73
Problemas com o acesso direto As chaves nem sempre são valores numéricos: Exemplo: chaves com nomes de pessoas. Solução: Contruir uma representação numérica das chaves. Função F(chave) {0,1,...,m-1} O problema dos espaços é mais grave! Exemplo: duas chaves 0 e 999.999 Acesso direto: tabela de 1milhão de buckets, sendo que somente dois seriam ocupados. Solução: o uso de tabelas de dispersão. Precisamos de um bucket para cada chave possível. 74
Tabelas de dispersão (Hashing) Através da aplicação de uma função conveniente (função de dispersão ou função hash), a chave é transformada em um endereço de tabela (endereço base). hash(chave) {0, 1,,m-1} Note: m, não n. O método aproveita a possíbilidade de acesso randômico a memória para alcançar uma complexidade média O(1), sendo o pior caso, entretanto, O(n) 75
Tabelas de dispersão/espalhamento Duas formas de tratar colisões: Endereçamento aberto. Resolução de colisões através de encadeamento. Para evitar colisões usa-se uma função Hash que apresente comportamento randômico 76
Custo de acesso a disco 77
Custo do acesso a disco O custo do acesso a disco pode ser dividido em três operações distintas Tempo de busca (seek). Atraso rotacional no disco. Tempo de transferência dos dados.
Custo do acesso a disco Tempo de busca (Seek time) Tempo necessário para se mover o braço de acesso para o cilindro correto. Atraso rotacional (Rotational delay) É o tempo que o disco necessita para rotacionar de forma que o setor desejado fique sob a cabeça de leitura/escrita. Tempo de transferência (Transfer time) É dado pela seguinte fórmula: Tempo de transferência = (Número de bytes transferidos / Número de bytes na trilha) x tempo de rotação.
Comparação memória RAM vs discos Discos Um acesso na memória RAM (Random Access Memory) tipicamente pode ser feito em 30 a 60 nanosegundos (30 x10-9 s). Obter a mesma informação no disco tipicamente leva de 7 a 10 milisegundos (7 x10-3 s). Memória RAM é cerca de 1 milhão de vezes mais rápida que o disco. Mas provêm uma capacidade maior a um preço menor. Também são capazes de reter dados quando o computador é desligado. são lentos
Estado-da-arte Gustavo S. Pavani 81
Conjuntos disjuntos 82
Estruturas para conjuntos disjuntos Union-Find Coleção {S1,..., Sk} de conjuntos disjuntos dinâmicos (que variam ao longo do tempo) Cada conjunto Sk é identificado por um representante, que é um membro do conjunto. Geralmente não importa quem é o representante 8 7 3 2 1 9 0 6 5 4 0 1 2 3 4 5 6 7 8 9 C 5 1 1 35 5 5 3 35 83
Operações Make_Set(x): Cria um novo conjunto cujo único elemento é apontado por x. x não pode pertencer a outro conjunto da coleção. Union(x, y): Executa a união dos conjuntos que contêm x e y, digamos Sx e Sy, em um conjunto único. Sx Sy é vazio (conjuntos disjuntos). O representante de S = Sx Sy é um elemento de S. Find(x): Devolve um ponteiro para o representante (único) do conjunto que contém x. 84
Aplicações Algumas aplicações envolvem o agrupamento de N elementos em uma coleção de conjuntos disjuntos, ou seja, um particionamento dos elementos em conjuntos. Alguns usos Problemas de grafos E.g. árvore geradora mínima, componentes conexas Agrupamento (clustering) Envolvido em mineração de dados e reconhecimento de padrões 85
Heurística para floresta de conjuntos disjuntos União ponderada (union by rank): faça a raiz da árvore com menor rank (altura) apontar para a raiz da árvore com maior rank. Compressão de caminhos (path compression): durante uma busca (Find_Set) faça os nós do caminho apontar para a raiz Find_Set(a) 86
Na prática 87
Para finalizar 88
Tópicos interessantes Algoritmos por força bruta. Backtracking (refinamento da busca por força bruta). Algoritmos Gulosos (Greedy algorithms) Algoritmos de programação dinamica (Dynamic programming) Algoritmos Randomizados (Monte Carlo algorithms) Testes de software Códigos elegantes 89
Código elegante para os artesão de software Código que funciona Vs Código bonito Elegância é sinônimo de beleza. Em computação também foram associados as conotações de eficâcia e simplicidade. 90
Código elegante 91
Código elegante The book is about "topics like testing, debugging, portability, performance, design alternatives, and style," which, according to the authors, "are not usually the focus of computer science or programming courses". It treats these topics in case studies, featuring implementations in several programming languages (mostly C, but also C++, AWK, Perl, Tcl and Java). "The book fills a critical need by providing insight into pragmatic designand coding issues so that programmers become better at their craft...programmers just out of school should be given this book on their first day of work. It will save employers thousands of dollars due to lost productivity and "mindless" debugging." -- Paul McNamee, Computer Scientist, Johns Hopkins University Applied Physics Laboratory 92
93
Sobre a P2 Tópicos: Todos os tratados no quadrimestre Dia: 18/08 (com inicio -opcional- 30min antes do horário) Resumo: Pode trazer uma folha A4 contendo um resumo (feito a mao) 94