Conceitos	sobre	Algoritmo	e		
Complexidade
ALGORITMO	E	COMPLEXIDADE
•Objectivo:		
• Conhecer	 os	 conceitos	 e	 técnicas	 básicas	 de	 cálculo	 de	
complexidade	 algorítmica	 que	 servirão	 de	 bases	 para	 a	
compreensão	da	disciplina.
•O	que	é	um	algoritmo	?
• Algoritmo:	 uma	 sequência	 finita	 (lógica)	 de	 operações	 que	 a	
partir	de	um	conjunto	de	variáveis	como	entrada	produz	uma	saída	
desejada.
• Um	algoritmo	é	uma	sequência	não	ambígua	de	instruções	que	é	
executada	 até	 que	 determinada	 condição	 se	 verifique.	 Mais	
especificamente,	 em	 matemática,	 constitui	 o	 conjunto	 de	
processos	 (e	 símbolos	 que	 os	 representam)	 para	 efetuar	 um	
cálculo.
• A	análise	de	algoritmos	é	uma	atividade	que	contribui	para	o	entendimento	fundamental	
da	Ciência	da	Computação.	A	construção	de	um	algoritmo	deve	visar	não	apenas	à	solução	
de	 um	 determinado	 problema,	 mas	 à	 construção	 de	 um	 algoritmo	 bom,	 ou	 seja,	 que	
solucione	 o	 problema	 e	 seja	 eficiente.	 Conhecer	 a	 complexidade	 de	 um	 algoritmo	 é	
importante	para	poder	decidir	se	a	implementação	do	algoritmo	é	viável.
• A	complexidade	de	algoritmos	consiste	na	quantidade	de	trabalho	necessária	para	a	sua	
execução,	 expressa	 em	 função	 das	 operações	 fundamentais,	 as	 quais	 variam	 de	 acordo	
com	o	algoritmo,	e	em	função	do	volume	de	dados.
• Uma	das	mais	importantes	medidas	de	complexidade	de	algoritmos	é	a	medida	de	tempo.	
Isto	se	justifica	em	razão	de	boa	parte	da	pesquisa	em	Ciência	da	Computação	consistir	do	
projeto	e	análise	de	algoritmos	em	relação	à	eficiência,	ou	seja,	projetar	algoritmos	que	
forneçam	a	solução	do	problema	em	tempo	aceitável.
• Quando	existe	mais	de	um	algoritmo	para	a	resolução	de	um	mesmo	problema	é	necessário	que	
o	analista	possa	identificar	qual	dos	algoritmos	é	o	mais	indicado,	seja	em	termos	de	precisão	ou	
tempo	de	execução	Neste	momento	uma	metodologia	que	auxilie	no	processo	de	análise	seria	o	
mais	 indicado	 para	 que	 o	 analista	 pudesse	 fazer,	 com	 boa	 margem	 de	 segurança,	 a	 melhor	
escolha.
Análise	de	algoritmos	
• O	que	significa?	
• Prever	os	recursos	que	o	algoritmo	necessitará	
• Tempo,	memória,	largura	de	banda,	hardware...
• 	O	Tempo		
• Número	de	operações	primitivas	ou	etapas	executadas	
• Depende	do	tamanho	da	entrada
• 	Formas	de	analisar	
• 	Contar	todas	as	instruções	–	custo	exacto.	
• Contar	as	 instruções	 mais	 importantes	 (mais	executadas,	 mais	caras)	 –	custo	
aproximado.
Análise	de	algoritmos	
• Da	 mesma	 forma	 que	 distinguimos	 um	 algoritmo	 de	 sua	 aplicação	 a	
uma	 particular	 “entrada”,	 convém	 distinguir	 problemas	 de	 suas	
instâncias.	 Todo	 problema	 computacional	 é	 uma	 colecção	 de	
instâncias.	
• Cada	instância	do	problema	é	definida	por	um	particular	conjunto	de	
dados.	O	tamanho	de	uma	instância	de	um	problema	é	a	quantidade	de	
dados	 necessária	 para	 descrever	 a	 instância.	 O	 tamanho	 de	 uma	
instância	é	descrito,	em	geral,	por	um	só	número	natural,	mas	às	vezes	é	
conveniente	 usar	 dois	 ou	 até	 mais	 números.	 A	 ideia	 de	 tamanho	
permite	dizer	que	uma	instância	é	menor	ou	maior	que	outra.	
• A	palavra	instância	é	um	neologismo	importado	do	inglês.	Ela	está	sendo	empregada	aqui	no	sentido	de	exemplo,	espécime,	amostra,	ilustração.
•	Como	é	feita	a	escolha	de	um	algoritmo,	ou	quais	
os	critérios	a	utilizar	?
•Como	é	feita	a	escolha	de	um	algoritmo,	ou	quais	os	
critérios	a	utilizar	?
•Facilidade	de	compressão,	codificação	e	depuração.	
•Eficiência	na	utilização	dos	recursos	do	computador	e	rapidez.		
• A	 analise	 de	 um	 algoritmo	 fornece	 uma	 medida	 objectiva	 de	
desempenho	proporcional	ao	tempo	de	execução		do	algoritmo.
Características	dos	Algoritmos	
• Independente:	 Não	 depende	 de	 linguagem	 de	 programação	 ou	 de	 maquina	
(computador).	
• Definido:	Algoritmo	deve	ter		passos	claros	e	concretos.		
• Finito:		Um	algoritmo	começa	e	precisa	que	seja	terminado	(tenha	fim)	
• Preciso:		Cada	passo	precisa	um	calculo	correcto.		
• Capacidade	de	receber	dado(s)	de	entrada	do	mundo	exterior;	
• Poder	 gerar	 informações	 de	 saída	 para	 o	 mundo	 externo	 ao	 do	 ambiente	 do	
algoritmo;	
• Ser	efetivo	(todas	as	etapas	especificadas	no	algoritmo	devem	ser	alcançáveis	em	
um	tempo	finito).	
• Não	dar	margem	à	dupla	interpretação	(não	ambíguo)
Qualidades	de	um	Algoritmo

	Abaixo	algumas	das	qualidades	dos	algoritmos	:	
• Geral	:	E	desejável	que	o	algoritmo	seja	capaz	de	resolver	uma	classe	de	problemas		o	mais		
amplo	possível.		
• Eficiente:	 Um	 algoritmo	 é	 eficiente	 quanto	 menos	 recursos	 em	 tempo,	 espaço	 (de	
memória)	e	processadores	consumir.	
• Corretude	(Correto)	:	Para	qualquer	algoritmo,	nós	devemos	provar	que	ele	sempre	retorna	
a	saída	desejada	para	todas	as	instâncias	válidas	do	problema.	
• Levando	em	consideração	que	um	problema	pode	ter	mas	de	uma	vida	de	solução,	temos	
que	ser	capazes	de	decidir	qual	é	o	algoritmo	mais	eficiente,	o	que	menos	tempo	demore	
em	resolver	o	problema,	o	que	menos	recursos	utilize.	
• De	modo	geral	é	difícil	encontrar	um	algoritmo	que	reúna	todas	as	qualidades,	mas	o	que	
devemos	 procurar	 é	 um	 algoritmo	 que	 satisfaça	 	 melhor	 os	 requisitos	 de	 um	 dado		
problema.
•Quais	os	critérios	devemos	analisar	para	a	escolha	
de	um	algoritmo	?
Tempo	 de	 execução,	 recursos	 de	 sistema	 usados,	
portabilidade	e	fiabilidade.	Ou	seja,	seu	algoritmo	pode	
ser	 portado	 para	 qualquer	 aplicativo	 que	 necessite	
daquele	 processamento	 para	 o	 qual	 seu	 algoritmo	 foi	
criado.	Isso	é	importante	quando	se	trabalha	em	escala,	
fazendo	mais	de	um	software.	
Seu	algoritmo	é	capaz	de	lidar	com	todos	os	possíveis	
erros	 que	 possam	 ser	 introduzidos	 em	 dados	 ou	 pelo	
usuário?
•Porque	 analisar	 a	 eficiência	 de	 um	 algoritmo	 se	 os	
computadores	estão	cada	dia	mais	rápidos	?
Complexidade
•	O	que	é	a	complexidade	?	
•Porque	a	necessidade	de	criarmos	novos	algoritmos	
para	problemas	que	já	têm	solução	?	
•	Porque	o	estudo	da	complexidade	?
Complexidade
•A	 Complexidade	 de	 um	 algoritmo	 consiste	 na	
quantidade	de	"	trabalho	"	necessária	para	a	sua	
execução,	 expressa	 em	 função	 das	 operações	
fundamentais,	as	quais	variam	de	acordo	com	o	
algoritmo,	e	em	função	do	volume	de	dados.
Complexidade
• Complexidade:	 Visa	 definir	 a	 expressão	 matemática	 que	 expressa	 a	
quantidade	de	passos	gastos	por	um	algoritmo	para	resolver	um	certo	
problema	em	relação	ao	tamanho	da	entrada.
• A	complexidade	mede	o	tempo	relativo	de	execução	e/ou	uso	da	memória.	Uma	
análise	 da	 complexidade	 de	 um	 algoritmo	 pode-se	 focar	 em	 uma	 série	 de	
especificações	 quanto	 sua	 execução	 e/ou	 uso	 da	 memória,	 como	 o	 melhor	 caso	
possível,	o	que,	em	até	mesmo	o	caso	médio.	Da	mesma	maneira	pode-se	desejar	a	
complexidade	total	(ou	real)	apenas	a	complexidade	assintótica.
Complexidade
• Muitas	 vezes	 as	 pessoas	 quando	 começam	 a	 estudar	 algoritmos	
perguntam-se	qual	a	necessidade	de	desenvolver	novos	algoritmos	para	
problemas	 	 que	 já	 têm	 solução.	 A	 performance	 é	 extremamente	
importante	na	informática	pelo	que	existe	uma	necessidade	constante	
de	 melhorar	 os	 algoritmos.	 Apesar	 de	 parecer	 contraditório,	 com	 o	
aumento	 da	 velocidade	 dos	 computadores,	 torna-se	 cada	 vez	 mais	
importante	desenvolver	algoritmos	mais	eficientes,	devido	ao	aumento	
constante	do	"tamanho"	do	problemas	a	serem	resolvidos.	
• Devido	a	este	 factor	surge	a	 Complexidade	 Computacional,	 pois	e	
através	dela	que	se	torna	possível	determinar	se	a	 implementação	de	
determinado	algoritmo	é	viável.
Complexidade
•Complexidade	de	Algoritmos	
•A	eficiência	de	um	algoritmo	pode	ser	 medida	 através	
de	seu	tempo	de	execução.	
•É	a	melhor	medida	???
Complexidade
• O	 tempo	 de	 execução	 não	 depende	 somente	 do	
algoritmo,	 mas	 do	 conjunto	 de	 instruções	 do	
computador,	 a	 qualidade	 do	 compilador,	 e	 a	
habilidade	do	programador?	
• O	 tempo	 de	 execução	 de	 um	 algoritmo	 para	 uma	
determinada	entrada	pode	ser	medido	pelo	número	
de	operações	primitivas	que	ele	executa.
Complexidade	Algorítmica

	Esta		selecção	pode	ser	executada	da	maneira	mais	simples	desde	como	observar	a	
quantidade	de	linhas	do	programa,	mas	quando	o	programa	cresce	se	requer	uma	
medição	 mas	 exacta	 e	 apropriada,	 por	 isso	 se	 realizam	 certas	 operações		
matemáticas	que	garante	 	a	eficiência	teórica	do	programa,	ao	estudo	destes	casos	
se	denomina	Complexidade	Algorítmica.	
• A	eficiência	de	um	algoritmo	pode	ser	quantificada	com	as	seguintes	medidas	de	
complexidade.	
• Complexidade	 Temporal,	 ou	 tempo	 de	 execução	 é	 o	 tempo	 necessário	 para	 executar	 algum	
programa.	
• Complexidade	Espacial:	Memória	que	utiliza	um	programa	para	sua	execução,	A	eficiência	em	
memória	de	um	algoritmo	indica	a	quantidade	de	espaço	requerido	para	executar	o	algoritmo.
Complexidade	Algorítmica

• Para	isso	vamos	a	chamar	o	tamanho	dos	dados	o	da	entrada	com	N	e	
tentaremos	calcular	a	complexidade	em	função	de	N.	Entendemos	por	
tamanho	da	entrada	o	 número	de	componentes	sobre	os	que	se	vá	a	
executar	o	algoritmo.	Por	exemplo,	a	dimensão	do	vector	a	ordenar	ou	o	
tamanho	das	matrizes	a	multiplicar.	
• A	 unidade	 de	 tempo	 a	 	 que	 deve	 fazer	 referencia	 estas	 medidas	 de	
eficiência	não	pode	ser	expressada	em	segundos	ou	em	outra	unidade	
de	 tempo	 concreta,	 pois	 não	 existe	 um	 ordenador	 standard	 a	 que	
possam	fazer	referencia	todas	as	medidas.
Análise	Assintótica.

• Sabemos		que	dentro	da	área	de	informática	as	disciplinas	mais	complexas	e	
com	 maior	 índice	 de	 reprovação	 nos	 cursos	 superiores	 são	 algoritmos	 e	
estrutura	 de	 dados	 e,	 na	 maioria	 das	 vezes,	 um	 bom	 conhecimento	 de	
análise	assintótica	resolveria	o	problema	ou	facilitaria	a	compreensão	de	
temas	mais	avançados.	
• Fazer	 uma	 análise	 assintótica	 é	 se	 preocupar	 com	 valores	 grandes	 de	
entrada	 para	 o	 processamento	 do	 algoritmo,	 com	 o	 intuito	 de	 calcular	 o	
tempo	 total	 de	 processamento	 e	 viabilidade	 para	 determinados	 casos.	
Muitas	 vezes	 com	 isso	 podemos	 ser	 capazes	 de	 saber	 se	 é	 necessária	 a	
utilização	de	outra	 metodologia	ou	 ferramenta	 para	a	 realização	de	 uma	
tarefa.
Análise	Assintótica.

• Junto	 com	 o	 estudo	 de	 análise	 assintótica,	 temos	 o	 conceito	 de	 notação	
assintótica,	que	é	a	representação	matemática	criada	por	Paul	Bachmann	
no	século	XIX.	Nela,	temos	três	notações	comuns	para	classificar	as	ordens	
das	funções,	essas	ordens	determinam	a	equivalência	das	funções,	ou	seja	
podemos	ter	uma	função	que	seja	do	tipo	n²,	essa	função	é	equivalente	à	
função	400n².	São	equivalentes	assintoticamente	falando,	lembrando	que	
sempre	nos	preocupamos	com	valores	de	entrada	grandes	para	n.	As	três	
principais	 classificações	 de	 ordem	 são:	 Ordem	 O.	 “Ordem	 Ômega	 e	
Ordem	Theta.		Pesquisar	:	The	Art	of	Computer	Programming	(de	Knuth).	“
•Duvidas	?
• Dado	um	problema	como	encontramos	um	algoritmo	eficiente	para	a	
sua	solução	?	
• Encontrado	esse	algoritmo	como	comparar	esse	algoritmo	com	outros	
algoritmos	que	solucionam	o	mesmo	problema	?	
• Como	deveríamos	julgar	a	qualidade	dos	algoritmos	?	
• Qual	o	algoritmo	de	menor	custo	possível	para	resolver	um	problema	
particular	?

01 algorimos e complexidade introduç o