Encontrando o pior caso de classificação de heap

8

Estou trabalhando no problema H no concurso ACM ICPC 2004-2005 do nordeste da Europa .

O problema é basicamente encontrar o pior caso que produz um número máximo de trocas no algoritmo (peneirar) para criar o heap.

  • Entrada: O arquivo de entrada contém ( ).n1n50.000
  • Saída: imprima a matriz que contém números inteiros diferentes de a , de forma que seja uma pilha, e ao convertê-la em uma matriz classificada, o número total de trocas em operações de peneiração é o máximo possível.n1n

Entrada de amostra: 6
Saída correspondente:6 5 3 2 4 1

E os resultados básicos:

[2, 1]   
[3, 2, 1]   
[4, 3, 1, 2] 
[5, 4, 3, 2, 1] 
[6, 5, 3, 4, 1, 2]
jonaprieto
fonte
2
você está basicamente perguntando "por que meu código é tão lento"? Eu acho que esta questão é muito localizada, e de qualquer maneira pertence melhor em Stack Overflow
Ran G.
Não, realmente, quero encontrar o pior caso para o algoritmo heapsort. Mas meu código é uma tentativa de entender esses casos.
Jonaprieto
2
Se você deseja tentar heapsort em todos os pedidos possíveis de matrizes, não é de surpreender que seu algoritmo seja extremamente lento: ele terá um tempo de execução de pelo menos Ω(n!), que cresce mais do que exponencialmente. 10! já é de 3,6 milhões. Você ficaria melhor com uma análise teórica. (anunciado comentário como eu descaracterizou o início da sua pergunta assim que a segunda parte do meu comentário não era válido)
Alex ten Brink
Este artigo parece ser relevante. Eu segundo Ran; edite a pergunta para que ela faça a pergunta sem clichê.
Raphael
Pode ser que isso seja útil .

Respostas:

4

Dado o pior caso para n, podemos construir o pior caso para n+1 da seguinte maneira: fazemos um 'ciclo de troca' da seguinte maneira: n+1, coloque dentro uma[0 0]e trocamos uma[0 0] com o elemento máximo de seus filhos, que é uma[1] ou uma[2], que trocamos novamente com o elemento máximo de seus filhos e assim por diante, até deixarmos o nheap de elemento; nesse ponto, colocamos esse último elemento no n+1-ª posição.

Um exemplo: o pior caso para n=5 é [5,4,3,2,1]. Trocamos 6, que cria a pilha[6,5,3,4,1], após o que terminamos com 2, que inserimos no final: [6,5,3,4,1,2].

O método acima funciona por indução: partimos do pior resultado para n-1 elementos e execute uma operação de peneiração inversa, maximizando o número de swaps que ele deve fazer (registro(n)swaps). Você não pode fazer mais trocas do que isso; portanto, você maximiza o número de trocas após a primeira operação de extração-min, após a qual você fica exatamente com o pior caso possível.n-1elementos para a próxima operação extrair-min. Isso implica que o número de swaps é realmente máximo.

Observe que este método fornece resultados diferentes dos obtidos:

[1]
[2, 1]
[3, 2, 1]
[4, 3, 1, 2]
[5, 4, 1, 3, 2]
[6, 5, 1, 4, 2, 3]
[7, 6, 1, 5, 2, 4, 3]
[8, 7, 1, 6, 2, 4, 3, 5]
[9, 8, 1, 7, 2, 4, 3, 6, 5]
[10, 9, 1, 8, 2, 4, 3, 7, 5 ,6]

No entanto, ambas as soluções estão corretas:

[5, 4, 1, 3, 2]
[2, 4, 1, 3| 5]
[4, 2, 1, 3| 5]
[4, 3, 1, 2| 5]
[2, 3, 1| 4, 5]
[3, 2, 1| 4, 5]

[5, 4, 3, 2, 1]
[1, 4, 3, 2| 5]
[4, 1, 3, 2| 5]
[4, 2, 3, 1| 5]
[1, 2, 3| 4, 5]
[3, 2, 1| 4, 5]

[6, 5, 1, 4, 2, 3]
[3, 5, 1, 4, 2| 6]
[5, 3, 1, 4, 2| 6]
[5, 4, 1, 3, 2| 6]
[2, 4, 1, 3| 5, 6]
[4, 2, 1, 3| 5, 6]
[4, 3, 1, 2| 5, 6]
[2, 3, 1| 4, 5, 6]
[3, 2, 1| 4, 5, 6]

[6, 5, 3, 4, 1, 2]
[2, 5, 3, 4, 1| 6]
[5, 2, 3, 4, 1| 6]
[5, 4, 3, 2, 1| 6]
[1, 4, 3, 2| 5, 6]
[4, 1, 3, 2| 5, 6]
[4, 2, 3, 1| 5, 6]
[1, 2, 3| 4, 5, 6]
[3, 2, 1| 4, 5, 6]
Alex ten Brink
fonte
Mas, esses exemplos não são montes!
Jonaprieto