MC3305 Algoritmos e Estruturas de Dados II Aula 22 – && Revisão geral Prof. Jesús P. Mena-Chalco [email protected] 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