Fila prioritária com operações de diminuição de chave e aumento de chave


11

Um Fibonnaci Heap suporta as seguintes operações:

  • insert(key, data) : adiciona um novo elemento à estrutura de dados
  • find-min() : retorna um ponteiro para o elemento com a chave mínima
  • delete-min() : remove o elemento com a chave mínima
  • delete(node) : exclui o elemento apontado por node
  • decrease-key(node) : diminui a chave do elemento apontado por node

O(1)O(registron)

increase-key(node)O(1)


@ Rafael, se você aumentar a chave do elemento mínimo para que agora seja a maior, não é imediatamente óbvio (pelo menos para mim) que você não precisa fazer uma quantidade super constante de reequilíbrio.
31512 Joe

Respostas:


10

O(1) find-minincrease-keyinsertO(n)

vector<T>
fast_sort(const vector<T> & in) {
  vector<T> ans;
  pq<T> out;
  for (auto x : in) {
    out.insert(x);
  }
  for(auto x : in) {
    ans.push_back(*out.find_min());
    out.increase_key(out.find_min(), infinity);
  }
  return ans;
}

1
Eu supus que (de|in)crease-keyapenas fiz mais ou menos um.
Raphael

E existe um DS que permita a operação de aumentar a tecla em tempo constante, mas diminuir em logarítmica (ou mais)? (Para um min-montão)
Gonzalo Solera

2
@GonzaloSolera: A prova de impossibilidade nesta resposta não se importa com a tecla decrescente; O (1) find-min, chave de aumento e inserção já são um problema em conjunto (e a dependência da prova na inserção não é realmente necessária; O (n) heapify é suficiente, ou provavelmente podemos reutilizar a mesma pilha em vários classifica para provar que viola os limites de classificação de comparação, independentemente do custo de heapify ou insert).
User2357112 suporta Monica

Ok, desculpe, eu perdi a leitura. Obrigado por seu comentário!
Gonzalo Solera
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.