apostila
259 pág.

apostila


DisciplinaAlgoritmos e Estrutura de Dados I708 materiais7.918 seguidores
Pré-visualização50 páginas
de n compat´\u131veis com os tipos de dados definidos (integer).
Polino\u2c6mios
Nesta sec¸a\u2dco vamos mostrar como representar e fazer ca´lculos com polino\u2c6mios repre-
sentados como vetores.
Para uma sucessa\u2dco de termos a0, ..., an \u2208 R, podemos para este curso definir um
polino\u2c6mio de grau n como sendo uma func¸a\u2dco que possui a seguinte forma:
P (x) = anx
n + an\u22121xn\u22121 + . . .+ a1x+ a0
Vamos considerar ao longo desta sec¸a\u2dco que \u2200k > n, enta\u2dco ak = 0. Tambe´m
consideramos que an 6= 0 para um polino\u2c6mio de grau n.
Do ponto de vista computacional, uma poss´\u131vel representac¸a\u2dco para um polino\u2c6mio
e´ um vetor de n+1 elementos cujos conteu´dos sa\u2dco os coeficientes reais dos respectivos
mono\u2c6mios. Consideremos enta\u2dco o tipo abaixo, podemos exemplificar alguns casos:
type polinomio = array [ 0 . .max] of real ;
160 CAPI´TULO 10. ESTRUTURAS DE DADOS
\u2022 P (x) = 5\u2212 2x+ x2:
0 1 2
5 -2 1
\u2022 P (x) = 7\u2212 2x2 + 8x3 \u2212 2x7
0 1 2 3 4 5 6 7
7 0 -2 8 0 0 0 -2
No restante desta sec¸a\u2dco iremos mostrar algoritmos que realizam operac¸o\u2dces costu-
meiras sobre polino\u2c6mios. A primeira e´ calcular o valor de um polino\u2c6mio em um dado
ponto x \u2208 R. Por exemplo, se P (x) = 5\u2212 2x + x2 enta\u2dco, P (1) = 5\u2212 2× 1 + 12 = 4.
A func¸a\u2dco em Pascal que implementa este ca´lculo esta´ apresentado na figura 10.33.
function valor no ponto (var p: polinomio ; n: integer ; x: real) : real ;
var i : integer ;
soma, pot x : real ;
begin
soma:= 0;
pot x:= 1;
for i := 0 to n do (\u2217 basta usar a tecnica do acumulador \u2217)
begin
soma:= soma + p[ i ] \u2217 pot x ;
pot x:= pot x \u2217 x; (\u2217 controlando a potencia de x \u2217)
end;
valor no ponto:= soma;
end;
Figura 10.33: Calcula o valor de P (x) para um dado x \u2208 R.
O pro´ximo algoritmo interessante e´ o ca´lculo do polino\u2c6mio derivada de um po-
lino\u2c6mio P. Seja P \u2032(x) a derivada de P (x) assim definido:
P \u2032(x) = nanxn\u22121 + (n\u2212 1)an\u22121xn\u22122 + . . .+ 2a2x+ a1
O programa que implementa este ca´lculo esta´ na figura 10.34.
Por outro lado, para calcular o valor no ponto de uma derivada de um polino\u2c6mio,
na\u2dco e´ necessa´rio que se calcule previamente um vetor auxiliar contendo a derivada. Isto
pode ser feito diretamente usando-se o polino\u2c6mio P , bastando trabalhar corretamente
os \u131´ndices do vetor, conforme mostrado na figura 10.35.
Os pro´ximos problemas va\u2dco nos permitir trabalhar um pouco com os \u131´ndices do
vetor. O primeiro problema e´ a soma de polino\u2c6mios. O segundo e´ a multiplicac¸a\u2dco.
Antes mostraremos a definic¸a\u2dco matema´tica para estes conceitos.
Sejam dois polino\u2c6mios P e Q assim definidos, supondo que n >= m:
10.1. VETORES 161
procedure derivada (var p: polinomio ; n: integer
var q: polinomio ; var m: integer) ;
var i : integer ;
begin
for i := 1 to n do
q[ i\u22121]:= i \u2217 p[ i ] ; (\u2217 diretamente da definicao de derivada \u2217)
m:= n \u2212 1;
end;
Figura 10.34: Calcula o polino\u2c6mio derivada de P (x).
function derivada no ponto (var p: polinomio ; n: integer ; x: real) : real ;
var i : integer ;
soma, pot x : real ;
begin
soma:= 0;
pot x:= 1;
for i := 1 to n do
begin
soma:= soma + i \u2217 p[ i ] \u2217 pot x ;
pot x:= pot x \u2217 x;
end;
derivada no ponto:= soma;
end;
Figura 10.35: Calcula o valor de P \u2032(x) para um dado x \u2208 R.
P (x) = anx
n + . . .+ amx
m + . . .+ a1x+ a0
Q(x) = bnx
m + bn\u22121xm\u22121 + . . .+ b1x+ b0
Enta\u2dco o polino\u2c6mio soma de P e Q, denotado P +Q e´ assim definido:
(P +Q)(x) = anx
n + . . .+ am+1x
m+1 + (am + bm)x
m + . . .+ (a1 + b1)x+ (a0 + b0)
Basicamente e´ a mesma operac¸a\u2dco de soma de vetores estudada neste cap´\u131tulo,
embora naquele caso exigimos que os tamanhos dos vetores fossem iguais. No caso
de polino\u2c6mios os vetores podem ter tamanhos diferentes desde que se assuma que
os coeficientes que faltam no polino\u2c6mio de maior graus sa\u2dco nulos. A implementac¸a\u2dco
deste processo esta´ na figura 10.36.
Considerando os mesmos polino\u2c6mios P e Q acima definidos, o produto de P por
Q, denotado PQ e´ assim definida:
(PQ)(x) = (an+mb0 + . . .+ anbm + . . .+ a0bn+m)x
n+m + . . .+
(akb0 + ak\u22121b1 + . . .+ a0bk)xk + . . .+ (a1b0 + a0b1)x+ (a0b0)
162 CAPI´TULO 10. ESTRUTURAS DE DADOS
procedure soma (var p: polinomio ; n: integer ; var q: polinomio ; m: integer ;
var r : polinomio ; var grau r : integer) ;
var i , menor grau: integer ;
begin
if n > m then (\u2217 primeiro copia a parte que sobra \u2217)
begin
menor grau:= m
grau r:= n;
for i := m+1 do n do
r [ i ]:= p[ i ] ;
end else
begin
menor grau:=n;
grau r:= m;
for i := n+1 to m do
r [ i ]:= q[ i ] ;
end
for i := 0 to menor grau do (\u2217 este for eh o mesmo da soma de vetores \u2217)
r [ i ]:= p[ i ] + q[ i ] ;
end;
Figura 10.36: Calcula a soma de P (x) com Q(x).
A operac¸a\u2dco matema´tica exige que sejam feitas todas as multiplicac¸o\u2dces e posterior
agrupamento dos mono\u2c6mios de mesmo grau, somando-se os coeficientes, para cada
mono\u2c6mio.
O programa apresentado na figura 10.37 implementa os ca´lculos para obtenc¸a\u2dco do
polino\u2c6mio produto de P por Q. O programa realiza os ca´lculos para cada mono\u2c6mio
a` medida em que os \u131´ndices dos dois comandos for variam, o que e´ um uso especial
da te´cnica dos acumuladores, embora os acu´mulos na\u2dco sejam simulta\u2c6neos para cada
mono\u2c6mio do resultado final da operac¸a\u2dco, eles sa\u2dco feitos aos poucos. Para isto e´ preciso
zerar o vetor antes de comec¸ar.
procedure produto (var p: polinomio ; n: integer ;
var q: polinomio ; m: integer ;
var r : polinomio ; var grau r : integer) ;
var i , j : integer ;
begin
for i := 0 to n+m do
r [ i ]:= 0;
for i := 0 to n do
for j:= 0 to m do
r [ i+j ]:= r [ i+j ] + p[ i ]\u2217q[ j ] ;
grau r:= n+m;
end;
Figura 10.37: Calcula o produto de P (x) com Q(x).
10.1. VETORES 163
10.1.6 Exerc´\u131cios
1. Fac¸a um programa que leia e armazene em um vetor uma seque\u2c6ncia de inteiros.
Em seguida o programa deve ler uma seque\u2c6ncia de inteiros informados pelo
usua´rio e, para cada um deles, dizer se ele pertence ou na\u2dco ao vetor armazenado
previamente.
2. Fac¸a um programa que leia duas seque\u2c6ncias de n inteiros em dois vetores dis-
tintos, digamos, v e w e verifique se os dois vetores sa\u2dco ide\u2c6nticos.
3. Fac¸a um programa em que leia dois vetores de nu´meros reais e descubra se um
deles e´ permutac¸a\u2dco do outro, isto e´, se eles tem os mesmos elementos, ainda
que em ordem diferente. A quantidade de elementos lidos em cada vetor e´ no
ma´ximo 100, e cada seque\u2c6ncia termina quando o valor 0 e´ digitado. Por exemplo:
[2, 2, 0, 3, 4] e [2, 2, 0, 3, 4]: sim.
[2, 2, 0, 3, 4] e [4, 3, 2, 0, 2]: sim.
[2, 2, 0, 3, 4] e [4, 3, 4, 0, 2]: na\u2dco.
[3, 0, 5] e [3, 0, 5, 3]: na\u2dco.
Implemente tre\u2c6s verso\u2dces deste problema:
\u2022 ordenando os vetores para em seguida compara´-los;
\u2022 sem ordenar os vetores;
\u2022 crie uma func¸a\u2dco que retorna 0 se x na\u2dco pertence a v e caso contra´rio retorna
o \u131´ndice do vetor onde x se encontra. Use esta func¸a\u2dco para resolver este
problema.
4. Fac¸a um programa que leia duas seque\u2c6ncias de inteiros, na\u2dco necessariamente
contendo a mesma quantidade de nu´meros. Seu programa devera´:
\u2022 dizer se a segunda seque\u2c6ncia esta´ contida na primeira. Exemplo:
v1: 7 3 2 3 2 6 4 7
v2: 3 2 6
Sa\u131´da: sim
\u2022 constrir um terceiro vetor, sem destruir os originais, que e´ a concatenac¸a\u2dco
do primeiro com o segundo;
v1: 7 3 2 6
v2: 5 1 8 4 9
Sa\u131´da: 1 2 3 4 5 6 7 8 9
\u2022 ordena´-los, e em seguida imprimir todos os nu´meros ordenados em ordem
crescente. Exemplo:
v1: 7 3 2 6
v2: 5 1 8 4 9
Sa\u131´da: 1 2 3 4 5 6 7 8 9
164 CAPI´TULO 10. ESTRUTURAS DE DADOS
5. Crie uma func¸a\u2dco em que receba um vetor de inteiros de tamanho n e devolva o
valor true se o vetor estiver ordenado e false em caso contra´rio.
6. Aproveitando as soluc¸o\u2dces dos problemas anteriores, escreva um programa em
que leia dois vetores de inteiros v e w, de dimenso\u2dces m e n respectivamente,
verifique se eles esta\u2dco ordenados, ordene-os em