アルゴリズムとデータ構造(7)スタック

ヒープ

ヒープの二つの特徴があります。

  1. 配列によって表される完全二分木
  2. いずれかの単語の鍵(ルート)ノードは、すべてのノードのすべてのサブツリーの最大値(最大値)であります
  3. 最大ヒープ:最大、図。ここに画像を挿入説明
  4. 最小スタック:最小、図。ここに画像を挿入説明
  5. 特徴:整然としたパスここに画像を挿入説明
  6. プライオリティキューを達成する目的ではなく、インサートの配列よりも、要素の優先度を削除します。

インサートは理解:親ノードと比較して、アレイの端部を挿入する最も完全な二分木を表現、および、交換位置より大きい、より大きい未満ブレーク以上です。

理解削除:削除図マックスすなわち素子1インデックス=

  1. あるいは要素インデックス= 1、それ最も端に取って代わるの最後の要素。
  2. デジタル調整最後方位置;としては、図示しました。ここに画像を挿入説明ここに画像を挿入説明
public class Heap {
    int[] elements; //存储数组
    int size;    //当前元素数量
    int capacity; //最大容量

    public Heap(int capacity) {
        this.capacity = capacity;
        elements = new int[capacity + 1]; //从index =1 开始存储, 0 为稍定
        elements[0] = Integer.MAX_VALUE;
        size = 0;
    }

    public void insert(int element) {
        if (isFull()) throw new RuntimeException("full");
        int index = ++size; // 实际存储从1 开始存入数组;
        for (; elements[index / 2] < element; index /= 2) {
            elements[index] = elements[index / 2];
        }
        elements[index] = element;
    }

    public int deleteMax() {
        if (isEmpty())
            throw new RuntimeException("empty");
        int maxItem = elements[1];
        int temp = elements[size--];
        int parent = 1;
        for (int child = 0; parent * 2 < size; parent=child) {
            child = parent*2;
            if (parent!=size && elements[child]<elements[child+1])
                child++;
            if (temp>elements[child]) break;
            else
                elements[parent] = elements[child];
        }
        elements[parent] = temp;
        return maxItem;
    }
}

センチネルの意味

センチネルiが時間= 1、最大値、挿入方法をとり、I / 2 = 0、要素[I] = MAX_INT、効率を増大させることができるforループ。

設立のヒープ

ここに画像を挿入説明
:考えはことを理解
することを、アレイ(完全二分木)は、図のスタックではなく、最終的にゆっくりと考えを使用してヒープを構築することから徐々にノードに、最大値/最小値を見つけるために調整、削除した場合フレームワークは、最大ヒープ/スタック最小とすることができます。

公開された17元の記事 ウォンの賞賛0 ビュー366

おすすめ

転載: blog.csdn.net/qq_32193775/article/details/104115268
おすすめ