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)

Joe
fonte
@ 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;
}
jbapple
fonte
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