Um problema de pilha d-ária do CLRS


10

Fiquei confuso ao resolver o seguinte problema (perguntas 1 a 3).

Questão

Uma pilha d -ary é como uma pilha binária, mas (com uma possível exceção) nós não-folha têm filhos d em vez de dois filhos.

  1. Como você representaria um d pilha -ary em uma matriz?

  2. O que é a altura de um d montão -ary de n elementos em termos de n e d ?

  3. Forneça uma implementação eficiente do EXTRACT-MAX em um h-max d -ary. Analise seu tempo de execução em termos de d e n .

  4. Forneça uma implementação eficiente do INSERT em um d -ary max-heap. Analise seu tempo de execução em termos de d e n .

  5. Forneça uma implementação eficiente de INCREASE-KEY ( A , i , k ), que sinaliza um erro se k <A [i] = k e atualiza a estrutura de heap da matriz d -ary adequadamente. Analise seu tempo de execução em termos de d e n .

Minha solução

  1. Dê uma matrizA[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    Minha notação parece um pouco sofisticada. Existe algum outro mais simples?

  2. Deixe h denota a altura da pilha d- ar.

    Suponha que a pilha seja uma árvore d- ar completa

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. Esta é a minha implementação:

    EXTRACT-MAX(A)
    1  if A.heapsize < 1
    2      error "heap underflow"
    3  max = A[1]
    4  A[1] = A[A.heapsize]
    5  A.heap-size = A.heap-size - 1
    6  MAX-HEAPIFY(A, 1)
    7  return max
    
    MAX-HEAPIFY(A, i)
    1  assign depthk-children to AUX[1..d]
    2  for k=1 to d
    3      compare A[i] with AUX[k]
    4      if A[i] <= AUX[k]
    5          exchange A[i] with AUX[k]
    6          k = largest
    7  assign AUX[1..d] back to A[depthk-children]
    8  if largest != i
    9      MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
    
    • O tempo de execução de MAX-HEAPIFY:

      c i

      TM=d(c8d+(c9+..+c13)d+c14d)
      que indica o custo da i- ésima linha acima.ci
    • EXTRATO-MÁX:

      TE=(c1 1+..+c7)+TMCdh=Cd(euogd[n(d-1 1)+1 1]-1 1)=O(deuogd[n(d-1 1)])

    Esta é uma solução eficiente? Ou há algo errado na minha solução?


Acho que há um pequeno erro na pergunta e na explicação: A altura da pilha d-ária chega a h = (log [nd - n + 1]) - 1 // NOTA é "-n" e não "-1" e não h = (log [nd−1+1])− 1Assim, acima da explicação para altura não será verdadeira. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Embora, no entanto, a altura da árvore seja escrita como Θ(log(n)).Nota: o log está sempre na base d para um heap d-ário .
Surabhi Raje

Respostas:


10
  1. Sua solução é válida e segue a definição de pilha d -ary. Mas, como você apontou, sua notação é um pouco sofisticada.

    Você pode usar essas duas funções a seguir para recuperar o pai do i- ésimo elemento e j- ésimo filho do i- ésimo elemento.

    pai-d-ário(Eu)    retvocêrn (Eu-2)/d+1 1

    d-ária-criança(Eu,j)    retvocêrn d(Eu-1 1)+j+1 1

    Obviamente . Você pode verificar essas funções verificando se d-ário-pai ( d-ário-filho ( i , j ) ) = i1 1jdpai-d-ário(d-ária-criança(Eu,j))=Eu

    Também é fácil ver que a pilha binária é um tipo especial de pilha -ary onde d = 2 , se você substituir d por 2 , verá que elas correspondem às funções PARENT, LEFT e RIGHT mencionadas no livro.dd=2d2

  2. Se entendi sua resposta corretamente, você usa uma progressão geométrica . No seu caso, você começa , que é obviamente log d ( nh=euogd(nd-1 1+1 1)-1 1 , que de fato é uma solução válida e correta. Mas apenas para lidar com flutuações constantes, você pode querer escrever Θ ( log d ( n ) ) .registrod(nd)-1 1=registrod(n)+registrod(d)-1 1=registrod(n)+1 1-1 1=registrod(n)Θ(registrod(n))

    A razão para isto é que alguns montes não pode ser equilibrada, assim que seu caminho mais longo e caminho shorthest migt variam de acordo com alguma constante , usando Θ notação que eliminar este problema.cΘ

  3. Você não precisa reimplementar o procedimento fornecido no livro didático, mas deve alterá-lo um pouco, por exemplo, atribuindo todos os filhos à tabela usando as funções d-ário-pai e d-ário-filho .UMAvocêXpai-d-áriod-ária-criança

    Como o não foi alterado, depende do tempo de execução de MAX-HEAPIFY . Em sua análise, agora você deve usar o pior caso, proporcional à altura e ao número de filhos que cada nó deve examinar (que é no máximo d ). Mais uma vez, sua análise é muito precisa. No final, você obtém O ( d log d ( n ( d - 1 ) ) ) , que pode ser transformado em:EXTRACT-MAXMAX-HEAPIFYO(d registrod(n(d-1 1)))

    O(d registrod(n(d-1 1)))=O(d(registrod(n)+registro(d-1 1)))=O(d euogd(n)+d registrod(d-1 1))

    Por razões práticas, sempre podemos assumir que , para que possamos perder a parte d log d ( d - 1 ) da notação O , então obteremos O ( d log d ( n ) ) . O que também é uma solução válida. Mas não é de surpreender que você também possa analisar o tempo de execução das funções usando o teorema mestre , que mostrará que MAX-HEAPIFY não é apenas O, mas Θ .dndregistrod(d-1 1)O(dregistrod(n))MAX-HEAPIFYOΘ

  4. O livro CLRS já fornece o procedimento INSERT. Que se parece com isso:

    INSERIR(UMA,key)    UMA.heumap_sEuze=UMA.heumap_sEuze+1 1    UMA[UMA.heumap_sEuze]=-    CHAVE DE AUMENTO(UMA,UMA.heumap_sEuze,key)

    Pode ser facilmente comprovado, mas o senso comum exige que a complexidade do tempo seja . É porque o heap pode ser atravessado até a raiz.O(registrod(n))

  5. Assim como INSERT, INCREASE-KEY também é definido no livro como:

    CHAVE DE AUMENTO(UMA,Eu,key)    Euf key<UMA[Eu]        error"nova chave é menor que a atual"    UMA[Eu]=key    WhEueue Eu>1 1 umand UMA[Eu]>UMA[pai-d-ário(Eu)]        UMA[Eu]UMA[pai-mãe (i)]        Eu=pai-mãe (i)

    O(registrod(n))


obrigado! Que tal a implementação de INCREASE-KEY e INSERT? Eu tento escrever, mas deu duas vezes recursiva chamada de MAX-HEAPIFY. Existe uma solução melhor? Eu encontrei pouca informação na web e wiki
lucasKo

Isso é resto de exercício? Em caso afirmativo, atualize sua pergunta e teremos prazer em responder ao tema.
Bartosz Przybylski

Eu coloquei essas perguntas no post editado.
LucasKo

reimplantar o procedimento INSERT? Quer dizer, ele não precisa chamar o procedimento que ajusta a ordem dentro do heap, após inserir um novo elemento? Eu não entendo ...
lucasKo

Essa descrição foi um pouco infeliz, veja edições para esclarecimentos.
Bartosz Przybylski

1

h=euogd[nd-1 1+1 1]-1 1
1 1+d+d2+..+dh=ndh+1 1-1 1d-1 1=nh=euogd[n(d-1 1)+1 1]-1 1
h=Θ(registrod(n))

-1

A resposta para a segunda questão é h = log d (n (d-1) + 1) - 1 Então, h = log d (nd - n + 1) - 1


4
Por que essa é a resposta? Uma fórmula sem explicação realmente não ajuda ninguém.
David Richerby
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.