두 갈래 로 된 더미
8888 단어 데이터 구조
부모 노드 의 키 값 이 항상 키 노드 의 키 값 보다 크 거나 같 을 때 최대 더미 입 니 다.부모 노드 의 키 값 이 항상 하위 노드 의 키 값 보다 작 거나 같 을 때 최소 더미 입 니 다.
중점: 1. 저장 방식, 결점 과 그의 아버지 노드 아이 노드 의 위치 관 계 는 보통 배열 로 표시 합 니 다.만약 에 뿌리 노드 가 배열 에 있 는 위치 가 1 이 라면 n 번 째 위치의 서브 노드 는 각각 2n 과 2n + 1 이다.따라서 첫 번 째 위치의 하위 노드 는 2 와 3 이 고 두 번 째 위치의 하위 노드 는 4 와 5 이다.이런 식 으로 유추 하 다.1 을 기반 으로 하 는 배열 저장 방식 은 부모 노드 와 하위 노드 를 찾 는 데 편리 하 다.만약 에 저장 배열 의 아래 표 시 는 0 을 바탕 으로 한다 면 아래 표 시 된 i 노드 의 하위 노드 는 2i + 1 과 2i + 2 이다.그 아버지 노드 의 아래 표 지 는 * 8970 ° (i - 1) * 8725 ° 2 * 8971 ° 이다.
2. 노드 를 삽입 할 때 띄 우기 동작 은 배열 의 맨 끝 에 새 노드 를 삽입 합 니 다.그리고 아래 에서 전체 노드 와 부모 노드 를 올 리 고 시간 복잡 도 Olog (n);3. 노드 를 삭제 할 때 침하 작업 은 최대 더미 에 대해 루트 노드 를 삭제 하 는 것 이 최대 치 를 삭제 하 는 것 입 니 다.최소 더미 에 대해 서 는 최소 값 을 삭제 합 니 다.그리고 쌓 아 올 린 마지막 노드 를 뿌리 노드 에 채 워 넣 으 세 요.위 에서 아래로 부모 노드 와 하위 노드 를 조정 합 니 다.
4. 난서 배열 을 쌓 아 올 리 고 복잡 도 는 O (N) 이다.
#include
#include
#include
#include
#include
using namespace std;
template <class T>
class BinaryHeap
{
public:
BinaryHeap();
BinaryHeap(const vector &v);
bool isEmpty() const{ return mSize == 0; }
int size() const{ return mSize ; }
const T& findMin() const;
void insert(const T& x);
void deleteMin();
void makeEmpty();
private:
int mSize;
vector array;
void buildHeap();
void perColateDown(int hole);
};
template<class T>
BinaryHeap::BinaryHeap() :array(12), mSize(0)
{
}
template<class T>
BinaryHeap::BinaryHeap(const vector &v) :array(v.size() + 1), mSize(v.size())
{
for (int i = 0; i < (int)v.size(); i++)
{
array[i + 1] = v[i];
}
buildHeap();
}
template<class T>
const T& BinaryHeap::findMin() const
{
if (isEmpty())
throw string("error");
return array[1];
}
template<class T>
void BinaryHeap::insert(const T&x)
{
if (mSize + 1 == array.size())
{
array.resize(2 * mSize + 1);
}
//
int position = ++mSize;
array[0] = x;// x 0
while (x < array[position / 2])
{
array[position] = array[position / 2];
position /= 2;
}
array[position] = x;
}
template<class T>
void BinaryHeap::deleteMin()
{
if (!isEmpty())
{
array[1] = array[mSize--];
perColateDown(1);
}
}
template<class T>
void BinaryHeap::perColateDown(int position)
{
// position
int child = 0;
T temp = array[position];
for (; position * 2 <= mSize; position = child)
{
child = position * 2;
if (child != mSize && array[child + 1] < array[child])
{
child++;
}
if (array[child] < temp)
{
array[position] = array[child];
}
else break;
}
array[position] = temp;
}
template<class T>
void BinaryHeap::buildHeap()
{
// perColateDown , i ,
// 。
for (int i = mSize / 2; i > 0; --i)
{
perColateDown(i);
}
}
int main()
{
vector<int> v = { 1, 4, 8, 9,1,1,8,7, 4, 3, 2, 4 };
BinaryHeap<int> Bh;
for_each(v.begin(), v.end(), [&](int a){Bh.insert(a); });
while (!Bh.isEmpty())
{
cout << Bh.findMin() << endl;
Bh.deleteMin();
}
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.