Vous êtes sur la page 1sur 4

Tema 6 Listas e Tcnicas de Pesquisa

Prof. Me. Fernando Accorsi 4. Listas Lineares As implementaes de PILHA e FILA baseadas em alocao sequencial (implcita) dos elementos so bastante eficientes, pois so permitidas operaes somente nas extremidades sem a necessidade de reorganizar os demais elementos do grupo. Quando o conceito de LISTA amplamente utilizado, as operaes so permitidas em qualquer posio do grupo. Esta caracterstica envolve, muitas vezes, um gasto computacional adicional para manuteno da sequencialidade dos elementos. Exemplos a) Insero de um elemento na k-sima posio
0 1 2 3 4 5 ... N-1 N

elementos 10 final 4

51

41

37

Insero no lugar do 4 elemento (k=3)


0 1 2 3 4 5 ... N-1 N

Elementos 10 Final 5

51

Novo 41 37

Padro de comportamento da manuteno da estrutura Restrio: 0 K Final+1


for (i=final; i >=k; i--) elementos[i+1]=elementos[i]; final++; elementos[k]=novo;

b) Remoo de um elemento da k-sima posio


0 1 2 3 4 5 ... N-1 N

elementos 10 final 5

51

Novo 41

37

Remoo do 4 elemento (k=3)


0 1 2 3 4 5 ... N-1 N

Elementos 10 final 4

51

41 37

Padro de comportamento da manuteno da estrutura Restrio: 0 K Final


Valor=elementos[k]; for (i=k; i <= (final-1); I++) elementos[i]=elementos[i+1]; final--;

Nota-se que dependendo da posio do elemento (k) necessrio movimentar todos os elementos do grupo. Assumindo que todas as posies do grupo tm igual probabilidade de serem submetidas s operaes, necessrio deslocar N/2 elementos em mdia (N=nmero de elementos). A possibilidade de operaes entre os extremos decorrente da liberdade de acesso a qualquer um dos elementos do grupo, porm importante verificar se realmente necessria a realizao efetiva destas operaes. Por exemplo, se a ordem dos elementos no grupo no importante, a realizao de insero sempre no final tem um custo bem menor. Em Java, no pacote Java.util, h duas classes, ArrayList e Vector, que implementam o conceito de lista baseados em arranjos como descrito acima. Quando o limite do arranjo atingido um novo vetor alocado com tamanho maior e os elementos so copiados para este. Em Vector o arranjo dobra de tamanho caso o parmetro capacityIncrement for 0.
public Vector(int initialCapacity, int capacityIncrement)

ArrayList mais rpida que a Vector pois no sincronizada. 4.1) Pesquisas em listas lineares A operao de pesquisa tem como objetivo indicar a presena ou no de um determinado elemento na lista, assim como indicar sua posio. Esta operao necessria para subsidiar as operaes de insero e remoo a fim de identificar a posio do elemento a ser removido ou a posio em que deve ser inserido. 4.1.1)Pesquisa em listas desordenadas As chaves dos elementos no esto ordenadas seguindo uma relao de ordem. Pesquisa Sequencial Parmetros: v (vetor com os elementos), size (quantidade de elementos no vetor) e key (elemento procurado).
static int search (int[] v,int size, int key) { int i; i=0; while (i<size) {

if (v[i]==key) return (i); i++; } return(-1); }

Pesquisa Sequencial com elemento sentinela O elemento procurado colocado na primeira posio livre aps o ltimo elemento (sentinela) com objetivo de garantir a existncia do elemento procurado no grupo. Desta maneira, a comparao (i<size) no mais necessria, pois o elemento sempre ser encontrado. No pior caso o elemento encontrado ser o elemento sentinela.
int i; i=0; v[size]=key; // Elemento Sentinela while (v[i]!=key) i++; if (i!=size) //Verifica se o elemento o sentinela return i; else return -1;

Para utilizar esta tcnica necessrio garantir que o vetor nunca ser preenchido at sua ltima posio, pois preciso guardar lugar para o elemento sentinela. Isto pode ser garantido no algoritmo de insero (sempre manter uma posio livre) ou pelo construtor da lista (alocar o vetor com uma posio a mais que a solicitada). 4.1.2)Pesquisa em listas ordenadas As chaves esto distribudas seguindo uma relao de ordem. Pesquisa Sequencial Pode ser utilizada com ou sem elemento sentinela.
static int search (int[] v,int size,int key){ int i; i=0; v[size]=key; //Elemento Sentinela while (v[i]<key) i++; if ((i==size) || (v[i]!=key)) return -1; else return i; }

Pesquisa Binria
static int search(int[] v,int size,int key){ int low,high,mid; low=0; high=size-1; while (low<=high){ mid=(low+high)/2; if (v[mid]==key) return(mid); else if (v[mid]>key) high=mid-1; else low=mid+1; } return(-1); }

Em Java, no pacote Java.util, a classe Arrays que possui mtodos estticos para realizar a pesquisa binria em arranjos.
public static int binarySearch(byte[] a, byte key)

Nota-se que na pesquisa binria o grupo de elementos sempre separado ao meio a cada iterao, provocando uma reduo do nmero de elementos provveis pela metade. Iterao 1 2 3 ... m Nmero de elementos N N/2 (N/2)/2 ... 1

N O nmero de iteraes na pesquisa binria no mximo 1 log 2 , enquanto a sequencial pode chegar a N. As anlises dos dois algoritmos mostram uma maior eficincia em mdia da pesquisa binria, onde a pesquisa binria tem um comportamento na ordem de Log N contra N da sequencial.

Vous aimerez peut-être aussi