Estrutura de Dados! Listas lineares! estática! dinâmicas! Como manipulá-las:! pilhas! filas 1
Listas Lineares! fácil manipulação! agrupa informações referentes a um conjunto de elementos que se relacionam entre si! Uma lista linear ou tabela é um conjunto de n elementos L[0], L[1],..., L[n-1] tais que! n>0, e L[0] é o primeiro elemento! para 0 < k < n, L[k] é precedido por L[k-1] 2
Listas Lineares! Operações: busca, inclusão e remoção! outras operações:! alteração de um elemento na lista! combinação de duas ou mais listas! ordenação! Casos particulares:! remoção e inserção apenas nas extremidades - deque! inserção/remoção em um único extremo - pilha! inserções e um extremo e remoções no outro - fila! Alocação: seqüencial ou encadeada 3
Listas Sequenciais! Alocação seqüencial de memória! endereço do (j+1) ésimo elemento se encontra a uma unidade de armazenamento j-ésimo elemento! Representação e acesso! i-ésimo elemento: L[i]! Cada elemento pode ser formado por campos! uma chave k[i] está associada ao nó L[i]! a lista é dita classificada ou ordenado por chave quando: se i < j então k[i] precede k[j] 4
Busca Seqüencial! busca em uma lista seqüencial! ordenada pelas suas chaves! não ordenada! Problema: busca pelo valor v em um conjunto de N elementos. O procedimento retorna o valor da posição da lista sequencial se encontrar e N, caso contrário 5
Busca Seqüencial 1 5 3 2 9 7 1 5 3 2 9 7 6
Busca Seqüencial 1 5 3 2 9 7 1 5 3 2 9 7 4 7
Busca Seqüencial Busca_Seqüencial_1 (v){ pos = 0; while ( (pos<n) && (v!= L [pos]) ) pos++; return(pos); } 8
Busca Seqüencial Busca_Seqüencial_1 (v){ pos = 0; while ( (pos<n) && (v!= L [pos]) ) pos++; return(pos); } Busca_Seqüencial_2 (v){ L[N] = v; pos = -1; do { pos = pos+1; ([ pos ] } while ( v!= L return(pos); } 9
Busca Seqüencial! A complexidade do pior caso é O(n) para os dois algoritmos! O segundo é de execução mais rápida pois o número de testes é menor a cada iteração 10
Busca Seqüencial! Problema:! inserir um novo valor em uma lista seqüencial desordenada, caso não exista na respectiva lista 11
Inserção ( v Insere_seq (int { if (N == (maxn -1)) overflow ; if (N!= 0) { pos = busca_sequencial (v); if ( pos == N) { L[pos] = v; N++; } } else { L[0] = v; N++;} } Complexidade:? 12
Inserção ( v Insere_seq (int { if (N == (maxn -1)) overflow ; if (N!= 0) { pos = busca_sequencial (v); if ( pos == N) { L[pos] = v; N++; } } else { L[0] = v; N++;} } Complexidade: O (n). Por que? 13
Remoção! Problema: remover um valor v existente em uma lista seqüencial desordenada com N elementos 14
Remoção if (N!= 0) { indice = busca_sequencial (x); if (indice!= N){ elemento = a[indice]; for (i = indice; i < (N-1); i ++) L[i] = L[i + 1]; N--; } else elemento não encontrado ; }else underflow (?) (n) Complexidade: O 15
Busca em uma Lista Ordenada! Problema: buscar um valor v não existente em uma lista seqüencial ordenada com N elementos! o tempo de busca pode ser reduzido significantemente! devido a relação entre os elementos da lista! mesmo para um conjunto de elementos é grande 16
Busca em uma Lista Ordenada ( v ) Busca_Seqüencial_Ord { a[n].chave = v; do { pos = pos+1; } while ( v < a [pos].chave); if (v!= a[pos].chave) return(pos); return(n); } complexidade? 17
Busca Binária! Busca baseada em "dividir para conquistar"! divida um conjunto de elementos em duas partes! determine a qual dessas duas partes a chave pertence e se concentre nessa parte! use índices do array para delimitar a parte sendo trabalhada! ou seja:! compare com a chave do elemento do meio! se a chave comparada for menor, o elemento está na parte esquerda da lista, se maior, na parte direita! aplique o método recursivamente 18
Busca Binária ( v ) busca_binaria { e = 0; d = N-1; do { pos= (e + d)/ 2; if (v < a[pos].chave) d = pos-1; else e=pos+1; }while ((v!=a[pos].chave) && (e <= d)); } if (v== a[pos].chave) return(pos); else return(n); 19
Busca Binária Buscando 9 0 1 2 3 4 5 6 7 8 9 10 11 2 5 6 7 9 15 16 23 25 40 52 55 e pos d 20
Busca Binária Buscando 9 0 1 2 3 4 5 6 7 8 9 10 11 2 5 6 7 9 15 16 23 25 40 52 55 e pos d e pos d 21
Busca Binária Buscando 9 0 1 2 3 4 5 6 7 8 9 10 11 2 5 6 7 9 15 16 23 25 40 52 55 e pos d e pos d e/ pos d 22
Busca Binária Buscando 9 0 1 2 3 4 5 6 7 8 9 10 11 2 5 6 7 9 15 16 23 25 40 52 55 e pos d e pos d e/ pos d e/d pos 23
Busca Binária Complexidade: suponha que n = 2 k 1 o passo: uma lista de n elementos 2 o passo: uma lista de n/2 elementos 3 o passo: uma lista de n/4 elementos... k-ésimo passo: uma lista de n/2 (k-1) elementos (k+1)-ésimo passo: uma lista de n/2 k elementos que na verdade tem somente 1 elemento " n/2 k = 1 " k = log n ( n " log n passos " O(log 24
Inserção em Lista Ordenada! Problema: inserção de um valor v em uma lista de elementos ordenada por chave, caso esse elemento não se encontre na lista! Passos:! busca! inserção na posição retornada! Complexidade: O(n). Por que? Não foi busca binária? Obs.: remoção é equivalente 25
Complexidade Média - Busca Binária! Comportamente médio do algoritmo de busca binária! q - probabilidade de sucesso da busca! (1-q) - probabilidade de não achar L[0] L[1] L[2]... L[n-1] R[0] R[1] R[2] R[n-1] R[n] 26
Complexidade Média - Busca Binária! complexidade média = número de passos da busca com sucesso + busca sem sucesso! busca com sucesso! são n possibilidades de ter sucesso! mesma probabilidade para qualquer elemento: q/n! busca sem sucesso! intervalo R[i] L[i-1] < v < L[i]! a probabilidade é a mesma para qualquer intervalo ( q)/(n+1 (1- = 27
Complexidade Média - Busca Binária ( k+1 ) (q/n)k + [(1-q)/(n+1)] (n-q+2)/2 28