Você está na página 1de 4

IBILCE UNESP Departamento de Cincias de Computao e Estatstica

Profa. Ins Ap.Gasparotto Boaventura


Programao II

1 sem. /13

Lista de Exerccios sobre String Matching e Mtodos de Ordenao


1. Sejam um texto T e uma palavra P vetores de caracteres. Suponha que o
caracter '#' tem um significado especial dentro de uma palavra: ele representa 0
ou mais ocorrncias de qualquer outro caracter (ou seja, # um wildcard).
Exemplos: A palavra "A#B#C" casa com qualquer trecho do texto que comece
com 'A', termine com 'C' e tenha um 'B' em algum lugar entre 'A' e 'C'. Escreva
uma funo que busque uma palavra em um texto interpretando o wildcard #
como sugerido acima.
2. 2. Na funo BoyerMoore, dada em sala de aula, o que acontece se trocarmos
"ult[b[k+1]]" por "ult[b[k]]"? Que ajustes preciso fazer no pr-processamento
para que a funo continue correta?

3. Considere o seguinte problema: Dados dois vetores a e b de n e m elementos


j ordenados, construir um outro vetor c de m+n elementos tambm
ordenados com os elementos de a e b. Uma primeira soluo seria colocar
em c os elementos de a seguidos dos elementos de b e ordenar o vetor c.
Existe forma melhor, que fazer a intercalao (merge) dos elementos de a e
b em c. Vejamos:
a=2589
b=134
c=1234589
Escrever a funo void merge(int a[], int b[], int c[], int m,int n)
4. Diferente do exerccio anterior suponha que temos 2 trechos contguos do
mesmo vetor (a[p..q-1] e a[q..r-1]) em ordem crescente e queremos intercalar
esses 2 trechos, obtendo um s trecho (a[p..r-1]) ordenado. Utilizando um
vetor auxiliar aux com o mesmo nmero de elementos de a, escreva a funo
void intercala(int a[], int p, int q, int r)
5. Dado um vetor V de N elementos ordenado em ordem decrescente, escreva
um algoritmo que ordena esse vetor em ordem crescente. Quantas trocas
foram necessrias?

6. Faa um procedimento recursivo que ordena uma seqncia a de n>1


elementos baseado no seguinte algoritmo: Obtenha um nmero p, 1 <= p <=
n. Divida a seqncia em duas partes, a primeira com p elementos e a
segunda com n-p. Ordene cada uma das duas partes. Aps isso, supondo
que: a [1] <= a [2] <= ... <= a [p] e a [p+1] <= a [p+2] <= ... <= a [n], intercale as
duas seqncias de forma a obter o vetor A ordenado (pode usar vetores
auxiliares).
7. Um vetor v[p..r] est arrumado se existe j em p..r tal que v[p..j-1] v[j] <
v[j+1..r] . Escreva um algoritmo que decida se v[p..r] est arrumado. Em caso
afirmativo, o seu algoritmo deve devolver o valor de j.
8. Considere o algoritmo particiona usado no mtodo QuickSort. Qual o
resultado da funo particiona quando os elementos de v[p..r] so todos
iguais? E quando v[p..r] crescente? E quando v[p..r] decrescente? E
quando cada elemento de v[p..r] tem um de dois valores possveis?
9. Um algoritmo de ordenao estvel (= stable) se no altera a posio
relativa de elementos com mesmo valor. Por exemplo, se o vetor v[0..n-1] tiver
dois elementos iguais a 222, primeiro um azul e depois um vermelho, um
algoritmo de ordenao estvel mantm o 222 azul antes do vermelho. A
funo particiona produz um rearranjo estvel do vetor, ou seja, preserva a ordem
relativa de elementos de mesmo valor?

10. Um programador inexperiente afirma que a seguinte implementao da


funo de separao rearranja o vetor v[p..r] e devolve um ndice j em p..r-1
tal que v[p..j] v[j+1..r]:
Int separa (int v[], int p, int r) {
int j;
j = (p + r) / 2;
do {
while (v[p] < v[j]) p++;
while (v[r] > v[j]) r--;
if (p <= r) {
troca (v[p], v[r]);
p++, r--;
}
} while (p <= r)
return p;
}

Mostre um exemplo onde essa funo no d o resultado esperado. E se


trocarmos "return p" por "return p-1"? possvel fazer algumas poucas
correes de modo que a funo d o resultado esperado?

11. Um programador escreveu uma nova verso para o Mtodo de Ordenao


QuickSort , mostrada abaixo. Qual foi a idia de ordenao usada? A idia
funciona bem? Existe alguma vantagem em se usar essa verso?

// A funo rearranja o vetor v[p..r], com p <= r+1,


// de modo que ele fique em ordem crescente.
void quicksort (int v[], int p, int r)
{
int j;
while (p < r) {
j = separa (v, p, r);
if (j - p < r - j) {
quicksort (v, p, j-1);
p = j + 1;
} else {
quicksort (v, j+1, r);
r = j - 1;
}
}
}

12. ShakeSort . Variao do mtodo da Bolha. Neste mtodo, em vez das


varreduras (para comparar os vizinhos) ocorrerem sempre em um sentido
(da esquerda para a direita, por exemplo), cada varredura feita em um
sentido, alternadamente. Assim, alm dos elementos maiores se deslocarem
para a direita, os menores tambm se deslocam mais rapidamente para a
direita, com o que se tem um certo ganho no tempo de processamento. (O
nome do algoritmo vem do verbo ingls to shake (agitar), por causa do
comportamento dos elementos: os menores se deslocando rapidamente
para a esquerda, e os maiores para a direita, alternadamente.). Escreva uma
funo para implementar o mtodo ShakeSort.

IBILCE UNESP
Disciplina
Curso
Professora

Departamento de Cincias de Computao e Estatstica


CCE -201 - Programao II
Bacharelado em Cincias da Computao
Ins Ap. Gasparotto Boaventura

Exerccios sobre listas encadeadas


1. Escrever uma funo que, dado uma lista encadeada L desordenada, cria uma lista K
ordenada, com os mesmos ns da lista L. A funo remove os elementos da lista L,
sempre do maior para o menor, e insere-os no incio da lista K, que dessa forma tornase uma lista ordenada (em ordem crescente). Obs: no devem ser criados ns extras,
vocs devem utilizar os mesmos ns alocados para a lista L. No final do processo, a
lista L estar vazia e a lista K conter os ns anteriormente alocados para a lista L.
2. Escrever uma funo para concatenar duas listas encadeadas L1 e L2.
3. Escrever uma funo para remover elementos repetidos de uma lista encadeada.
4. Escrever um procedimento para fazer a fuso de duas listas encadeadas ordenadas,
mantendo-a ordenada. No devem ser alocados (criados) ns extras. Os ns sero
religados para compor a nova lista ordenada.
5. Polinmios podem ser representados por meio de listas, cujos ns so registros com 3
campos: coeficiente, expoente e referncia ao seguinte. Por exemplo, o polinmio 3x5+
2x 1 seria representado por:
3

Usando essa representao, escreva funes para:


(a) Criar a listas de polinmios, inserindo os elementos em ordem
decrescente pelo expoente do polinmio. (Insero em lista ordenada).
(b) Somar polinmios. A funo recebe os ponteiros para o polinmio P1 e
P2 e cria a lista S, a qual representa a soma dos polinmios P1 e P2
Lista * SomaPolinomio(lista * P1, lista * P2);
Exemplos de soma entre dois polinmios:
(4x2 10x 5) + (6x + 12) = 4x2 4x + 7
(c) Escrever um programa principal que leia os polinmios, crie as
correspondentes listas representando-os e faa as chamadas funo
soma e imprima o resultado.
6. Uma maneira usual de se representar um conjunto pela lista de seus elementos.
Supondo esta representao, escreva funes para as operaes usuais de conjunto:
(a) unio (C= AB), (b) interseo (C= A B), (c) diferena (C= A-B) e (d) pertinncia.
Neste caso, vocs criaro novos ns para compor a lista C.
7. Seja L um indicador para o primeiro n de uma lista unicamente encadeada e X um n
arbitrrio dentro dessa lista. Escreva uma funo para remover esse n da lista. Se
X=L, ento o ponteiro L deve ser restabelecido para apontar para o primeiro n da lista.
8. Estruture uma representao para uma lista na qual as inseres e as remoes
possam ser feitas apenas em cada uma de suas extremidades. Uma estrutura desse
tipo chamada deque. Escreva funes para inseres e remoes em ambas as
extremidades. (Uma nica funo para as inseres e uma nica funo para as
remoes).
9. Escreva uma funo para uma lista simplesmente encadeada, que inverta a direo
das ligaes.
10. Escrever funes para insero e remoo em uma lista simplesmente encadeada
ordenada com n de cabealho.