logo

O que é uma fila prioritária?

Uma fila de prioridade é um tipo de dados abstrato que se comporta de forma semelhante à fila normal, exceto que cada elemento tem alguma prioridade, ou seja, o elemento com a prioridade mais alta viria primeiro em uma fila de prioridade. A prioridade dos elementos em uma fila de prioridade determinará a ordem em que os elementos serão removidos da fila de prioridade.

A fila de prioridade suporta apenas elementos comparáveis, o que significa que os elementos são organizados em ordem crescente ou decrescente.

ordenar por sql aleatório

Por exemplo, suponha que temos alguns valores como 1, 3, 4, 8, 14, 22 inseridos em uma fila de prioridade com uma ordem imposta aos valores do menor para o maior. Portanto, o número 1 teria a prioridade mais alta, enquanto o número 22 teria a prioridade mais baixa.

Características de uma fila prioritária

Uma fila prioritária é uma extensão de uma fila que contém as seguintes características:

  • Cada elemento em uma fila de prioridade possui alguma prioridade associada a ele.
  • Um elemento com maior prioridade será excluído antes da exclusão do menor prioridade.
  • Se dois elementos numa fila de prioridade tiverem a mesma prioridade, eles serão organizados utilizando o princípio FIFO.

Vamos entender a fila de prioridade através de um exemplo.

Temos uma fila de prioridade que contém os seguintes valores:

1, 3, 4, 8, 14, 22

Todos os valores estão organizados em ordem crescente. Agora observaremos como ficará a fila de prioridade após realizar as seguintes operações:

    enquete():Esta função removerá o elemento de maior prioridade da fila de prioridade. Na fila de prioridade acima, o elemento '1' tem a prioridade mais alta, portanto será removido da fila de prioridade.adicionar (2):Esta função irá inserir o elemento '2' em uma fila de prioridade. Como 2 é o menor elemento entre todos os números, obterá a maior prioridade.enquete():Ele removerá o elemento '2' da fila de prioridade, pois possui a fila de prioridade mais alta.adicionar (5):Ele irá inserir 5 elementos após 4, pois 5 é maior que 4 e menor que 8, portanto obterá a terceira prioridade mais alta em uma fila de prioridade.

Tipos de fila prioritária

Existem dois tipos de fila prioritária:

    Fila de prioridade de ordem crescente:Na fila de prioridade em ordem crescente, um número de prioridade mais baixa é dado como uma prioridade mais alta em uma prioridade. Por exemplo, pegamos os números de 1 a 5 organizados em ordem crescente como 1,2,3,4,5; portanto, o menor número, ou seja, 1, é dado como a prioridade mais alta em uma fila de prioridade.
    Fila de prioridade Fila de prioridade de ordem decrescente:Na fila de prioridade em ordem decrescente, um número de prioridade mais alta é dado como uma prioridade mais alta em uma prioridade. Por exemplo, pegamos os números de 1 a 5 organizados em ordem decrescente como 5, 4, 3, 2, 1; portanto, o maior número, isto é, 5 é dado como a prioridade mais alta em uma fila de prioridade.
    Fila de prioridade

Representação da fila prioritária

Agora veremos como representar a fila de prioridade através de uma lista unidirecional.

Criaremos a fila de prioridade usando a lista abaixo, na qual INFORMAÇÕES lista contém os elementos de dados, PRN lista contém os números de prioridade de cada elemento de dados disponível no INFORMAÇÕES list e LINK contém basicamente o endereço do próximo nó.

Fila de prioridade

Vamos criar a fila de prioridade passo a passo.

tostring java

No caso de fila de prioridade, o número de menor prioridade é considerado de maior prioridade, ou seja, número de prioridade mais baixa = prioridade mais alta.

Passo 1: Na lista, o número de menor prioridade é 1, cujo valor do dado é 333, portanto será inserido na lista conforme mostrado no diagrama abaixo:

Passo 2: Após a inserção de 333, a prioridade número 2 terá uma prioridade mais alta, e os valores dos dados associados a esta prioridade são 222 e 111. Portanto, esses dados serão inseridos com base no princípio FIFO; portanto, 222 serão adicionados primeiro e depois 111.

Etapa 3: Após inserir os elementos da prioridade 2, o próximo número de prioridade mais alta é 4 e os elementos de dados associados aos 4 números de prioridade são 444, 555, 777. Neste caso, os elementos seriam inseridos com base no princípio FIFO; portanto, 444 serão adicionados primeiro, depois 555 e depois 777.

Passo 4: Após inserir os elementos de prioridade 4, o próximo número de maior prioridade é 5, e o valor associado à prioridade 5 é 666, portanto será inserido no final da fila.

Fila de prioridade

Implementação de fila prioritária

A fila de prioridade pode ser implementada de quatro maneiras que incluem arrays, lista vinculada, estrutura de dados heap e árvore de pesquisa binária. A estrutura de dados heap é a maneira mais eficiente de implementar a fila de prioridade, portanto, implementaremos a fila de prioridade usando uma estrutura de dados heap neste tópico. Agora, primeiro entendemos a razão pela qual o heap é a forma mais eficiente entre todas as outras estruturas de dados.

Análise de complexidades usando diferentes implementações

Implementação adicionar Remover olhadinha
Lista vinculada O(1) Sobre) Sobre)
Pilha binária O(logn) O(logn) O(1)
Árvore de pesquisa binária O(logn) O(logn) O(1)

O que é pilha?

Um heap é uma estrutura de dados baseada em árvore que forma uma árvore binária completa e satisfaz a propriedade heap. Se A é um nó pai de B, então A é ordenado em relação ao nó B para todos os nós A e B em um heap. Isso significa que o valor do nó pai pode ser maior ou igual ao valor do nó filho, ou o valor do nó pai pode ser menor ou igual ao valor do nó filho. Portanto, podemos dizer que existem dois tipos de heaps:

    Pilha máxima:O heap máximo é um heap no qual o valor do nó pai é maior que o valor dos nós filhos.
    Fila de prioridade Pilha mínima:O heap mínimo é um heap no qual o valor do nó pai é menor que o valor dos nós filhos.
    Fila de prioridade

Ambos os heaps são heap binários, pois cada um tem exatamente dois nós filhos.

Operações de fila prioritária

As operações comuns que podemos realizar em uma fila prioritária são inserção, exclusão e espiada. Vamos ver como podemos manter a estrutura de dados heap.

    Inserindo o elemento em uma fila de prioridade (max heap)

Se inserirmos um elemento em uma fila de prioridade, ele irá para o slot vazio olhando de cima para baixo e da esquerda para a direita.

Se o elemento não estiver no local correto ele será comparado com o nó pai; se for encontrado fora de ordem, os elementos serão trocados. Este processo continua até que o elemento seja colocado na posição correta.

Fila de prioridade
Fila de prioridade
    Removendo o elemento mínimo da fila de prioridade

Como sabemos que em um heap máximo, o elemento máximo é o nó raiz. Quando removemos o nó raiz, ele cria um slot vazio. O último elemento inserido será adicionado neste slot vazio. Em seguida, este elemento é comparado com os nós filhos, ou seja, filho esquerdo e filho direito, e trocado com o menor dos dois. Ele continua descendo na árvore até que a propriedade do heap seja restaurada.

Aplicações de fila prioritária

A seguir estão os aplicativos da fila de prioridade:

python classificando tuplas
  • É usado no algoritmo do caminho mais curto de Dijkstra.
  • É usado no algoritmo do prim
  • É usado em técnicas de compactação de dados como o código Huffman.
  • É usado na classificação de heap.
  • Também é usado em sistemas operacionais como agendamento de prioridade, balanceamento de carga e tratamento de interrupções.

Programa para criar a fila de prioridade usando o heap máximo binário.

 #include #include int heap[40]; int size=-1; // retrieving the parent node of the child node int parent(int i) { return (i - 1) / 2; } // retrieving the left child of the parent node. int left_child(int i) { return i+1; } // retrieving the right child of the parent int right_child(int i) { return i+2; } // Returning the element having the highest priority int get_Max() { return heap[0]; } //Returning the element having the minimum priority int get_Min() { return heap[size]; } // function to move the node up the tree in order to restore the heap property. void moveUp(int i) { while (i &gt; 0) { // swapping parent node with a child node if(heap[parent(i)] <heap[i]) 2 { int temp; temp="heap[parent(i)];" heap[parent(i)]="heap[i];" heap[i]="temp;" } updating the value of i to function move node down tree in order restore heap property. void movedown(int k) index="k;" getting location left child if (left heap[index]) right (right k is not equal (k !="index)" heap[index]="heap[k];" heap[k]="temp;" movedown(index); removing element maximum priority removemax() r="heap[0];" heap[0]="heap[size];" size="size-1;" movedown(0); inserting a queue insert(int p) + 1; heap[size]="p;" up maintain property moveup(size); from at given i. delete(int i) stored ith shifted root moveup(i); having removemax(); main() elements insert(20); insert(19); insert(21); insert(18); insert(12); insert(17); insert(15); insert(16); insert(14); printf('elements are : '); for(int printf('%d ',heap[i]); delete(2); deleting whose 2. printf('
elements after max="get_Max();" printf('
the which highest %d: ',max); min="get_Min();" minimum %d',min); return 0; < pre> <p> <strong>In the above program, we have created the following functions:</strong> </p> <ul> <tr><td>int parent(int i):</td> This function returns the index of the parent node of a child node, i.e., i. </tr><tr><td>int left_child(int i):</td> This function returns the index of the left child of a given index, i.e., i. </tr><tr><td>int right_child(int i):</td> This function returns the index of the right child of a given index, i.e., i. </tr><tr><td>void moveUp(int i):</td> This function will keep moving the node up the tree until the heap property is restored. </tr><tr><td>void moveDown(int i):</td> This function will keep moving the node down the tree until the heap property is restored. </tr><tr><td>void removeMax():</td> This function removes the element which is having the highest priority. </tr><tr><td>void insert(int p):</td> It inserts the element in a priority queue which is passed as an argument in a function <strong>.</strong>  </tr><tr><td>void delete(int i):</td> It deletes the element from a priority queue at a given index. </tr><tr><td>int get_Max():</td> It returns the element which is having the highest priority, and we know that in max heap, the root node contains the element which has the largest value, and highest priority. </tr><tr><td>int get_Min():</td> It returns the element which is having the minimum priority, and we know that in max heap, the last node contains the element which has the smallest value, and lowest priority. </tr></ul> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/03/what-is-priority-queue-9.webp" alt="Priority Queue"> <hr></heap[i])>