最初に、最大ヒープの概念について説明します。最大ヒープは、完全二分木で表されるデータ構造であり、以下の特性を持ちます:
- 任意のノードの値は、その子ノードの値以下である。
- ルートノードの値が最大である。
最大ヒープは、主に優先度キューやソートアルゴリズムなどで使用されます。
次に、最大ヒープを実装するためのJavaコード例を示します。
import java.util.Arrays;
public class MaxHeap {
private int[] heap;
private int size;
private int capacity;
public MaxHeap(int capacity) {
this.capacity = capacity;
this.size = 0;
this.heap = new int[capacity];
}
private int parent(int index) {
return (index - 1) / 2;
}
private int leftChild(int index) {
return 2 * index + 1;
}
private int rightChild(int index) {
return 2 * index + 2;
}
private void swap(int i, int j) {
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
private void heapifyUp(int index) {
if (index != 0 && heap[parent(index)] < heap[index]) {
swap(index, parent(index));
heapifyUp(parent(index));
}
}
private void heapifyDown(int index) {
int maxIndex = index;
int left = leftChild(index);
if (left < size && heap[left] > heap[maxIndex]) {
maxIndex = left;
}
int right = rightChild(index);
if (right < size && heap[right] > heap[maxIndex]) {
maxIndex = right;
}
if (index != maxIndex) {
swap(index, maxIndex);
heapifyDown(maxIndex);
}
}
public void insert(int value) {
if (size >= capacity) {
throw new IllegalStateException("Heap is full");
}
heap[size] = value;
heapifyUp(size);
size++;
}
public int extractMax() {
if (size == 0) {
throw new IllegalStateException("Heap is empty");
}
int max = heap[0];
heap[0] = heap[size - 1];
size--;
heapifyDown(0);
return max;
}
}
public class Main {
public static void main(String[] args) {
MaxHeap maxHeap = new MaxHeap(10);
maxHeap.insert(5);
maxHeap.insert(10);
maxHeap.insert(2);
System.out.println(maxHeap.extractMax()); // Output: 10
System.out.println(maxHeap.extractMax()); // Output: 5
System.out.println(maxHeap.extractMax()); // Output: 2
}
}
この例では、MaxHeap
クラスを作成し、最大ヒープを実現しています。insert
メソッドを使用して値を挿入し、extractMax
メソッドを使用して最大値を取得します。上記のコードを実行すると、出力結果として10、5、2が表示されます。
最後に、このコード例を使用して最大ヒープの原因を分析します。最大ヒープでは、ノードの挿入や最大値の取得に対して効率的な操作が可能です。ヒープの挿入では、ヒープ条件を満たすように要素を適切な位置に挿入します。最大値の取得では、常にルートノードが最大値となるため、高速に最大値を取得できます。