ヒップホップ
★お尻
HIPは完全なバイナリツリーに基づくデータ構造で、最低価格と最高価格を迅速に検索することを目的としています.
お尻には最大お尻(max heap)と最小お尻(minheap)があります.親ノードが子ノードより大きい場合は最大ヒップ、逆に最小ヒップです.最大の数字をルートディレクトリに表示するには、最大のお尻からでも、最小のお尻からでもかまいません.
種類
parent > children ⇒ MAX HEAP
parent < children ⇒ MIN HEAP
高さの計算
log 2(n+1)−1 log 2(n+1)−1 log 2(n+1)−1はheightと一致するため、ツリーにどれだけの要素があるかを知ることでツリーの高さを計算することができる.
追加と削除
お尻に新しいデータを追加または削除する場合は、お尻のルールを守らなければなりません.最大ヒップは、親ノードが子ノードより大きくなければならないことを示し、最小ヒップは子ノードが親ノードより大きくなければならないことを示します.
インプリメンテーション
// 힙 배열
E[] array = (E[]) new Object[size];
// 마지막 요소 위치 기록
int lastposition;
// 힙 원소 추가
public void add(E obj) {
array[++lastposition] = obj; // 1. 노드 추가
trickleup(lastposition); // 2. trickle up
}
// 힙 원소 교환
public void swap(int f, int t) {
E tmp = array[f];
array[f] = array[t];
array[t] = tmp;
}
// 힙 자식과 부모 크기 비교해서 정렬
public void trickleup(int position) {
if (position == 0)
return;
int parent = (int) Math.floor((position-1)/2)
if (((Comparable<E>) array[position]).compareTo(array[parent])>0) {
swap(position, parent);
trickleup(parent);
}
}
// 힙 원소 삭제
public E remove() {
E tmp = array[0];
// 마지막 인덱스를 줄여주어 실제 삭제한 값은 존재하지만 힙의 일부로 생각 안한다.
swap(0, lastposition--);
trickleDown(0);
return tmp;
}
public void trickleDown(int parent) {
int left = 2 * parent + 1;
int right = 2 * parent + 2;
// 마지막에 왼쪽 자식이 클 때
if (left == lastposition && array[parent] < array[left]) {
swap(parent, left)
return;
}
// 마지막에 오른쪽 자식이 클 때
if (right == lastposition && array[parent] < array[right]) {
swap(parent, right)
return;
}
// 마지막에 부모가 클 때
if (left >= lastposition || right >= lastposition)
return;
// 왼쪽 자식이 클 때 혹은 오른쪽 자식이 클 때
if (array[left] > array[right] && array[parent] < array[left]) {
swap(parent, left);
trickleDown(left);
} else if (array[parent] < array[right]) {
swap(parent, right);
trickleDown(right);
}
}
ノードの位置には、次の性質があります.children:(2∗parent)+1children: (2 * parent) + 1children:(2∗parent)+1 or (2∗parent)+2(2 * parent) + 2(2∗parent)+2
parent:floor((child−1)/2)parent: floor((child-1)/2)parent:floor((child−1)/2)
お尻の位置合わせ
hip規則に従って数字を並べ替えるプロセスをhip並べ替えアルゴリズムと呼ぶ.ランダムな順番の数字をお尻にしてお尻から1つ抜いてください最大値または最小値の順に減少するため、自動的にソートされます.
時間的複雑度は,データを入れる際の性能がO(logn)O(logn)O(logn)であり,減算する際の性能がO(logn)O(logn)O(logn)であることを示す.すべてのN個のデータを除いて並べ替えを行うため、臀部並べ替えの時間的複雑度はO(N87 logn)O(N*logn)O(N87 logn)である.
Reference
この問題について(ヒップホップ), 我々は、より多くの情報をここで見つけました https://velog.io/@shiningcastle/힙Heapテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol