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.