Complexidade de Algoritmos

Documentos relacionados
Aritmética Binária e Complemento a Base. Introdução ao Computador 2010/1 Renan Manola

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Análise e Complexidade de Algoritmos

Complexidade de Algoritmos

Sistemas de Computação

Circuitos Lógicos. Capítulo 9 Aritmérica Digital: Operações e Circuitos

Circuitos Lógicos Aula 22

Técnico em Eletrônica Módulo I Eletrônica Digital (ED) - Prof. Samuel M. B. Cavalcante

Complexidade de Algoritmos

Complexidade de Algoritmos

Técnicas de projeto de algoritmos: Indução

Lista de Exercícios sobre Recursividade

Arquitetura de Computadores I

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Multiplicação Divisão

Algoritmos de Busca em Vetores

Divisão e Conquista. Fernando Lobo. Algoritmos e Estrutura de Dados II. É uma técnica para resolver problemas (veremos outras técnicas mais adiante).

Operações com números binários

Introdução à Computação

PARTE I I: ARITMÉTICA COMPUTACIONAL ARQUITETURA DE COMPUTADORES ANTONIO RAMOS DE CARVALHO JÚNIOR

Binários: Operações matemáticas

Introdução à Computação

Arquitetura de Computadores

Capacidade de Armazenamento. Bit. Binário para Decimal. Decimal para Binário. Operações Aritméticas no Sistema binário.

Sistemas de Numeração

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Classificação e Pesquisa

Complexidade de Algoritmos

BCC202 - Estrutura de Dados I

Ponto Fixo e Ponto Flutuante

Análise e Complexidade de Algoritmos

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Prova Substitutiva PMR3201 1o. semestre 2018 Prof. Thiago Martins

SISTEMAS DE NUMERAÇÃO CONVERSÕES ENTRE BASES. Prof. André Rabelo

Prof. Leonardo Augusto Casillo

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi

Algoritmos e Estrutura de Dados

Classes, Herança e Interfaces

Universidade Federal de Uberlândia Faculdade de Computação. Representação e aritmética binária

ARITMÉTICA BINÁRIA. Adão de Melo Neto

Algoritmos. Estrutura de Repetição. enquanto. while. Grupos de Slides No 5. Prof. SIMÃO

OPERAÇÕES COM NÚMEROS INTEIROS

Capítulo 2. Representação de dados em sistemas computacionais

Expressões lógicas, expressões condicionais, prioridades e operadores, base binária, operadores de bits

Cursos: Análise, Ciência da Computação e Sistemas de Informação Laboratório I - Prof. Aníbal Notas de aula 2 SISTEMAS NUMÉRICOS

Análise de Complexidade de Algoritmos

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Lista 2 - PMR2300/3200

Aula 7 - Mais problemas com inteiros

Introdução à Computação

Projeto e Análise de Algoritmos

MÓDULO. Conjunto de Instruções do 8086/88 Aritméticas, lógicas, deslocamento e rotação M 02

Introdução a Linguagem C (Parte I) UFPA Sistemas de Informação. Roberto Araujo 2013

Organização e Arquitetura de Computadores I

Programação de Computadores II. Cap. 17 Busca

Nós estamos acostumados com operações aritméticas: soma, subtração, multiplicação e divisão.

Árvores AVL e Árvores B. Jeane Melo

Estruturas de Dados 2

Organização de Computadores I

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Aula 06: Análise matemática de algoritmos recursivos

1. Notação em Complemento de 2

Algoritmos. Estrutura de Repetição. para - passo. for. Grupos de Slides No 7. Prof. SIMÃO

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Complexidade de Algoritmos. Edson Prestes

QuickSort CI/2015. Análise e Projeto de Algoritmos. - Prof. Lucídio A. F. Cabral

Circuitos Digitais Primeira Lista de Exercícios

INF 1010 Estruturas de Dados Avançadas

Cálculo Numérico Noções básicas sobre erros

Aula 7: Representações de Números Inteiros: Sinal e Magnitude e Representação em Excesso de k

Aula 4: Bases Numéricas

Circuitos Digitais. Conteúdo. Soma de Números Binários. Soma de Números Binários. Exemplos. Exemplos. Aritmética Binária

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

Notas de Aula Guilherme Sipahi Arquitetura de Computadores. Aritmética de Inteiros

CIRCUITOS SOMADORES = = =

Técnicas de projeto de algoritmos: Indução

1 Introdução à Lógica Digital. Arquitectura de Sistemas Computacionais

MC102 Algoritmos e Programação de Computadores

Capítulo 04 : Sistemas Numéricos

Fundamentos de Programação

Algoritimos e Estruturas de Dados III CIC210

Solução de Recorrências

MATEMÁTICA PROF. JOSÉ LUÍS NÚMEROS DECIMAIS

RESUMO DE CONCEITOS BÁSICOS DE C

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Representações de Números Inteiros: Sinal e Magnitude e Representação em Excesso de k

ESTRUTURA DE DADOS CIÊNCIA E TECNOLOGIA DO RIO. Curso de Tecnologia em Sistemas para Internet

ELETRÔNICA DIGITAL I

Algoritmos de Ordenação

ELT601 Eletrônica Digital II Graduação em Engenharia Eletrônica

CONJUNTO DOS NÚMEROS INTEIROS. No conjunto dos números naturais operações do tipo

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

SISTEMA DE NUMERAÇÃO. Introdução a Informática. Vinícius Pádua

Aula 8: Complemento a Um e Complemento a Dois

ARITMÉTICA BINÁRIA. São duas as operações executadas pelo computador:

Transcrição:

Complexidade de Algoritmos Prof. Diego Buchinger diego.buchinger@outlook.com diego.buchinger@udesc.br Prof. Cristiano Damiani Vasconcellos cristiano.vasconcellos@udesc.br

Algoritmos com Inteiros Grandes

Algoritmos com Inteiros Grandes Até esse momento temos considerado constante a complexidade de operações como: adição, subtração, multiplicação, divisão, módulo e comparação. Mas o que acontece quando essas operações envolvem números cujo o tamanho, em número de bits, é muito maior que a palavra do processador (atualmente 32 ou 64 bits)?

Soma Um primeiro modelo de soma entre números inteiros não limitados a palavra do processador poderia ser similar ao método que utilizamos para somar números decimais: Processador de 1 bit n1 (238) n2 (379) soma 0 0 1 1 1 0 1 1 1 0 + 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 Quantos passos são necessários para calcular uma soma entre números de k dígitos?

Soma Contudo, um processador consegue trabalhar com palavras de tamanho p ou seja em apenas uma única operação ele soma dois números que tenham no máximo p bits Processador de 8 bits 1 => (carr entre suboperações) n1 (238) n2 (379) soma 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 + 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 Qual é o maior valor de carr? Espaço adicional pior caso

Soma De forma genérica Adição de 2p bits, onde p é o tamanho da palavra do processador: Carr b 2n b 2n-1... b n+2 b n+1 b n b n-1... b 2 b 1 Assim, quando o número de bits (k) do número for próximo ao tamanho da palavra do processador teremos uma complexidade de tempo constante O(1)

Soma E quando o tamanho do número (k) for significativamente superior à palavra do processador, ou quando k for variável? p = 32 / k = 64 serão necessárias 2 operações p = 32 / k = 480 serão necessárias 15 operações p = 32 / k = 4992 serão necessárias 156 operações O( k / p ) onde p é uma constante Assim, podemos considerar que a adição de grandes números tem complexidade O(k), onde k é o número de bits do maior número.

Soma Soma de inteiros: O( k ) Mas quanto vale k em relação aos números utilizados na soma? : o número de bits de n 379 (k) => 101111011 (n) Como fazemos para sair do 379 e chegar no valor em binário? k = log n O( k ) = O( log n )

Um primeiro modelo de multiplicação seria realizar somas sucessivas de um valor: x = 8 = 5 5 x 8 8 + 8 + 8 + 8 + 8 = 40 vezes

bigint mul (bigint x, bigint ) { bigint r = 0; while ( > 0){ // Comparação entre inteiros grandes r = r + x; // Adição entre inteiros grandes O(k). --; } Note que o tamanho de r return r; também aumenta, assim como } a complexidade da soma. O(k) + O(k) +... + O(k) Contudo esse aumento não ocorre em todas as operações vezes Sendo k o número de bits de x, qual a complexidade de tempo para este algoritmo?

O(k) + O(k) +... + O(k) vezes Considerando que x e tem o mesmo número k de bits, qual a complexidade de tempo para este algoritmo? k = log (= log x) = 2 k O( * k ) = O( * log ) ogo: O(2 k * k) = O(2 k )

Um segundo modelo seria similar ao método que utilizamos para multiplicar números na base decimal: X 12 215 60 (multiplica por 5, desloca 0) 12 (multiplica por 1, desloca 1) 24 (multiplica por 2, desloca 2) 2580 X 1010 (10) 1101 (13) 1010 (multiplica por 1, desloca 0) 0000 (multiplica por 0, desloca 1) 1010 (multiplica por 1, desloca 2) 1010 (multiplica por 1, desloca 3) 10000010 (130)

bigint mul( bigint x, bigint ){ bigint r; if ( == 0) return 0; r = mul(x, >> 1) // r = x * (/2) if ( par() ) return r << 1; // return 2*r else return x + r << 1; // return x+2*r } Verificar se um número binário é par: O(?) Deslocamento de bits: O(?) Sendo k o número de bits de x e, qual a complexidade de tempo para este algoritmo?

Sendo k o número de bits de x e, qual a complexidade de tempo para este algoritmo? São feitas k somas de complexidade O(k), logo: k * O(k) = O(k²) ou O(log² n) Será que tem como fazer melhor?

Existe um método que utiliza a abordagem de divisão e conquista para realizar a multiplicação. onde: x e = parte esquerda do número (binário) x e = parte direita do número (binário) ) ( ) ( 2 2 /2 n n x x x x x

x 2 n x 2 n/2 ( x x ) ( x ) bigint mul( bigint x, bigint ){ bigint xl, xr, l, r, p1, p2, p3, p4; int n = max( x.size(),.size() ); // número de bits do maior número if (n == 1) return x; // se numéro de bits for 1 (retorna 1 se x = 1 ou =1). xl = leftmost(x, n/2); xr= rightmost(x, n/2); // bits mais a esquerda e mais a direita. l = leftmost(, n/2); r= rightmost(, n/2); p1 = mul (xl, l); p2 = mul (xl, r); p3 = mul (xr, l); p4 = mul (xr, r); return (p1 << n) + (p2 << (n/2)) + (p3 << (n/2)) + p4; }

Sendo k o número de bits de x e, qual a complexidade de tempo para este algoritmo? T(n) = 4*T(k/2) + O(k) Será que tem como fazer melhor?

x 2 n x 2 n/2 ( x x ) ( x ) bigint mul( bigint x, bigint ){ bigint xl, xr, l, r, p1, p2, p3; int n = max( x.size(),.size() ); // número de bits do maior número if (n == 1) return x; // se numéro de bits for 1 (retorna 1 se x = 1 ou =1). xl = leftmost(x, n/2); xr= rightmost(x, n/2); // bits mais a esquerda e mais a direita. l = leftmost(, n/2); r= rightmost(, n/2); p1 = mul (xl, l); p2 = mul (xl+xr, l+r); p3 = mul (xr, r); return (p1 << n) + ((p2 - p1 - p3) << (n/2)) + p3; }

Sendo k o número de bits de x e, qual a complexidade de tempo para este algoritmo? T(n) = 3*T(k/2) + O(k) Será que tem como fazer melhor?

Sendo k o número de bits de x e, qual a complexidade de tempo para este algoritmo? T(n) = 3*T(k/2) + O(k) Será que tem como fazer melhor? Sim, de acordo com Cormen et al (2002) existe um algoritmo que tem complexidade O(k log(k) log( log(k) ))

Exercícios Calcule qual a complexidade da função de recorrência abaixo usando teorema mestre e o método da substituição: T(n) = 3*T(k/2) + O(k) T(1) = 1 Escreva um algoritmo de divisão para inteiros grandes. Determine o melhor e pior caso para esta operação e analise a sua complexidade de tempo.