Por que construir um heap diretamente pode custar O(n)
Compare inserções repetidas com a construção direta de heaps e entenda por que a soma das descidas pode permanecer em O(n).
Resposta direta
Construir um heap diretamente a partir de um vetor pode custar O(n) porque a complexidade total depende da soma das descidas efetivamente realizadas, não da multiplicação automática da altura máxima por todos os elementos. Embora a altura do heap seja proporcional a log n, a soma do trabalho das descidas sucessivas permanece linear quando os elementos internos são processados do último para o primeiro.[1]
Já a construção por inserções repetidas executa n inserções separadas. Como cada inserção custa O(log n), o custo acumulado dessa estratégia é **O(n log n)**.[1]
O contraste central, portanto, não está na ausência de operações de descida. Ele está na quantidade de trabalho que essas operações somam ao longo de toda a construção.[1]
Pense em uma situação do dia a dia: você está organizando uma fila de prioridades para atender clientes. Se você recebe os clientes um a um e os insere na ordem correta de atendimento, a cada nova pessoa você pode precisar reorganizar vários atendimentos anteriores. Repetir essa reorganização para 100 clientes custa muito mais trabalho do que organizar todos os 100 de uma vez, começando de trás para frente e deixando cada um descer apenas até seu lugar correto.
Inserir separadamente repete o custo logarítmico
Na primeira estratégia, o heap começa sem os n elementos e recebe cada um por meio de uma inserção individual. A análise considera n operações, cada uma com custo O(log n), produzindo o total O(n log n).[1]
Esse raciocínio pode ser representado de forma compacta como:
n × O(log n) = O(n log n)[1]
Aqui, o custo logarítmico pertence a cada inserção separada. A repetição dessa operação para todos os elementos é exatamente o que leva ao fator n log n.[1]
A construção direta parte de outra organização do trabalho. Em vez de tratar cada elemento como uma nova inserção, ela começa com os dados no vetor e aplica descidas sucessivas aos elementos internos, seguindo do último para o primeiro.[1]
Imagine que você está construindo um heap enquanto controla cada operação em um quadro. Cada vez que insere uma pessoa nova, ela percorre em média metade do caminho possível até seu lugar. Com 1.000 pessoas inseridas uma por uma, esse custo múltiplo se acumula rapidamente. A construção direta, ao contrário, distribui o trabalho de forma que a maioria dos elementos desce apenas uma ou duas posições, mantendo a soma total dentro de um limite linear[1].

A altura máxima não é o custo de todas as descidas
A altura do heap é proporcional a log n, mas isso informa apenas a escala do maior caminho disponível na estrutura. Essa altura máxima não demonstra que todas as descidas percorrem esse caminho inteiro.[1]
Usar O(log n) como se fosse o trabalho realizado por cada posição produz uma estimativa de O(n log n), mas essa estimativa não captura a soma mais precisa da construção direta. A análise apresentada para esse método conclui que, apesar da altura logarítmica, o trabalho total das descidas permanece em O(n).[1]
Esse é o ponto que costuma parecer contraditório: uma operação pode admitir uma descida relacionada à altura do heap sem que todas as operações realizem o custo máximo. A complexidade total deve contabilizar o trabalho efetivo agregado.[1]
Lembre-se: um heap com 1 milhão de elementos tem altura próxima a 20. Isso significa que a descida mais longa possível é de cerca de 20 passos. Porém, a grande maioria dos elementos internos em um heap completo está nas camadas inferiores, onde uma descida é de apenas 1 ou 2 passos. Só alguns poucos elementos começam próximos ao topo. Multiplicar 1 milhão por 20 daria uma estimativa pessimista; contar o trabalho real de cada descida revela uma soma linear[1].
A soma de custos explica o resultado linear
Considere cᵢ como o trabalho da descida aplicada ao elemento interno de posição i. O custo da construção direta corresponde à soma c₁ + c₂ + ... + cₖ, para os elementos internos processados, e não simplesmente ao produto entre o número total de elementos e a altura máxima.[1]
Saber que uma descida pode estar limitada por uma altura proporcional a log n fornece um limite para uma operação isolada. Isso não determina que cada parcela cᵢ tenha esse mesmo valor. Na construção direta, a distribuição dos trabalhos de descida faz com que a soma permaneça linear.[1]
Assim, as duas análises usam unidades diferentes de contabilização:
- Na inserção repetida, contam-se
ninserções separadas, cada uma custandoO(log n). O resultado éO(n log n).[1] - Na construção direta, somam-se as descidas aplicadas aos elementos internos do vetor, e essa soma total é
O(n).[1]
A evidência fornecida sustenta essa conclusão assintótica, mas não apresenta uma contagem detalhada por nível nem constantes de implementação. O resultado seguro é que a soma das descidas é linear, mesmo com altura proporcional a log n.[1]
Exemplo compacto de contabilização
Imagine uma implementação em C que mantém um contador do trabalho realizado em cada descida. Se o programa construir o heap inserindo os elementos um por um, a análise atribuirá O(log n) a cada uma das n inserções, chegando a O(n log n).[1]
Se o programa começar com o vetor preenchido e processar seus elementos internos do último para o primeiro, o contador deverá registrar apenas os passos realmente executados em cada descida. Não é correto preencher antecipadamente o contador de todas as posições com log n, pois a altura máxima não representa o percurso realizado por todos os elementos. A soma final desse trabalho permanece em O(n).[1]
O exemplo não depende de uma sintaxe específica da linguagem. A conexão com C está no uso do vetor e na necessidade de analisar o custo do algoritmo que opera sobre ele, conforme apresentado no conteúdo relacionado do curso.

O contraste que deve ser preservado
A inserção repetida custa O(n log n) porque repete n vezes uma operação de custo O(log n).[1] A construção direta custa O(n) porque processa os elementos internos por descidas sucessivas cuja soma total de trabalho é linear.[1]
Portanto, observar apenas a maior altura possível produz uma visão incompleta. Para compreender a construção direta, é necessário analisar a soma dos custos realizados, e essa soma não exige que todos os elementos percorram a altura máxima.[1]
Você encontrará essa análise aplicada a estruturas de dados em linguagens compiladas como C, onde o controle sobre vetores e a eficiência de cada operação são críticos. Leia mais sobre como confirmar o modo de processamento em C, C++ ou C# para entender como a escolha de algoritmo afeta o desempenho em código real. Também vale explorar por que uma string em C precisa de um byte além dos caracteres visíveis, pois ambos os tópicos tocam na contagem cuidadosa de recursos.
Perguntas frequentes
Por que multiplicar n vezes log n não funciona para a construção direta?
Porque a altura máxima não é o custo incorrido por cada elemento. A construção direta aproveita o fato de que a maioria dos elementos está perto do fim do vetor e desce apenas alguns níveis. A soma efetiva é linear, não log n vezes n[1].
Qual a diferença entre contar operações e contar a altura máxima?
Contar operações significa somar o trabalho real realizado em cada descida. Contar a altura máxima seria assumir que todos os n elementos caem log n posições, o que superestima o custo real. A análise correta descobre que a soma real é O(n)[1].
Um heap com 1 milhão de elementos realmente custa O(n) para ser construído diretamente?
Sim. Embora a altura seja aproximadamente log 1 milhão ≈ 20, a maioria dos elementos internos desce apenas 1 ou 2 posições. Quando você soma todos esses custos reais, o total fica proporcional a n, não a n vezes 20[1].
Quando a construção por inserção é melhor que a direta?
A construção por inserção é melhor quando você recebe os dados aos poucos no tempo, não todos de uma vez. Se você já tem todos os n elementos no vetor, a construção direta é sempre mais rápida, economizando um fator logarítmico[1].
Fontes consultadas
Obras e aulas usadas na redação deste guia. Os números no texto levam a elas.
- CELES, Waldemar; CERQUEIRA, Renato; RANGEL, José Lucas. Introdução a Estrutura de Dados 2ED: Com Técnicas De Programação Em C 2, cap. 25
