• Nenhum resultado encontrado

MAC0323 Algoritmos e Estruturas de Dados II. Edição

N/A
N/A
Protected

Academic year: 2022

Share "MAC0323 Algoritmos e Estruturas de Dados II. Edição"

Copied!
49
0
0

Texto

(1)

MAC0323 Algoritmos e Estruturas de Dados II

Edição 2020 – 2

(2)

Fonte: ash.atozviews.com

Compacto dos melhores momentos

AULA 7

(3)

AULA 7

(4)

Binomial heaps

Fontes: Wikipedia, Foundations of Data Science

CLRS 19

(5)

Binomial trees: estrutura

Em uma árvore binomial Bk de ordem k:

I a raiz tem k filhos;

I a árvore tem 2k nós;

I a árvore tem altura k;

I há exatamente k

i

com profundidade i;

I os filhos da raiz são

as árvores binomiais Bk−1, Bk−2, Bk−3,. . .

(6)

Binomial heap

Uma binomial heap H é uma coleção de binomial trees que satisfaz as seguintes propriedades:

I cada binomial tree em H é uma MinPQ/MaxPQ;

I H tem no máximo uma binomial tree de cada ordem.

n = 13 = 1×20+ 0×21+ 1×22+ 1×23.

Fonte: Wikipedia

(7)

AULA 8

(8)

Binomial heap: estrutura de dados

Fonte: CLRS

Os filhos de nó serão representados através de uma lista ligada ordenada pelos graus (order) dos filhos.

(9)

BinomialMinPQ: struct node e Link

Representação de um nó de uma binomial tree.

typedef struct node *Link;

struct node { Item item;

Link child, /* filho mais a esquerda */

Link sibling, /* lista de irmãos */

Link parent; /* pai */

int order; /* ou grau, degree */

};

A lista de irmão está ordenada de acordo com o grau dos nós (ordem das árvores).

(10)

Binomial heap: estrutura de dados

Fonte: CLRS

(11)

BinomialMinPQ: insert()

3 2

12 9

10 7

5 8 6

(12)

BinomialMinPQ: insert()

3 2

12 9

10 7 4

5 6

8

(13)

BinomialMinPQ: insert()

2 12 9

10 7 3

4 6 5

8

(14)

BinomialMinPQ: insert()

Como existem 1 +blgnc binomial trees

que podem ser unidas concluímos o seguinte.

No pior caso, o consumo de tempo da operação insert() é O(lgn),

onde n é o número de itens na binomial heap.

(15)

BinomialMinPQ: change()

2

9 10

7 3

4

8 5 12 6

(16)

BinomialMinPQ: change()

2

7 9 3

4

1

8

5 12

6

(17)

BinomialMinPQ: change()

2 12 9

3 4

1

7

5 8 6

(18)

BinomialMinPQ: change()

2 12 9

3 4

7 1

6 8

5

(19)

BinomialMinPQ: change()

12 9

3 4

7

1

2

6 8

5

(20)

BinomialMinPQ: change()

Como a maior altura de uma árvore na

binomial heap é blgnc concluímos o seguinte.

No pior caso, o consumo de tempo da operação change() é O(lgn),

onde n é o número de itens na binomial heap.

(21)

BinomialMinPQ: delMin()

Percorra a lista das raízes e encontre o menor item.

12 9

3 4

7

1

2

6 8

5

(22)

BinomialMinPQ: delMin()

Remova o nó.

12 9

3 4

7

2 5

6 8

(23)

BinomialMinPQ: delMin()

Inverta a lista dos seus filhos.

12 9

3 4

7

2 6

5 8

(24)

BinomialMinPQ: delMin()

Inverta a lista dos seus filhos.

12

3 4

8 9

7 5 2

6

(25)

BinomialMinPQ: delMin()

Faça merge() das duas binomial heaps.

12 3

4 8 9

7

2 5

6

(26)

BinomialMinPQ: delMin()

Faça merge() das árvores de mesma ordem.

12 3

4 9

7

2 6

5 8

(27)

BinomialMinPQ: delMin()

Faça merge() das árvores de mesma ordem.

12

3 5 4

8

9 7

2 6

(28)

BinomialMinPQ: delMin()

O consumo de tempo para

encontrar o menor item é O(lgn).

O consumo de tempo para inverter e

intercalar listas com até 1 +blgnc itens é O(lgn).

Finalmente, o consumo de tempo para unir árvores de mesma ordem é O(lgn).

No pior caso, o consumo de tempo da operação delMin() é O(lgn),

onde n é o número de itens na binomial heap.

(29)

BinomialMinPQ: merge()

Fonte: Wikipedia

(30)

BinomialMinPQ: struct node e Link

Cada nó da árvore binomial terá quatro campos.

typedef struct node *Link;

struct node {

Transaction *item;

Link child, sibling;

int order;

};

Link newNode(Transaction *item, Link child, Link newNode(Link sibling, int order){

Link p = mallocSafe(sizeof(*p));

p->item = item; p->order = order;

p->sibling = sibling; p->child = child;

return p;

}

(31)

Arquivo BinomialMinPQ.c: esqueleto

Igual ao do LMinPQ.

#include "MinPQ.h"

static Link head;

static int n;

void MinPQInit(int max) {...}

void MinPQInsert(Item item) {...}

Item MinPQMin() {...}

Item MinPQDelMin() {...}

bool MinPQEmpty() {...}

int MinPQSize() {...}

void MinPQFree() {...}

static Link merge(Link r1, Link r2) {...}

(32)

BinomialMinPQ: init, isEmpty e size

Igual ao do LMinPQ.

void MinPQInit(int m) { head = NULL;

n = 0;

}

int MinPQSize() { return n;

}

bool MinPQEmpty() { return n == 0;

}

(33)

BinomialMinPQ: insert()

void MinPQInsert(Item item) {

Link s = newNode(item, NULL, NULL, 0);

head = merge(head, s);

n++;

}

(34)

BinomialMinPQ: delMin()

Item MinPQDelMin() {

Link x, prevx, nextx, min;

Item item;

/* remova minimo do heap */

min = eraseMin();

item = min->item;

n--;

if (min->child != NULL) {

/* inverta lista de filhos do min */

x = min->child;

prevx = NULL; nextx = x->sibling;

(35)

BinomialMinPQ: delMin()

while (nextx != NULL) { x->sibling = prevx;

prevx = x;

x = nextx;

nextx = nextx->sibling;

}

x->sibling = prevx;

head = merge(head, x) }

freeNode(min);

return item;

}

(36)

BinomialMinPQ: eraseMin()

Remove um mínimo da lista da raiz e seus siblings.

static Link eraseMin() {

Link min = head, prev = NULL, current = head;

while (current->sibling != NULL) {

if (less(current->sibling->item, min->item)){

prev = current;

min = current->sibling;

}

current = current->sibling;

}

if (min == head) head = min->sibling;

else prev->sibling = min->sibling;

return min;

}

(37)

BinomialMinPQ: link()

As duas próximas rotinas serão usadas no merge.

Supõe que r2->item < r1->item Supõe que r2->order == r1->order.

link(r1, r2) inclui r1 como primeiro filho de r2.

static void link(Link r1, Link r2) { r1->sibling = r2->child;

r2->child = r1;

(r2->order)++;

}

(38)

BinomialMinPQ: mergeR()

mergeR(r1, r2) intercala as listas ligadas dos caminhos sibling de r1 e r2:

static Link mergeR(Link r1, Link r2) { if (r1 == null) return r2;

if (r2 == null) return r1;

if(r1->order < r2->order) {

Link t = r1; r1 = r2; r2 = t;

}

r1->sibling = mergeR(r1->sibling, r2);

return r1;

}

Para o merge, falta juntarmos as árvores repetidas.

(39)

BinomialMinPQ: merge()

static Link merge(Link r1, Link r2) { Link r, x, prevx, nextx;

if (r1 == null) return r2;

if (r2 == null) return r1;

r = mergeR(r1, r2);

x = r;

prevx = NULL; nextx = x->sibling;

while (nextx != NULL) {

if (x->order < nextx->order ||

(nextx->sibling != NULL &&

(nextx->sibling->order == x->order)) { /* não repete ou tem três repetidas */

prevx = x; x = nextx;

} else ...

(40)

BinomialMinPQ: merge()

else if (less(x->item, nextx->item)) { /* nextx vira filho de x */

x->sibling = nextx->sibling;

link(nextx, x);

}

else { /* x vira filho de nextx */

if (prevx == NULL) r = nextx;

else prevx->sibling = nextx;

link(x, nextx);

x = nextx;

}

nextx = x->sibling;

}

return r;

}

(41)

BinomialMinPQ: Conclusões

Em uma binomial heap, o consumo de tempo das operações insert(), delMin(), change() e union() no pior caso é O(lgn), onde n é o número de itens na binomial heap.

A operação administrativa básica é a intercalação (merge()) de listas ordenadas pelo campo order.

O consumo de tempo amortizado de insert() é O(1).

Novamente podemos adicionar uma operação extra à biblioteca, de união de duas filas priorizadas.

(42)

Consumo de tempo MinPQ

heap d-heap Fibonacci heap insert() O(lgn) O(logdn) O(1) delMin() O(lgn) O(logdn) O(lgn) change() O(lgn) O(logdn) O(1)

Como fazer o change()

em LMinPQ e BinomialMinPQ?

Em Fibonacci heap,

o consumo de delMin() é amortizado.

(43)

Tabelas de Símbolos

Fonte: http://www.i-programmer.info/

Tabelas de símbolos (PF) Elementary Symbol Tables (S&W)

(44)

Tabelas de símbolos

Uma tabela de símbolos (ST = symbol table) é um ADT que consiste em um conjunto de itens, sendo cada item um par chave-valor ou

key-value, munido de duas operações fundamentais:

I put(), que insere um novo item na ST, e

I get(), que busca o valor associado a uma dada chave.

(45)

Tabelas de símbolos

Convenções sobre STs:

I não há chaves repetidas

(as chaves são duas a duas distintas),

I null nunca é usado como key,

I null nunca é usado como value associado a uma key.

STs são também chamadas de

dictionaries, maps e associative arrays.

(46)

Interface ST.h

Arquivo ST.h

void stInit() cria uma ST

void stPut(Key key, Value val) insere (key,val) na ST Value stGet(Key key) busca o valor

associado akey

void stDelete(Key key) remove (key,val) da ST int stRank(Key key) no. de keys menor que key

bool stEmpty() ST está vazia?

bool stContains(Key key) a key está na ST?

Além destas, usaremos as rotinas de um iterador.

(47)

Cliente: Index()

keys = palavras e

vals = lista de posições onde a palavra ocorre int main(int argc, char *argv) {

int minLength = atoi(argv[1]),

int minOccurrence = atoi(argv[2]), n;

char **words = readAllStrings(&n), *s;

/* words[0. .n−1] guarda as palavras */

Queue q;

(48)

Cliente: Index()

stInit();

for (int i = 0; i < n; i++){

s = words[i];

if (strlen(s) < minLength) continue;

if (!stContains(s))

stPut(s, queueInit());

q = stGet(s);

queuePut(q, i);

}

(49)

Cliente: Index()

stStartIterator();

while (stHasNext()) { s = stNext();

q = stGet(s);

if (queueSize(q) >= minOccurrence) { printf("%s : ", s);

queueDump(q);

} }

stFree();

}

Referências

Documentos relacionados

O artigo está dividido da seguinte forma: primeiramente fazemos uma revisão bibliográfica sobre os merca- dos contestados, apontando suas principais características e

Essa permanência do usuário de crack nas comunidades ayahuasqueiras, a convivência vívida com seus membros e as participações nos rituais de consagração da ayahuasca, reduz as

2.5) Não será considerado os itens para exportação, pois o edital está solicitando somente importação. Tendo em vista todos os apontamentos acima citados o atestado

Recorte em folha branca ou folha colorida as formas geométricas triângulo, círculo, quadrado e retângulo, permita que a criança explore todas as formas, colocando as diferenças

O projeto inicial foi elaborado pelos pesquisadores com o objetivo de contribuir para a análise dos aspectos lingüísticos como fonética e fonologia, expressões de

TP-Link Archer C7 TP-Link TL-WR1043ND TP-Link TL-WR720N TP-Link TL-WR740N TP-Link TL-WR749N TP-Link TL-WR840N TP-Link TL-WR841N TP-Link TL-WR845N TP-Link TL-WR849N TP-Link

No tópico Herança ligado ao sexo, atenção, pois devemos saber que padrões deste tipo de herança se relacionam com genes que estão na região não homóloga do cromossomo X.. É

O outro aspecto a ser destacado nesse movimento de fuga é a forma de ligação entre as diversas histórias do livro que, apesar de poderem ser consideradas pequenos