10.07.2015 Views

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI)

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI)

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI)

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>ESTRUTURAS</strong> <strong>DE</strong> <strong>DADOS</strong> (<strong>LEI</strong>, <strong>LM</strong>, <strong>LEE</strong>)<strong>PROGRAMAÇÃO</strong> <strong>III</strong> (<strong>LTSI</strong>)Universidade da Beira Interior, Departamento de InformáticaHugo Pedro Proença, 2012/2013


Listas de Salto As listas de salto foram propostas em 1989 porWilliam Pugh, professor da Universidade deMaryland. São vistas como alternativas a árvores binárias depesquisa Eficiência comparável em operações de pesquisa. Perceptível apenas em situações em que os conjuntos têmvários milhões de elementos. O aumento na eficiência é obtido à custa de umaumento de recursos necessários.


Listas de Salto Ideia-Base: Procuramos pela empresa“Murtosa SA” na páginasamarelas. Ao abrir o livro (ordenadoalfabeticamente), verificamosque nos encontramos apenasnas empresas cuja inicial é “A”. Acção Inteligente: Avançar 1 página (a próximapágina será muito provavelmenterelativa à mesma letra)XAvançar N páginas! (provavelmenteavançaremos para a letra h?, j?)


Listas de Salto Esquema Geral:L 1 5 7 9 14 Cada nó da lista possui vários “níveis” deapontadores para os nós seguintes. Cada nível pode ser encarado como um mecanismode “salto” no acesso aos dados.


Listas de Salto Esquema Geral:L 1 5 7 9 14 A lista está organizada em camadas. A camada inferior corresponde a uma lista ligada trivial. Um elemento na camada “i” tem ligação na camada “i+1”com probabilidade “p” (tipicamente ½ ou ¼). Estrutura Não-Determinística (Aleatória)


Estruturas e Algoritmos Aleatórios O comportamento (temporal/espacial) varia em função dotempo e não pode ser determinado à-priori. Baseia-se em factores aleatorios para efectuar - pelomenos - uma das suas operações Algures, existirá um bloco de instruções do tipo:b random();if b == 0X …elseY … As listas de salto incorporam a aleatoriedade para decidirem que nível de procura fica cada elemento da lista.


Listas de Salto: Estrutura As estruturas de dados que suportam a implementaçãode listas de salto substituem o apontador para o nóseguinte (e anterior) por um vector de apontadores.typedef struct NODO{}Nodo;int chave; //Identificador… //outros dadosstruct NODO nseg[4]; //4 níveisstruct NODO nant[4]; //4 níveis


Listas de Salto: O que muda? Relativamente ao tipo de listas ligadasconvencional, as alterações são mínimas… Cada elemento, em vez de um atributo “nseg” e um“nant” tem vários “nseg” e vários “nant” Implementado através de um vector de “nseg” e “nant” Tantos quanto o número máximo de níveis definidopara a lista de salto.ID=1... (outros dados)nantnseg


Listas de Salto: Pesquisa Procure-se por um elemento com chave “x” na lista Começa-se pelo nível máximo (n) do elemento actual(el=1º elemento da lista) Para SEMPRE Compara-se a chave “x” com a do elemento seguinte àposição actual (y) Se x = y RETORNA SUCESSO x > y: avança para próximo nó com nível (n) x < y: baixa de nível (n=n-1)Caso se tente baixar do último nívelRETORNA INSUCESSO


Listas de Salto: Pesquisa Exemplo: Procura pelo nó com chave “61”.L 1 5 7 9 14 41 55 61 88 91 Fazem-se 4 movimentos Numa lista ligada simples far-se-iam 8


Listas de Salto: Pesquisa Seja “LS” uma lista de salto com 4 níveis.Implemente o uma função que pesquise em “LS”pelo nó com chave “c”: Deverá devolver um apontador para o nó a pesquisar NULL caso o nó não seja encontrado. Protótipo: Nodo* pesquisaListaSalto(Nodo *LS, int c);


Listas de Salto: Inserção Queremos inserir “nv” numa lista de salto com “n” níveis Sortear nível para o nó “nv” (ni, valor entre 1 e N) Para “i” de 1 a ni Colocar apontadores para nó seguinte e nó anterior ao do localonde “nv” deve ser inserido nsegN nantN nvnseg[i]=nsegN; nantNnseg[i]=nv; nsegNnant[i]=nv; nvnant[i]=nantN;


Listas de Salto: Inserção Codifique uma função que sorteie o nível onde umnó deverá ser inserido, mediante um númeromáximo “max” de níveis. Deverá ser devolvido um valor entre 1 e max: srand(unsigned time(NULL)); r = (double)rand() / (double)(RAND_MAX)); Protótipo: int sorteiaNível(int max);


Listas de Salto: Inserção Codifique a função que insere um novo nó “nv”numa lista de salto “LS”. Deverá ser devolvido um apontador para a cabeça dalista. Protótipo: Nodo* insereListaSalto(Nodo *LS, Nodo *nv);


Listas de Salto: Remoção Queremos remover “del” de uma lista de salto com“n” níveis ni=determinar nível de “del” Para “i” de 1 a ni Colocar apontadores para nó seguinte e nó anterior ao dolocal onde “nv” deve ser inserido nsegN nantN nsegNnant[i]=del->nant[i]; nantNnseg[ni]=del->nseg[i]; Libertar recursos associados a “del”


Listas de Salto: Remoção Codifique a função que remnove o nó “del” de umalista de salto “LS”. Deverá ser devolvido um apontador para a cabeça dalista. Os recursos associados a “del” deverão ser libertados Protótipo: Nodo* removeListaSalto(Nodo *LS, Nodo *del);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!