• Nenhum resultado encontrado

Análise de complexidade assintótica de algoritmos em grafos por uma abordagem empírica

N/A
N/A
Protected

Academic year: 2021

Share "Análise de complexidade assintótica de algoritmos em grafos por uma abordagem empírica"

Copied!
12
0
0

Texto

(1)

An´alise de complexidade assint´otica de algoritmos em grafos por uma

abordagem emp´ırica

Juliana M. Souza

Universidade do Estado do Rio de Janeiro (UERJ)

Rua S˜ao Francisco Xavier, 524, sala 6019B, 20550-900, Rio de Janeiro – RJ, Brazil julianamacario.eng@gmail.com

Fabiano S. Oliveira

Universidade do Estado do Rio de Janeiro (UERJ)

Rua S˜ao Francisco Xavier, 524, sala 6019B, 20550-900, Rio de Janeiro – RJ, Brazil fabiano.oliveira@ime.uerj.br

Valmir C. Barbosa

COPPE / Universidade Federal do Rio de Janeiro (UFRJ) Caixa Postal 68511, 21941-972, Rio de Janeiro – RJ, Brazil

valmir@cos.ufrj.br

RESUMO

Muitos problemas de otimizac¸˜ao do mundo real s˜ao melhor formulados atrav´es de problemas em grafos, sen˜ao diretamente ao menos frequentemente em combinac¸˜ao com outras t´ecnicas. Enquanto nos casos mais simples a complexidade computacional assint´otica resultante pode ser determinada analiticamente, muitas vezes o m´etodo de soluc¸˜ao envolve o uso de t´ecnicas de otimizac¸˜ao ou meta-heur´ısticas de garantias de desempenho desconhecidas. Em casos como esses, pode ser ´util contar com m´etodos emp´ıricos para avaliar a complexidade, mas at´e hoje um estudo abrangente desta possibilidade n˜ao foi realizado. Neste artigo, fornecemos alguns avanc¸os para resolver o problema. Para alguns algoritmos cl´assicos, demonstramos como o uso de ferra-mentas prontamente dispon´ıveis pode levar `a correta avaliac¸˜ao da complexidade, sugerindo que a abordagem emp´ırica pode ser vi´avel na pr´atica.

PALAVRAS CHAVE. An´alise emp´ırica. Algoritmos. Complexidade assint´otica. TAG – Teoria e Algoritmos em Grafos

ABSTRACT

Many real-world optimization problems are best formulated as problems on graphs, so-metimes directly but frequently in combination with other techniques. While in the simplest cases the resulting asymptotic computational complexity can be determined analytically, often the solu-tion method involves the use of optimizasolu-tion techniques or meta-heuristics of unknown performance guarantees. In cases such as these it might be useful to rely on empirical methods to assess comple-xity, but to date a comprehensive study of this possibility has not been undertaken. In this paper we provide some headway into settling the issue. For some classical algorithms, we demonstrate how the use of readily available tools can lead to the correct assessment of complexity, suggesting that the empirical approach can be feasible in practice.

KEYWORDS. Empirical analysis. Algorithms. Asymptotic complexity. TAG – Theory and Algorithms on Graphs

(2)

1. Introduc¸˜ao

Diversos problemas do mundo real podem ser modelados atrav´es de grafos. Do ponto de vista algor´ıtmico, o principal desafio ´e desenvolver algoritmos eficientes, quando poss´ıvel, para resolver tais problemas. ´E not´orio que a elaborac¸˜ao de algoritmos eficientes em grafos ´e, em geral, uma tarefa dif´ıcil. Com efeito, uma quantidade expressiva de exemplos de problemas algor´ıtmicos intrat´aveis est´a relacionada a grafos. A an´alise de complexidade de algoritmos visa determinar a quantidade de cada recurso requerido por um algoritmo em func¸˜ao da entrada. Dentre tais recursos de interesse, est˜ao o tempo, medido atrav´es do n´umero de passos, e o espac¸o, medido atrav´es da quantidade de c´elulas alocadas de mem´oria. ´E poss´ıvel empreender este estudo atrav´es de uma abordagem anal´ıtica, aplicando-se t´ecnicas espec´ıficas de contagem de passos de execuc¸˜ao (ou da contagem de outro recurso de interesse) a partir da descric¸˜ao do algoritmo. O resultado de tal an´alise deve determinar uma express˜ao matem´atica em func¸˜ao dos dados de entrada que descreve o consumo de um recurso requerido por um algoritmo, que ´e chamada complexidade do algoritmo. Em geral, tal express˜ao ´e fornecida empregando-se a notac¸˜ao O e fam´ılia, que expressam o seu comportamento assint´otico. Tamb´em pode-se proceder tal an´alise por uma abordagem emp´ırica, analisando-se a execuc¸˜ao propriamente dita do algoritmo sob diversas entradas com o uso de ferra-mentas ou algoritmos espec´ıficos para medic¸˜ao dos recursos consumidos. No entanto, esta ´ultima abordagem n˜ao produz, em geral, a express˜ao matem´atica que especifica o consumo de recursos. Ao inv´es, ela ´e utilizada principalmente para a avaliac¸˜ao comparativa de diversos algoritmos que resolvem um mesmo problema submetidos a um mesmo conjunto de entradas ou, ainda, para a verificac¸˜ao do desempenho do algoritmo sob instˆancias de entrada consideradas usuais para o pro-blema pr´atico em quest˜ao.

Neste trabalho, propomos o m´etodo da abordagem emp´ırica tamb´em para a obtenc¸˜ao da complexidade assint´otica. Para ilustrar a sua aplicac¸˜ao, apresentamos um estudo de caso de an´alise emp´ırica automatizada de dois algoritmos cl´assicos: floresta geradora m´ınima e multiplicac¸˜ao de matrizes. Este ´ultimo, apesar de n˜ao ser um algoritmo em grafos, ´e utilizado como aux´ılio em di-versos problemas desta classe. Como ilustrac¸˜ao, podemos citar o problema de obter o n´umero de caminhos distintos entre cada par de v´ertices de um grafo, para o qual uma das abordagens reduz o problema `aquele de multiplicac¸˜ao de matrizes. Essa an´alise ser´a conduzida com o aux´ılio de uma ferramenta chamada EMA [Oliveira, 2017]. Al´em disso, apresentamos a metodologia desta ferra-menta, ou mais especificamente, como ela obt´em uma func¸˜ao a partir do conjunto das execuc¸˜oes emp´ıricas. Para justificar tal escolha, pesquisamos as ferramentas para an´alise automatizada de algoritmos existentes na literatura e comparamos o EMA com outra ferramenta chamada RAML, ´unica com desenvolvimento ativo, al´em do pr´oprio EMA, de acordo com a literatura. A comparac¸˜ao foi feita tanto em termos das caracter´ısticas gerais, quanto em termos pr´aticos, analisando os resul-tados de ambas quando aplicadas ao algoritmo de busca em profundidade em grafos.

O trabalho est´a estruturado da seguinte maneira. Na Sec¸˜ao 2, revisamos as ferramentas de an´alise automatizada encontradas na literatura. Na Sec¸˜ao 3, descrevemos a metodologia do EMA. Na Sec¸˜ao 4, utilizamos o algoritmo de busca em profundidade em grafos para contrastar os resultados produzidos pelo EMA e pelo RAML. Na Sec¸˜ao 5, obtemos as complexidades assint´oticas de algoritmos para dois problemas distintos utilizando-se o EMA como aux´ılio. Finalmente, na Sec¸˜ao 6, resumimos os resultados obtidos e apontamos trabalhos futuros de interesse.

2. An´alise Emp´ırica e Ferramentas Automatizadas

A an´alise emp´ırica de algoritmos em grafos encontra aplicac¸˜ao em diversos cen´arios. Dentre eles, podemos citar: (i) para a comparac¸˜ao entre a complexidade obtida via m´etodo anal´ıtico e aquela medida na pr´atica [Fahad et al., 2014; Moret e Shapiro, 1995], que pode ser desej´avel no uso did´atico ou para conferir se o m´etodo anal´ıtico e/ou a implementac¸˜ao do algoritmo foram conduzidas corretamente; (ii) quando n˜ao se tem acesso ao c´odigo-fonte com a implementac¸˜ao de um algoritmo e ainda assim ´e desej´avel determinar sua complexidade; (iii) quando a complexidade ´e desconhecida analiticamente, pela dificuldade da matem´atica envolvida no algoritmo espec´ıfico;

(3)

(iv) para o aux´ılio na escolha do algoritmo que possui func¸˜ao com menor constante multiplica-tiva quando h´a mais de um algoritmo de mesma complexidade; (v) quando ´e necess´ario prever a quantidade de tempo/mem´oria necess´arios para execuc¸˜ao do algoritmo para entradas as quais o al-goritmo ainda n˜ao foi submetido e deseja-se prever uma quantidade num´erica aproximada de qual ser´a o consumo de recursos, observando-se tais consumos para entradas j´a utilizadas em execuc¸˜oes anteriores; entre outras aplicac¸˜oes.

Tabela 1: Ferramentas para an´alise automatizada de algoritmos.

Ferramenta Ano Complexidade Programa

de Entrada Abordagem

Desenvolvimento

Ativo Dispon´ıvel METRIC 1975 Melhor, pior

e caso m´edio LISP Emp´ırica N˜ao N˜ao

ACE 1988 Pior caso Linguagens

funcionais Anal´ıtica N˜ao N˜ao

λΥΩ 1988 Caso m´edio Propriet´ario Anal´ıtica N˜ao N˜ao ACME 1998 Caso m´edio Estilo

Pascal Anal´ıtica N˜ao N˜ao

ANAC 2001 Pior caso e caso m´edio

Estilo

Pascal Anal´ıtica N˜ao N˜ao

Trend

Profiler 2007 Pior caso C Emp´ırica N˜ao Sim

Aprof 2012 Melhor, pior

e caso m´edio C Emp´ırica N˜ao Sim

AlgoProf 2012 Func¸˜ao custo

real esperada Java Emp´ırica N˜ao Sim

MOCCA 2014 Pior caso

e caso m´edio Python Emp´ırica N˜ao N˜ao

RAML 2012 Pior caso OCaml Anal´ıtica Sim Sim

EMA 2015 Melhor, pior

e caso m´edio Qualquer Emp´ırica Sim Sim

Embora a pesquisa de ferramentas que produzem a complexidade assint´otica de algorit-mos via m´etodo emp´ırico n˜ao seja recente, h´a poucas ferramentas dispon´ıveis. A Tabela 1 resume as ferramentas para an´alise automatizada de algoritmos encontradas na literatura. ´E poss´ıvel ob-servar que a tentativa de desenvolver ferramentas com este objetivo ocorre desde a d´ecada de70 atrav´es do METRIC [Wegbreit, 1975], que foi pioneira neste assunto e motivou as diversas fer-ramentas que surgiram nos anos seguintes. Ferfer-ramentas como ACE [Le M´etayer, 1988], λΥΩ [Flajolet et al., 1989], ACME [Silveira, 1998], ANAC [Barbosa et al., 2001] e RAML [Hoffmann et al., 2017] fornecem a complexidade de algoritmos atrav´es da an´alise do c´odigo-fonte, ao passo que o METRIC [Wegbreit, 1975], Trend Profiler [Goldsmith et al., 2007], Aprof [Coppa et al., 2012], AlgoProf [Zaparanuks e Hauswirth, 2012], MOCCA [Costa et al., 2014] e EMA [Oliveira, 2017] s˜ao ferramentas que analisam um algoritmo a partir de sua execuc¸˜ao. Al´em disso, ´e poss´ıvel observar que a maior parte dessas ferramentas possuem muitas limitac¸˜oes, tais como an´alise de algoritmos implementados em um determinado paradigma de programac¸˜ao e em uma linguagem de programac¸˜ao espec´ıfica. Al´em disso, apenas as ferramentas Trend Profiler, Aprof, AlgoProf, RAML e EMA est˜ao disponibilizadas para uso. Algumas dessas ferramentas fornecem apenas a

(4)

complexidade de pior caso, enquanto outras fornecem a complexidade de caso m´edio, ou ambas. Dentre todas as ferramentas apresentadas, apenas o RAML e o EMA est˜ao em desenvolvimento ativo. O EMA analisa algoritmos escritos em qualquer linguagem de programac¸˜ao, enquanto o RAML apenas algoritmos escritos na linguagem OCaml.

3. Metodologia do EMA

O EMA (acrˆonimo de EMpirical Analysis of algorithms) [Oliveira, 2017] ´e uma ferra-menta com o objetivo de fazer an´alise emp´ırica de um algoritmo de forma autom´atica. O algoritmo ´e executado para diversas entradas e, para cada uma, o EMA mede e armazena a quantidade con-sumida dos recursos sendo monitorados. A partir das medic¸˜oes coletadas, o EMA sugere a func¸˜ao que representa o consumo de cada recurso de acordo com sua metodologia. Os recursos padr˜oes monitorados s˜ao tempo e espac¸o, mas outros recursos espec´ıficos de usu´ario podem ser definidos e monitorados.

A entrada do EMA consiste em trˆes dados b´asicos: (i) um programa execut´avelA a ser analisado; (ii) uma listaV de vari´aveis v1, . . . , vn das quais a complexidade deA dependa; (iii)

um programa execut´avelB que gera entradas para o programa A; a entrada de B consiste em uma lista de valoresa1, . . . , anque corresponde `a valorac¸˜ao dev1, . . . , vnassociada a entrada deA a

ser gerada porB. Por exemplo, se A for uma busca em profundidade em grafos de complexidade de tempoO(n + m), v1 poderia corresponder an e v2am, respectivamente o n´umero de v´ertices

e arestas do grafo de entrada, pois estas s˜ao as vari´aveis das quais a complexidade depende. Neste caso,B deve ser um programa que recebe um par de valores (n, m) e gere uma entrada que repre-sente paraA um grafo com n v´ertices e m arestas. Note que o requerimento de B ´e a forma que o EMA disp˜oe para gerar entradas para qualquer programa a ser analisado sem ter que conhecer as especificidades de como formatar uma entrada para ele. Ao iniciar uma execuc¸˜ao deA com uma entrada gerada com o aux´ılio deB para certa valorac¸˜ao de V , o EMA monitora o consumo de recur-sos associados e, ao t´ermino, armazena tal consumo associado `aquela valorac¸˜ao. O processamento do EMA consiste em trˆes etapas, brevemente descritas a seguir: calibrac¸˜ao, simulac¸˜ao e an´alise.

A calibrac¸˜ao consiste do EMA sugerir uma lista de valores de cada vari´avel emV para as quais o programa A dever´a executar. Por exemplo, no exemplo em que A ´e uma busca em profundidade, a calibrac¸˜ao poderia resultar em um conjunto de valores de n = 300, . . . , 1000 e m = 2000, 3000, . . . , 10000. Esta sugest˜ao ´e feita atrav´es de uma s´erie de experimentos que o EMA conduz, com diversas entradas. O maior valor na lista sugerida de cada vari´avel constitui a maior instˆancia para a qualA executou sem que o limite m´aximo de algum recurso tenha sido violado. No exemplo, portanto, a maior instˆancia de entrada que a busca em profundidade conseguiu executar com os limites impostos pelo usu´ario de tempo e espac¸o foi um grafo tal quen = 1000 e m = 10000.

A simulac¸˜ao consiste em executarA para os diversos valores de vari´aveis escolhidos na calibrac¸˜ao. Cada execuc¸˜ao ´e feita para uma valorac¸˜ao deV distinta dentre todas as combinac¸˜oes que podem ser feitas com valores espec´ıficos de cada vari´avel. Formalmente, seSi ´e a lista de valores

sugeridos para a vari´avelviretornada pela calibrac¸˜ao, a simulac¸˜ao executar´aA para cada valorac¸˜ao

(a1, . . . , an) ∈ S1× . . . × Sn. Portanto, na base de dados com o consumo das execuc¸˜oes ser˜ao

inseridas L = Qni=1|Si| entradas. No exemplo anterior, a simulac¸˜ao da busca em profundidade

conduzir´aL = |S1||S2| = 8 × 9 = 72 execuc¸˜oes, uma para cada combinac¸˜ao dos valores de n e m.

A an´alise de determinado recurso consiste em obter a func¸˜ao que melhor se ajusta a um conjunto de pontos D = {(xi, yi) : 1 ≤ i ≤ L} onde para cada 1 ≤ i ≤ L, xi ´e a

valorac¸˜ao espec´ıfica de uma vari´avel associada a uma instˆancia de entrada e yi ´e o consumo do

recurso sob an´alise na execuc¸˜ao de tal entrada. Tal conjunto D ´e obtido como resultado da fase de simulac¸˜ao. A “func¸˜ao que melhor se ajusta” na metodologia do EMA ´e alguma da classe

logarithmico-exponential [Graham et al., 1994], que s˜ao as func¸˜oes polilogar´ıtmicas, polinomiais, exponenciais, ou alguma combinac¸˜ao multiplicativas destas, tipicamente encontradas nas an´alises

(5)

de complexidade. Como ser´a mostrado a seguir, o EMA considerar´a ent˜ao um conjunto bem-definido de tipos de func¸˜ao parametriz´aveis, uma m´etrica de erro para qualificar uma func¸˜ao es-pec´ıfica, o conceito de func¸˜oes equivalentes (conjunto de func¸˜oes cujos erros est˜ao muito pr´oximos dois a dois dentro de um limite), e por fim um crit´erio para escolher uma func¸˜ao equivalente como a mais prov´avel que representa o consumo de recurso. A metodologia geral do EMA est´a expressa atrav´es do fluxograma da Figura 1. A func¸˜ao

fgeral(x) = a0ax a2 1 |{z} t1 xa3 |{z} t2 (log2x)a4 | {z } t3 +a5

´e aquela considerada a func¸˜ao mais geral que o EMA sup˜oe descrever a complexidade de um al-goritmo, onde a1, . . . , a5 s˜ao os parˆametros cujos valores ser˜ao determinados pelo EMA. Neste

func¸˜ao,t1, t2, t3s˜ao os seus termos. Para determinar os valores dos parˆametros e quais deles s˜ao

re-levantes para definir a func¸˜ao que representa uma complexidade, define-se o conjuntoF de func¸˜oes candidatas. Tais func¸˜oes s˜ao func¸˜oes mais particulares quefgeralformadas por todas as combinac¸˜oes

poss´ıveis entre os termos desta func¸˜ao [Figura 1(a)]. A seguir, enquantoF 6= ∅, o EMA determi-nar´a os parˆametros de cadaf ∈ F [Figura 1(b)] por regress˜oes n˜ao-lineares atrav´es do algoritmo de

Levenberg-Marquardt [Levenberg, 1944; Marquardt, 1963], que consiste um algoritmo num´erico

que determinar o valor dos parˆametros que minimiza o erro associado a tal func¸˜ao. O erroerro(f ) de uma func¸˜aof ´e dado por

erro(f ) =

L

X

i=1

e2i(f ),

ondeei(f ) ´e o erro residual do ponto (xi, yi) ∈ D, definido por

ei(f ) = f (xi) − yi.

O EMA utiliza um conjunto de t´ecnicas para auxiliar a regress˜ao que contorna problemas conhecidos do m´etodo de regress˜ao computacional utilizado [Figura 1(c)]. S˜ao elas: (i) a estimac¸˜ao dos parˆametros de cada func¸˜aof ´e feita em sua forma original f (y = f (x)) e em escala logar´ıtmica flog (log y = log f (x)). Esta segunda forma ´e particularmente ´util quando o m´etodo num´erico

ca-minha por valores muito grandes que potencialmente ultrapassariam o limite de representac¸˜ao com-putacional da biblioteca utilizada para fazer a regress˜ao; (ii) o m´etodo num´erico necessita que sejam informados os valores iniciais para os parˆametros. ´E sabido que se tais valores estiverem em ordens de magnitude afastados dos valores ´otimos globais dos parˆametros, a qualidade de ajuste pode ser prejudicada pois pode-se convergir para ´otimos locais. Devido a isso, o EMA ent˜ao testa um con-junto de valores iniciais de ordens de magnitude diferentes para aumentar a chance de obter o ´otimo global; (iii) o m´etodo num´erico ´e sens´ıvel a se os valores dos parˆametros que s˜ao ´otimos globais s˜ao de ordens de magnitude diferentes. Neste caso, o m´etodo pode convergir prematuramente. O EMA detecta e soluciona este tipo de problema. Ao final, o EMA armazena em um conjuntoFajustadasa

func¸˜ao ajustadagminde menor erro encontrada como o ajuste final def [Figura 1(d)].

Os parˆametros das equac¸˜oes s˜ao encontrados atrav´es de um m´etodo num´erico, portanto, frequentemente os valores encontrados s˜ao n˜ao-inteiros. Por outro lado, ´e muito comum que as func¸˜oes reais que medem recursos computacionais possuam como valores dos parˆametros determi-nados n´umeros especiais, como os inteiros. Por esse motivo, o pr´oximo passo do EMA ´e discretizar os parˆametros que consiste de testar alguns de tais valores especiais na vizinhanc¸a do valor n˜ao-inteiro encontrado, criando novas func¸˜oes, que entram na lista de func¸˜oes candidatas [Figura 1(e)]. Finalmente, o EMA reportaFajustadascom seus elementos classificados em trˆes grupos

[Figura 1(f)]: (i) func¸˜ao de erro m´ınimofmin = argmin{erro(f ) : f ∈ Fajustadas}; (ii) func¸˜oes equivalentesFequiv, que s˜ao aquelas com erro pr´oximo aerro(fmin); e (iii) func¸˜ao melhor-palpite

(6)

Figura 1: Metodologia da etapa de an´alise do EMA.

fmelhor-palpite, que ´e aquela que o EMA escolhe dentre as equivalentes e que ´e reportada como a

com-plexidade do algoritmo. Para elegˆe-la, o EMA utiliza o crit´erio da Navalha de Occam, que consiste em selecionar a func¸˜ao mais simples. Uma func¸˜ao ´e dita ser mais simples que outra quando ela ´e considerada mais frequente na literatura de algoritmos. Mais especificamente, uma func¸˜ao ´e mais simples que outra quando: (a) possui menos parˆametros livres (com valores a serem determinados); se iguais, ent˜ao aquela que (b) possui o menor n´umero de termos (cada func¸˜ao tem de0 a 3 termos); se iguais, (c) possui menos parˆametros (sejam eles fixos ou vari´aveis); se iguais, ent˜ao aquela que (d) possui o maior n´umero de parˆametros com valores inteiros.

4. Estudo de Caso: RAML vs. EMA

Nesta sec¸˜ao ´e apresentada uma comparac¸˜ao entre as ferramentas EMA e RAML (acrˆonimo de Resource Aware ML) [Hoffmann et al., 2017]. Dentre todas as ferramentas, s˜ao as ´unicas com o projeto de pesquisa ainda ativos. O RAML determina uma func¸˜ao polinomial de grau no m´aximo 6 que limita superiormente o uso de recursos de algoritmos escritos na linguagem OCaml. Deste modo, j´a se nota uma diferenc¸a entre as ferramentas, pois o EMA considera func¸˜oes com ter-mos multiplicativos que podem ser exponenciais, polinomiais ou polilogar´ıtmicos, o que o habilita medir com precis˜ao a complexidade do MergeSort de Θ(n log n), por exemplo, tarefa que n˜ao ´e poss´ıvel para o RAML. Por outro lado, o RAML executa de maneira quase imediata, por fazer an´alise do c´odigo-fonte, enquanto o EMA deve proceder a simulac¸˜ao sob v´arias entradas, o que requer mais tempo. Inicialmente, foi realizada uma an´alise automatizada para entradas de pior caso do QuickSort atrav´es das duas ferramentas. Para execuc¸˜ao deste experimento, foi utilizado uma implementac¸˜ao recursiva e, para que fosse simulada para grandes quantidades de elementos sem estouro de pilha, um tipo espec´ıfico de recurs˜ao precisou ser implementada, chamada recurs˜ao de

cauda. A complexidade de pior caso encontrada para o QuickSort atrav´es do EMA foiΘ(N2). A

(7)

no RAML uma an´alise do QuickSort em sua vers˜ao sem cauda e, para esta vers˜ao, o RAML obteve o limite justo deO(N2). Isto evidencia que o RAML ´e sens´ıvel a forma de escrita de um algoritmo mesmo que ambos sejam de mesma complexidade.

No segundo estudo foi utilizado o algoritmo cl´assico de busca em profundidade, cuja complexidade ´e deΘ(m+n), onde m representa o n´umero de arestas e n aquele de v´ertices. O EMA reporta a complexidade assint´otica apenas de uma vari´avel por an´alise, por isso, foram realizados dois experimentos. Em ambos, as arestas foram determinadas aleatoriamente. No primeiro, foi fixado n = 15 000 e variado o valor de m. Portanto, a complexidade do algoritmo esperada ´e Θ(m), obtida da express˜ao geral considerando-se n como constante. No segundo experimento, foi fixadom = 42 497 e variado o valor de n. A complexidade emp´ırica esperada ´e Θ(n) por racioc´ınio an´alogo. As Figuras 2 e 3 mostram o resultado reportado pelo EMA nas duas an´alises. O RAML n˜ao foi capaz de analisar este algoritmo.

5000 10000 15000 20000 25000 30000 35000 0 50000 100000 150000 200000 250000 300000 350000 Tempo (ms) m 0.085777672199⋅m1 média estimativa

Figura 2: An´alise da busca em profundidade com n = 15 000. 8500 9000 9500 10000 10500 11000 11500 12000 12500 13000 13500 0 5000 10000 15000 20000 25000 30000 35000 40000 45000 Tempo (ms) n 0.100272856838⋅n1 média estimativa

Figura 3: An´alise da busca em profundidade com m = 42 497.

5. Estudo de Caso: An´alise Emp´ırica Aplicada a Algoritmos em Grafos Cl´assicos

Nesta sec¸˜ao, aplicaremos a an´alise emp´ırica para a determinac¸˜ao da complexidade as-sint´otica de dois algoritmos cl´assicos: floresta geradora m´ınima e multiplicac¸˜ao de matrizes. As subsec¸˜oes seguintes introduzem os respectivos problemas e apresentam os resultados.

5.1. Floresta Geradora M´ınima

Um grafoG ´e conexo se existe caminho conectando cada par de v´ertices de G. Um grafo G ´e ac´ıclico se G n˜ao possuir ciclos. Uma floresta ´e um grafo ac´ıclico. Uma floresta geradora de um grafoG ´e uma floresta F tal que V (F ) = V (G) e E(F ) ⊆ E(G). Seja G um grafo com peso w(e) em cada aresta e ∈ E(G). A floresta geradora m´ınima de G ´e uma floresta geradora F de G de menor pesow(F ) dentre todas as florestas geradoras de G, onde

w(F ) = X

e∈E(F )

(8)

A Figura 4 ilustra uma floresta geradora m´ınima de um dado grafo. As arestas em negrito s˜ao aquelas pertencentes `a floresta geradora m´ınima.

Figura 4: Exemplo de um grafo e uma floresta geradora m´ınima deste grafo.

O problema de determinar uma floresta geradora m´ınima ´e uma extens˜ao do problema cl´assico de encontrar uma ´arvore geradora m´ınima. A extens˜ao est´a em permitir que o grafo de entrada seja desconexo. Um algoritmo cl´assico para o problema de ´arvores geradoras m´ınimas ´e o algoritmo de Kruskal, de complexidade O(m log n), apresentado no Algoritmo 1. O algoritmo ´e diretamente aplicado para obter florestas geradoras m´ınimas, sem alterac¸˜oes. Contudo, sua comple-xidade se tornaO(m log n + n). Isto se deve ao fato de que o algoritmo ´e de tempo Ω(n) por conta da criac¸˜ao da lista de adjacˆencias do grafo. No caso de grafos conexos, este termo desaparece pois, para eles, vale quen = O(m) (e, portanto, n ´e dominado por O(m log n) na express˜ao assint´otica). Algoritmo 1 Algoritmo de Kruskal

Entrada: GrafoG

Sa´ıda: Uma floresta geradora m´ınima deG 1: func¸˜ao KRUSKAL(G)

2: F ← (V (G), ∅)

3: E ← ORDENAR(E(G)) ⊲ ascendentemente por peso

4: para cadae ∈ E fac¸a

5: se “E(F ) ∪ {e} ´e ac´ıclico” ent˜ao

6: E(F ) ← E(F ) ∪ {e}

retornarF

Para se chegar a complexidade deO(m log n+n), ´e necess´ario que a condic¸˜ao da Linha 5 seja refinada de modo que seja implementada em tempo O(log n). Para tanto, este refinamento se faz com o uso da estrutura de dados UNIAODISJUNTA, que implementa a uni˜ao de conjuntos˜ disjuntos e o teste se dois elementos est˜ao no mesmo conjunto em tempoO(log n) [Cormen et al., 2009]. Mais especificamente, a ideia ´e manter os v´ertices de cada componente conexa deF em um mesmo conjunto, distinto do conjunto associado aos v´ertices de outras componentes. Assim, referente a Linha 2, inicializa-se a estrutura comn conjuntos, cada um com um v´ertice distinto. A Linha 5 ´e implementada verificando-se se os conjuntos associados aos v´ertices dee s˜ao distintos. Em caso positivo, a Linha 6 une tais conjuntos. Uma an´alise mais precisa da complexidade da UNIAODISJUNTA˜ ´e feita via an´alise amortizada, cuja prova ´e n˜ao-trivial e utiliza a bem-conhecida func¸˜ao de Ackermann [Cormen et al., 2009]. A escolha deste algoritmo para este estudo de caso se deve ao fato de ser um algoritmo cl´assico cuja an´alise de complexidade de tempo atrav´es do m´etodo anal´ıtico n˜ao ´e direta. Esta ´ultima caracter´ıstica est´a presente em geral nos algoritmos candidatos a serem submetidos `a an´alise emp´ırica.

Foram realizados dois experimentos para se verificar empiricamente a complexidade as-sint´otica do algoritmo. Em ambos os experimentos, as arestas e pesos dos grafos foram determi-nados aleatoriamente. No primeiro, foi fixadon = 15 000 e variado o valor de m. Neste caso, a complexidade do algoritmo esperada ´e O(m), que ´e obtida da express˜ao geral considerando-se n como constante. A Figura 5 mostra o resultado reportado pelo EMA deste experimento.

(9)

No segundo experimento, foi fixadom = 42 497 e variado o valor de n. A complexi-dade emp´ırica esperada ´eO(n). A Figura 6 mostra o gr´afico e a func¸˜ao reportada pelo EMA. Note que, em uma an´alise superficial, a complexidade te´orica deste experimento poderia ser erronea-mente considerada comoO(log n), fazendo m fixo na complexidade bem conhecida do algoritmo de Kruskal para ´arvores. Contudo, a an´alise emp´ırica evidenciaria tal equ´ıvoco.

0 50 100 150 200 250 0⋅100 5⋅106 1⋅107 2⋅107 2⋅107 2⋅107 3⋅107 Tempo (segundos) m 7.86394418437⋅10−6⋅m 1

std dev média estimativa

Figura 5: An´alise de Kruskal com n = 15 000, m´ınimo de 10 amostras por valor de m.

0 100 200 300 400 500 600 700 800 0⋅1005⋅1031⋅1042⋅1042⋅1042⋅1043⋅1044⋅1044⋅1045⋅104 Tempo (ms) n 0.01668756406⋅n1

std dev média estimativa

Figura 6: An´alise de Kruskal com m = 42 497, m´ınimo de 10 amostras por valor de m. 5.2. Multiplicac¸˜ao de Matrizes

A multiplicac¸˜ao de matrizes ´e utilizada por diversos problemas em grafos. Como exem-plos, podemos citar a determinac¸˜ao do caminho mais curto (e o n´umero de caminhos distintos) entre todos os pares de v´ertices e o fechamento transitivo de um digrafo. Em especial, este problema tem um interessante hist´orico por baixas sucessivas em sua complexidade, onde a cada novo algoritmo, a melhora se dava em termos de d´ecimos ou cent´esimos no expoente do polinˆomio [Williams, 2012]. Nesta sec¸˜ao, obtemos a complexidade assint´otica empiricamente de dois algoritmos. O primeiro, implementa diretamente a multiplicac¸˜ao de matrizes a partir de sua definic¸˜ao (que chamaremos de

direto). O segundo ´e conhecido como algoritmo de Strassen [Strassen, 1969], e foi o primeiro a

conseguir obter uma complexidade menor que aquela do algoritmo direto. Mais especificamente, para matrizesA, B de dimens˜ao N × N , a matriz R = A × B ´e aquela de dimens˜ao N × N tal que

R[i, j] =

N

X

k=1

A[i, k] × B[k, j], para todo 1 ≤ i, j ≤ N.

Naturalmente, a definic¸˜ao de multiplicac¸˜ao de matrizes ´e mais geral que a fornecida. A restric¸˜ao da multiplicac¸˜ao a matrizes quadradas ´e conveniente para que a complexidade dependa de uma s´o vari´avel. A complexidade do algoritmo que decorre desta definic¸˜ao ´e Θ(N3). A an´alise de

complexidade deste algoritmo atrav´es do EMA ´e fornecida pelo gr´afico da Figura 7.

O algoritmo de Strassen ´e assintoticamente de menor complexidade. Ele utiliza a t´ecnica de divis˜ao e conquista da seguinte forma. Primeiro, particiona-se as matrizes A e B em quatro

(10)

submatrizes de dimens˜aoN/2 × N/2 como esquematizado em (1). Em seguida, determina-se os valorespi para todo1 ≤ i ≤ 7 tal que a multiplicac¸˜ao matricial envolvida no c´alculo de cada pi ´e

determinada recursivamente (fase de divis˜ao). A ideia do m´etodo consiste na observac¸˜ao de que, a partir destes valores, ´e poss´ıvel obter a matrizR = A × B conforme o esquema (fase de conquista).

 A11 A12 A21 A22  A  B11 B12 B21 B22  B =  p5+ p4− p2+ p6 p1+ p2 p3+ p4 p1+ p5− p3− p7  R , (1) onde: p1= A11(B12− B22); p2= (A11+ A12)B22; p3 = (A21+ A22)B11; p4= A22(B21− B11); p5= (A11+ A22)(B11+ B22); p6= (A12− A22)(B21+ B22); p7= (A11− A21)(B11+ B12).

Deste modo, s˜ao feitas7 multiplicac¸˜oes de matrizes de dimens˜ao N/2 × N/2. A soma de duas matrizesN × N ´e efetuada em tempo Θ(N2). Assim, se T (N ) corresponde a complexidade do algoritmo para multiplicac¸˜ao de matrizes N × N , T (N ) pode ser descrita pela equac¸˜ao de recorrˆenciaT (N ) = 7T (N/2) + Θ(N2) se N > 1, e T (1) = Θ(1), cuja resoluc¸˜ao resulta em T (N ) = Θ(Nlog27) ≈ Θ(N2.8074). A Figura 8 apresenta a execuc¸˜ao do algoritmo de Strassen com a an´alise do EMA. ´E poss´ıvel observar que a complexidade encontrada pelo EMA ´e muito pr´oxima da complexidade te´orica, com erro na segunda casa decimal do expoente do polinˆomio.

0 5000 10000 15000 20000 25000 30000 200 250 300 350 400 450 500 550 600 650 700 Tempo (ms) N 9.66100679144⋅10−5⋅N3 média estimativa

Figura 7: An´alise da multiplicac¸˜ao de matrizes N × N pelo algoritmo direto.

0 20 40 60 80 100 120 0 5000 10000 15000 20000 25000 30000 35000 Tempo (horas) N 2.79406786377⋅10−11⋅N2.79296603768 média estimativa

Figura 8: An´alise da multiplicac¸˜ao de matrizes N × N pelo algoritmo de Strassen.

6. Conclus˜ao

Desenvolver algoritmos eficientes em grafos para problemas do mundo real ´e particular-mente um desafio. N˜ao raro, tanto a tarefa de determinar a complexidade de um algoritmo em

(11)

grafo, quanto a implementac¸˜ao propriamente dita em uma linguagem de programac¸˜ao, s˜ao tarefas n˜ao-triviais. Para auxiliar o ˆexito das mesmas, neste trabalho, destacamos a importˆancia da an´alise emp´ırica de algoritmos. Para a primeira, ´e uma forma direta de sugerir ou comprovar uma complexi-dade obtida pelo abordagem anal´ıtica. Para a segunda, ´e uma forma de verificar se a implementac¸˜ao seguiu rigorosamente as hip´oteses feitas durante a etapa de an´alise. Neste trabalho, destacamos a importˆancia da an´alise emp´ırica de algoritmos, conveniente em diversas outras situac¸˜oes.

Desde a d´ecada de70, v´arias ferramentas para an´alise automatizada de algoritmos foram desenvolvidas. A maior parte dessas ferramentas, sumarizadas na Sec¸˜ao 2, possuem limitac¸˜oes por analisarem apenas algoritmos escritos em uma ´unica linguagem de programac¸˜ao, em apenas um paradigma de programac¸˜ao ou fornecer somente um tipo de func¸˜ao de complexidade. Dentre todas, apenas EMA e RAML continuam com pesquisa ativa e, entre ambas, o EMA diferencia-se por realizar estimativas de complexidade assint´otica de algoritmos em diversas linguagens de programac¸˜ao, em paradigma funcional e imperativo, e abordar diversas classes de complexidade (polilogar´ıtmica, polinomial e exponencial), cuja metodologia est´a sumarizada na Sec¸˜ao 3.

Na Sec¸˜ao 4, o EMA foi comparado com o RAML atrav´es de dois estudos de caso. No primeiro, foi feita uma an´alise de pior caso do QuickSort. Devido a necessidade de gerar entradas suficientemente grandes para a execuc¸˜ao do EMA, ocasionando estouro de pilha, o QuickSort foi implementado atrav´es de recurs˜ao de cauda. O EMA encontrou de maneira justa o resultado da complexidade anal´ıtica que ´eΘ(N2) ao passo que o RAML encontrou um limite superior n˜ao-justo

de O(N3). Para a vers˜ao do QuickSort que n˜ao utiliza recurs˜ao de cauda, o RAML encontrou o limite justo O(N2). No segundo estudo de caso foi feita uma an´alise de pior caso do algoritmo busca em profundidade, que possui complexidadeΘ(m + n). Para tal experimento no EMA, foi fixada uma vari´avel em uma constante e variou-se a outra e obtivemosΘ(m) (para n fixo) e Θ(n) (param fixo), portanto, complexidades coerentes com aquela obtida pela abordagem anal´ıtica. O RAML n˜ao foi capaz de analisar este algoritmo.

Por fim, na Sec¸˜ao 5, foram realizados dois estudos de caso. No primeiro, foi apresen-tado o problema da floresta geradora m´ınima e realizada a an´alise de complexidade emp´ırica do algoritmo de Kruskal. ´E sabido que a complexidade deste algoritmo ´eO(m log n) para ´arvores e O(m log n + n) para florestas. A an´alise emp´ırica obteve ˆexito na determinac¸˜ao de tal comple-xidade. Ressaltamos que apesar do algoritmo de Kruskal ser cl´assico e sua complexidade bem conhecida, o fato de o usarmos de forma inalterada para florestas poderia criar a falsa expectativa que sua complexidade ´e a mesma, o que valoriza o resultado da an´alise emp´ırica. No segundo estudo, foi realizada a an´alise de complexidade de dois algoritmos de multiplicac¸˜ao de matrizes: aquele que decorre da definic¸˜ao de multiplicac¸˜ao matricial e o algoritmo de Strassen, cujas an´alises emp´ıricas foram deΘ(N3) e Θ(N2.79), respectivamente, que condizem com o m´etodo anal´ıtico.

Como trabalhos futuros, propomos a an´alise de complexidade assint´otica de outros al-goritmos em grafos atrav´es da abordagem emp´ırica, a fim de entender mais aprofundadamente as condic¸˜oes de sucesso e as limitac¸˜oes de tal abordagem.

Referˆencias

Barbosa, M. A. C., Toscani, L. V., Ribeiro, L. (2001). Uma ferramenta para an´alise autom´atica da complexidade de algoritmos. Revista do CCEI, 5:57–65.

Coppa, E., Demetrescu, C., Finocchi, I. (2012). Input-sensitive profiling. ACM SIGPLAN Notices, 47:89–98.

Cormen, T. H., Leiserson, C. E., Rivest, R. L., Stein, C. (2009). Introduction to Algorithms. The MIT Press, London, England, 3.a edic¸˜ao.

Costa, E. J., Ramos, J. G., Barbosa, Y. M., Filho, G. F., Brito, A. (2014). Um avaliador autom´atico de eficiˆencia de algoritmos para ambientes educacionais de ensino de programac¸˜ao. Anais da 5.a

(12)

Fahad, A., Alshatri, N., Tari, Z., Alamri, A., Khalil, I., Zomaya, A. Y., Foufou, S., Bouras, A. (2014). A survey of clustering algorithms for big data: Taxonomy and empirical analysis. IEEE

Transactions on Emerging Topics in Computing, 2:267–279.

Flajolet, P., Salvy, B., Zimmermann, P. (1989). Lambda-Upsilon-Omega: an assistant algorithms analyzer. Lecture Notes in Computer Science, 357:201–212.

Goldsmith, S. F., Aiken, A. S., Wilkerson, D. S. (2007). Measuring empirical computational com-plexity. Anais da 6.a Joint Meeting of the European Software Engineering Conference and the

ACM SIGSOFT Symposium on The Foundations of Software Engineering, p. 395–404.

Graham, R. L., Knuth, D. E., Patashnik, O. (1994). Concrete Mathematics: a Foundation for

Computer Science. Addison-Wesley Professional, Boston, USA, 2.a edic¸˜ao.

Hoffmann, J., Das, A., Hofmann, M., Ngo, C., Shao, Z., Weng, S.-C. (2017). Resource Aware ML. URL http://raml.co. Acesso em 03 de Marc¸o de 2018.

Le M´etayer, D. (1988). ACE: an automatic complexity evaluator. ACM Transactions on

Program-ming Languages and Systems, 10:248–266.

Levenberg, K. (1944). A method for the solution of certain non-linear problems in least squares.

Quarterly of Applied Mathematics, 2:164–168.

Marquardt, D. W. (1963). An algorithm for least-squares estimation of nonlinear parameters.

Jour-nal of The Society for Industrial and Applied Mathematics, 11:431–441.

Moret, B. M. Shapiro, H. D. (1995). An empirical analysis of algorithms for constructing a mini-mum spanning tree. Lecture Notes in Computer Science, 519:400–411.

Oliveira, F. S. (2017). EMA - webpage. URL http://fabianooliveira.ime.uerj.br/ ema. Acesso em 20 de Marc¸o de 2017.

Silveira, C. M. (1998). Analisador de complexidade m´edia baseado nas estruturas algor´ıtmicas. Dissertac¸˜ao de Mestrado, UFPEL, Pelotas.

Strassen, V. (1969). Gaussian elimination is not optimal. Numerische Mathematik, 13:354–356. Wegbreit, B. (1975). Mechanical program analysis. Communications of the ACM, 18:528–539. Williams, V. V. (2012). Multiplying matrices faster than Coppersmith-Winograd. Anais da 44.a

Annual ACM Symposium on Theory of Computing (STOC), p. 887–898.

Referências

Documentos relacionados

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

O pastor Felipe Silva de Oliveira da Terceira Igreja Batista em Jardim Bom Retiro (São Gonçalo/RJ), é convidado para apresentar uma reflexão bíblica baseada na

Tripp (2005), igualmente, descreve a pesquisa-ação, voltada ao contexto educativo, como um método que, essencialmente, envolve tentativas continuadas, sistemáticas

Por fim, como era esperado, o Diário do Nordeste, pertencente ao maior grupo de comunicação do Ceará e o periódico mais vendido no Estado é, dentre todos, aquele que mais adotou

Resumo Este estudo teve por objetivos investigar a influência da desproteinização da dentina com hipoclorito de cálcio CaOCl na micromorfologia da superfície dentinária, na

Com relação à média das respostas relacionadas às dimensões previamente estabelecidas, consideradas componentes de responsabilidade social, nota-se que a dimensão com

Os instrumentos de pesquisa utilizados serão: Ficha de Rastreamento das Participantes do Estudo, International Consultation on Incontinence Questionnaire – Short Form

Objeto: Pregão Eletrônico - Re- gistro de Preços para a eventual aquisição de materiais de audiovisual e tecnologia da informação para atender ao Campus Blumenau da