mc-202 filas de prioridade e heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t;...
TRANSCRIPT
![Page 1: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/1.jpg)
MC-202Filas de Prioridade e Heap
Rafael C. S. [email protected]
Universidade Estadual de Campinas
2º semestre/2019
![Page 2: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/2.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 3: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/3.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento
• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 4: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/4.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 5: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/5.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:
• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 6: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/6.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 7: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/7.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:
• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 8: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/8.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 9: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/9.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor
• Mas veremos uma implementação muito melhor
2
![Page 10: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/10.jpg)
Fila de PrioridadeUma fila de prioridades é uma estrutura de dados com duasoperações básicas:
• Inserir um novo elemento• Remover o elemento com maior chave (prioridade)
Uma pilha é como uma fila de prioridades:• o elemento com maior chave é sempre o último inserido
Uma fila é como uma fila de prioridades:• o elemento com maior chave é sempre o primeiro inserido
Primeira implementação: armazenar elementos em um vetor• Mas veremos uma implementação muito melhor
2
![Page 11: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/11.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 12: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/12.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 13: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/13.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 14: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/14.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 15: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/15.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função
• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 16: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/16.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função
• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 17: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/17.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido
• código um pouco mais longo e difícil de entender
3
![Page 18: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/18.jpg)
A função trocaVárias vezes iremos trocar dois elementos de posição
Para tanto, vamos usar a seguinte função:
1 void troca(int *a, int *b) {2 int t = *a;3 *a = *b;4 *b = t;5 }
Ou seja, troca(&v[i], &v[j]) troca os valores de v[i] e v[j]
Outra opção é colocar diretamente no código da função• não precisa chamar outra função• um pouco mais rápido• código um pouco mais longo e difícil de entender
3
![Page 19: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/19.jpg)
Fila de Prioridade (usando vetores) - TAD
1 typedef struct {2 char nome[20];3 int chave;4 } Item;
56 typedef struct {7 Item *v;8 int n, tamanho;9 } FP;
1011 typedef FP * p_fp;1213 p_fp criar_filaprio(int tam);1415 void insere(p_fp fprio, Item item);1617 Item extrai_maximo(p_fp fprio);1819 int vazia(p_fp fprio);2021 int cheia(p_fp fprio);
4
![Page 20: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/20.jpg)
Fila de Prioridade (usando vetores) - TAD
1 typedef struct {2 char nome[20];3 int chave;4 } Item;56 typedef struct {7 Item *v;8 int n, tamanho;9 } FP;
1011 typedef FP * p_fp;1213 p_fp criar_filaprio(int tam);1415 void insere(p_fp fprio, Item item);1617 Item extrai_maximo(p_fp fprio);1819 int vazia(p_fp fprio);2021 int cheia(p_fp fprio);
4
![Page 21: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/21.jpg)
Fila de Prioridade (usando vetores) - TAD
1 typedef struct {2 char nome[20];3 int chave;4 } Item;56 typedef struct {7 Item *v;8 int n, tamanho;9 } FP;
1011 typedef FP * p_fp;
1213 p_fp criar_filaprio(int tam);1415 void insere(p_fp fprio, Item item);1617 Item extrai_maximo(p_fp fprio);1819 int vazia(p_fp fprio);2021 int cheia(p_fp fprio);
4
![Page 22: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/22.jpg)
Fila de Prioridade (usando vetores) - TAD
1 typedef struct {2 char nome[20];3 int chave;4 } Item;56 typedef struct {7 Item *v;8 int n, tamanho;9 } FP;
1011 typedef FP * p_fp;1213 p_fp criar_filaprio(int tam);1415 void insere(p_fp fprio, Item item);1617 Item extrai_maximo(p_fp fprio);1819 int vazia(p_fp fprio);2021 int cheia(p_fp fprio);
4
![Page 23: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/23.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {
2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 24: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/24.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));
3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 25: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/25.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));
4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 26: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/26.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;
5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 27: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/27.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;
6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 28: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/28.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 29: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/29.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {
2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 30: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/30.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;
3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 31: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/31.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 32: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/32.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {
2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 33: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/33.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;
3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 34: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/34.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)
4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 35: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/35.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)
5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 36: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/36.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;
6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 37: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/37.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));
7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 38: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/38.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;
8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 39: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/39.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 40: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/40.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)
• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 41: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/41.jpg)
Operações Básicas1 p_fp criar_filaprio(int tam) {2 p_fp fprio = malloc(sizeof(FP));3 fprio->v = malloc(tam * sizeof(Item));4 fprio->n = 0;5 fprio->tamanho = tam;6 return fprio;7 }
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 }
1 Item extrai_maximo(p_fp fprio) {2 int j, max = 0;3 for (j = 1; j < fprio->n; j++)4 if (fprio->v[max].chave < fprio->v[j].chave)5 max = j;6 troca(&(fprio->v[max]), &(fprio->v[fprio->n-1]));7 fprio->n--;8 return fprio->v[fprio->n];9 }
Insere em O(1), extrai o máximo em O(n)• Se mantiver o vetor ordenado, os tempos se invertem
5
![Page 42: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/42.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 43: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/43.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios
• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 44: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/44.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 45: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/45.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 46: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/46.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?
• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 47: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/47.jpg)
Árvores Binárias CompletasUma árvore binária é dita completa se:
• Todos os níveis exceto o último estão cheios• Os nós do último nível estão o mais à esquerda possível
Exemplo:
Quantos níveis tem uma árvore binária completa com n nós?• ⌈lg(n + 1)⌉ = O(lg n) níveis
6
![Page 48: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/48.jpg)
Árvores Binárias Completas e Vetores
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Podemos representar tais árvores usando vetores• Isso é, não precisamos de ponteiros
7
![Page 49: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/49.jpg)
Árvores Binárias Completas e Vetores
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em relação a v[i]:• o filho esquerdo é v[2*i+1] e o filho direito é v[2*i+2]• o pai é v[(i-1)/2]
8
![Page 50: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/50.jpg)
Árvores Binárias Completas e Vetores
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em relação a v[i]:
• o filho esquerdo é v[2*i+1] e o filho direito é v[2*i+2]• o pai é v[(i-1)/2]
8
![Page 51: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/51.jpg)
Árvores Binárias Completas e Vetores
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em relação a v[i]:• o filho esquerdo é v[2*i+1] e o filho direito é v[2*i+2]
• o pai é v[(i-1)/2]
8
![Page 52: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/52.jpg)
Árvores Binárias Completas e Vetores
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em relação a v[i]:• o filho esquerdo é v[2*i+1] e o filho direito é v[2*i+2]• o pai é v[(i-1)/2]
8
![Page 53: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/53.jpg)
Max-Heap
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em um Heap (de máximo):• Os filhos são menores ou iguais ao pai• Ou seja, a raiz é o máximo
9
![Page 54: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/54.jpg)
Max-Heap
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em um Heap (de máximo):
• Os filhos são menores ou iguais ao pai• Ou seja, a raiz é o máximo
9
![Page 55: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/55.jpg)
Max-Heap
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em um Heap (de máximo):• Os filhos são menores ou iguais ao pai
• Ou seja, a raiz é o máximo
9
![Page 56: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/56.jpg)
Max-Heap
v[0]
v[1]
v[3]
v[7] v[8]
v[4]
v[9]
v[2]
v[5] v[6]
Em um Heap (de máximo):• Os filhos são menores ou iguais ao pai• Ou seja, a raiz é o máximo
9
![Page 57: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/57.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Em um Heap (de máximo):
• Os filhos são menores ou iguais ao pai• Ou seja, a raiz é o máximo
10
![Page 58: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/58.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Em um Heap (de máximo):• Os filhos são menores ou iguais ao pai
• Ou seja, a raiz é o máximo
10
![Page 59: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/59.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Em um Heap (de máximo):• Os filhos são menores ou iguais ao pai• Ou seja, a raiz é o máximo
10
![Page 60: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/60.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Note que não é uma árvore binária de busca!
• E os dados estão bem menos estruturados• pois estamos interessados apenas no máximo
11
![Page 61: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/61.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Note que não é uma árvore binária de busca!• E os dados estão bem menos estruturados
• pois estamos interessados apenas no máximo
11
![Page 62: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/62.jpg)
Max-Heap
10
9
7
6 1
8
5
4
3 2
Note que não é uma árvore binária de busca!• E os dados estão bem menos estruturados• pois estamos interessados apenas no máximo
11
![Page 63: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/63.jpg)
Inserindo no Heap
10
9
7
6 1
8
5
4
3 2
Basta ir subindo no Heap, trocando com o pai se necessário• O irmão já é menor que o pai, não precisamos mexer nele
12
![Page 64: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/64.jpg)
Inserindo no Heap
10
9
7
6 1
8
5 11
4
3 2
Basta ir subindo no Heap, trocando com o pai se necessário• O irmão já é menor que o pai, não precisamos mexer nele
12
![Page 65: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/65.jpg)
Inserindo no Heap
10
9
7
6 1
11
5 8
4
3 2
Basta ir subindo no Heap, trocando com o pai se necessário• O irmão já é menor que o pai, não precisamos mexer nele
12
![Page 66: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/66.jpg)
Inserindo no Heap
10
11
7
6 1
9
5 8
4
3 2
Basta ir subindo no Heap, trocando com o pai se necessário• O irmão já é menor que o pai, não precisamos mexer nele
12
![Page 67: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/67.jpg)
Inserindo no Heap
11
10
7
6 1
9
5 8
4
3 2
Basta ir subindo no Heap, trocando com o pai se necessário• O irmão já é menor que o pai, não precisamos mexer nele
12
![Page 68: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/68.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {
2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 69: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/69.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;
3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 70: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/70.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;
4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 71: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/71.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }
67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 72: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/72.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)
89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 73: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/73.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 74: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/74.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {
11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 75: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/75.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);
12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 76: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/76.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 77: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/77.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:
• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 78: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/78.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz
• Ou seja, O(lg n)
13
![Page 79: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/79.jpg)
Inserindo no Heap
1 void insere(p_fp fprio, Item item) {2 fprio->v[fprio->n] = item;3 fprio->n++;4 sobe_no_heap(fprio, fprio->n - 1);5 }67 #define PAI(i) ((i-1)/2)89 void sobe_no_heap(p_fp fprio, int k) {
10 if (k > 0 && fprio->v[PAI(k)].chave < fprio->v[k].chave) {11 troca(&fprio->v[k], &fprio->v[PAI(k)]);12 sobe_no_heap(fprio, PAI(k));13 }14 }
Tempo de insere:• No máximo subimos até a raiz• Ou seja, O(lg n)
13
![Page 80: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/80.jpg)
Extraindo o Máximo
11
10
7
6 1
9
5 8
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 81: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/81.jpg)
Extraindo o Máximo
8
10
7
6 1
9
5
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 82: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/82.jpg)
Extraindo o Máximo
8
10
7
6 1
9
5
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 83: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/83.jpg)
Extraindo o Máximo
10
8
7
6 1
9
5
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 84: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/84.jpg)
Extraindo o Máximo
10
9
7
6 1
8
5
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 85: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/85.jpg)
Extraindo o Máximo
10
9
7
6 1
8
5
4
3 2
• Trocamos a raiz com o último elemento do heap• Descemos no heap arrumando
– Trocamos o pai com o maior dos dois filhos (se necessário)
14
![Page 86: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/86.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {
2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 87: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/87.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];
3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 88: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/88.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);
4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 89: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/89.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;
5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 90: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/90.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);
6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 91: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/91.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;
7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 92: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/92.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }8
9 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 93: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/93.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/11
12 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 94: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/94.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {
13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 95: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/95.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;
14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 96: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/96.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {
15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 97: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/97.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);
16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 98: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/98.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&
17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 99: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/99.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)
18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 100: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/100.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);
19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 101: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/101.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {
20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 102: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/102.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);
21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 103: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/103.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)
15
![Page 104: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/104.jpg)
Extraindo o Máximo1 Item extrai_maximo(p_fp fprio) {2 Item item = fprio->v[0];3 troca(&fprio->v[0], &fprio->v[fprio->n - 1]);4 fprio->n--;5 desce_no_heap(fprio, 0);6 return item;7 }89 #define F_ESQ(i) (2*i+1) /*Filho esquerdo de i*/
10 #define F_DIR(i) (2*i+2) /*Filho direito de i*/1112 void desce_no_heap(p_fp fprio, int k) {13 int maior_filho;14 if (F_ESQ(k) < fprio->n) {15 maior_filho = F_ESQ(k);16 if (F_DIR(k) < fprio->n &&17 fprio->v[F_ESQ(k)].chave < fprio->v[F_DIR(k)].chave)18 maior_filho = F_DIR(k);19 if (fprio->v[k].chave < fprio->v[maior_filho].chave) {20 troca(&fprio->v[k], &fprio->v[maior_filho]);21 desce_no_heap(fprio, maior_filho);22 }23 }24 }
Tempo de extrai_maximo: O(lg n)15
![Page 105: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/105.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 106: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/106.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando
• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 107: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/107.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 108: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/108.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 109: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/109.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)
• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 110: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/110.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap
• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 111: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/111.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?
16
![Page 112: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/112.jpg)
Mudando a prioridade de um itemCom o que vimos, é fácil mudar a prioridade de um item
• Se a prioridade aumentar, precisamos subir arrumando• Se a prioridade diminuir, precisamos descer arrumando
1 void muda_prioridade(p_fp fprio, int k, int valor) {2 if (fprio->v[k].chave < valor) {3 fprio->v[k].chave = valor;4 sobe_no_heap(fprio, k);5 } else {6 fprio->v[k].chave = valor;7 desce_no_heap(fprio, k);8 }9 }
Tempo: O(lg n)• mas precisamos saber a posição do item no heap• e percorrer o heap para achar o item leva O(n)
– dá para fazer melhor?16
![Page 113: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/113.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1
• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 114: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/114.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições
• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 115: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/115.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap
• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 116: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/116.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap
• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 117: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/117.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 118: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/118.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?
• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 119: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/119.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 120: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/120.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?
• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 121: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/121.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo
• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 122: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/122.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente
• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 123: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/123.jpg)
Posição do item no heap
Se os itens tiverem um campo id com valores de 0 a n-1• Criamos um vetor de n posições• Como parte da struct do heap• Que armazena a posição do item no heap• Em O(1) encontramos a posição do item no heap
Como modificar os algoritmos para atualizar esse vetor?• Toda vez que fizer uma troca, troque também as posições
E se os itens não tiverem esse campo id?• Atribua ids aos elementos você mesmo• Use uma estrutura de dados para encontrar o id rapidamente• Ex: ABBs ou Tabela de Hashing (veremos no futuro)
17
![Page 124: MC-202 Filas de Prioridade e Heaprafael/cursos/2s2019/mc202/slides/unid… · 3 *a = *b; 4 *b = t; 5} Ou seja, troca(&v[i], &v[j])troca os valores de v[i]e v[j] Outra opção é colocar](https://reader034.vdocuments.pub/reader034/viewer/2022050209/5f5c1080ec899a267936c367/html5/thumbnails/124.jpg)
Exercício
Crie versões iterativas de desce_no_heap e sobe_no_heap
18