2011-06-28 19 views
1

さまざまなヒープ操作があり、同じ操作にはさまざまな名前が付けられています。異なるヒープ操作によって実際にはどういう意味ですか?

私は名前とエイリアスに圧倒される。

は、したがって、次のヒープ操作の違い/類似点/関係はどのようなものがあり、明確にしてください:

(1) Heapify 
(2) Insert 
(3) Delete 
(4) Shift-up 
(5) Shift-down 

例えば、いくつかのリソースは、シフトダウンを使用してヒープソートの実装について話します。一部はHeapifyを使用して同じアルゴリズムを実装しました。いくつかは、Deleteを使用して実装しました。

答えて

3

1)Heapifyは、ヒープの状態を復元します。たとえば、ツリー内のノードを変更した場合、条件はもはや有効ではありません。ノードをツリーの上または下に移動すると、条件を復元できます。

2)(ヒープ条件に応じ限り、必要に応じて、ツリー内のノードを上に移動)ツリー

4内のノードを削除)ツリー

3にノードを挿入:分-heapまたは最大ヒープ)

5)は4に似たツリーでノードを下に移動)

あなたが実際のコードを実装したり、理解しようと命名心配していない場合、それはおそらく最高です。 。

0

@ duedl0rで答えるノートを追加するには、現在の構造をheapifyするためにどのシフトアップとシフトダウンが使用されているのですか?だから例えば。最小ヒープの場合、ツリー内のいくつかのノードよりも小さい要素を挿入すると、データ構造はヒープ条件に従わなくなります(最小ヒープの場合、親の値はその子よりも小さくなければなりません)。あなたは上下にシフトする必要があります。コードの点ではそう

public void insert(int value) { 
    if (heapSize == data.length) 
     throw new HeapException("Heap's underlying storage is overflow"); 

    else { 
     heapSize++; 
     data[heapSize - 1] = value; 
     siftUp(heapSize - 1); 
    } 

}  

private void siftUp(int nodeIndex) { 
    int parentIndex, tmp; 
    if (nodeIndex != 0) { 
     parentIndex = getParentIndex(nodeIndex); 
     /*if parent index data is more than child data, swap*/ 
     if (data[parentIndex] > data[nodeIndex]) { 
      tmp = data[parentIndex]; 
      data[parentIndex] = data[nodeIndex]; 
      data[nodeIndex] = tmp; 
      siftUp(parentIndex); 
     } 
    } 

} 

データは、ヒープをresempleする配列で、HEAPSIZEは新しい要素が格納される現在の場所である、そしてそれは、このくらいのヒープがいっぱいであることを伝えます。

同様に、削除する場合は、シフトダウンを使用してヒープを再構成する必要があります。

関連する問題