Lecture 12
This presentation is the property of its rightful owner.
Sponsored Links
1 / 30

Main Index PowerPoint PPT Presentation


  • 65 Views
  • Uploaded on
  • Presentation posted in: General

Lecture 12 – Heaps, Priority_queue, Huffman Tree. 1. Main Index. Contents. Complete Binary Tree Example Maximum and Minimum Heaps Example Heap Insertion Example pushHeap() Example popHeap() Example Adjusting popHeap() Example Heapifying Example Heap Sort Example Huffman Tree. 2.

Download Presentation

Main Index

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Main index

Lecture 12

– Heaps, Priority_queue, Huffman Tree

1

Main Index

Contents

  • Complete Binary Tree Example

  • Maximum and Minimum Heaps Example

  • Heap Insertion Example

  • pushHeap() Example

  • popHeap() Example

  • Adjusting popHeap() Example

  • Heapifying Example

  • Heap Sort Example

  • Huffman Tree


Example of complete binary tree for a vector

2

Main Index

Contents

Example of Complete Binary Tree for a Vector


Maximum and minimum heaps example

3

Main Index

Contents

Maximum and Minimum Heaps Example


Example of heap before and after insertion of 50

4

Main Index

Contents

Example of Heap Before and After Insertion of 50


Example of reorder the tree in pushheap

Example of Reorder the tree in pushHeap()


Pushheap

pushHeap

template <typename T, typename Compare>

void pushHeap(vector<T>& v, int last, Compare comp)

//compare为”>”,得到的堆是最大堆,否则是最小堆

{int currentPos, parentPos;

T target;

currentPos = last-1;

parentPos = (currentPos-1)/2;

target = v[last-1];

while (currentPos != 0)

{if (comp(target,v[parentPos]))//if true, 边交互边向上比较

{v[currentPos] = v[parentPos];

currentPos = parentPos;

parentPos = (currentPos-1)/2;

}

elsebreak;

}

v[currentPos] = target;

}


Example of exchanging elements in popheap

Example of Exchanging elements in popHeap()


Example of adjusting the heap for popheap

8

Main Index

Contents

Example of Adjusting the heap for popHeap()


Pop adjustheap

Pop--AdjustHeap

template <typename T, typename Compare>

void adjustHeap(vector<T>& v, int first, int last, Compare comp)//”>”

{int currentPos, childPos;

T target;

currentPos = first;

target = v[first];

childPos = 2 * currentPos + 1;

while (childPos <= last-1)

{if ((childPos+1 <= last-1) && comp(v[childPos+1], v[childPos]))

childPos = childPos + 1;

if (comp(v[childPos],target))

{v[currentPos] = v[childPos];

currentPos = childPos;

childPos = 2 * currentPos + 1;}

elsebreak;

}

v[currentPos] = target;

}


Popheap

popHeap

template <typename T, typename Compare>

void popHeap(vector<T>& v, int last, Compare comp)

{

T temp;

temp = v[0];

v[0] = v[last-1];

v[last-1] = temp;

adjustHeap(v, 0, last-1, comp);

}


Heap sort

Heap sort

#include <iostream>

#include <vector>

#include "d_heap.h"

#include "d_util.h"

using namespace std;

int main()

{ int arr[] = {5, 9, 2, 7, 1, 3, 8};

int i, arrSize = sizeof(arr)/sizeof(int);

vector<int> vA, vB;

for (i = 0; i < arrSize; i++)//建堆

{vA.push_back(arr[i]);

pushHeap(vA, vA.size(), greater<int>());

vB.push_back(arr[i]);

pushHeap(vB, vB.size(), less<int>());

}

cout << "Maximum heap: ";


Example of implementing heap operation

Example of Implementing heap operation

while (!vA.empty())

{popHeap(vA, vA.size(), greater<int>());

cout << vA.back() << " ";

vA.pop_back();

}

cout << endl;

cout << "Minimum heap: ";

while (!vB.empty())

{popHeap(vB, vB.size(), less<int>());

cout << vB.back() << " ";

vB.pop_back();

}

cout << endl;

return 0;

}


Heapified tree

堆序化(Heapified Tree)

int arr[] = {50, 20, 75, 35, 25};

vector<int> v(arr, 5);


Heapified tree1

14

Main Index

Contents

Heapified Tree


Example of heapifying a vector

Example of Heapifying a Vector


Heapifying a vector

16

Main Index

Contents

Heapifying a Vector


Makeheap

MakeHeap

template <typename T, typename Compare>

void makeHeap(vector<T>& v, Compare comp)

{

int heapPos, lastPos;

lastPos = v.size();

heapPos = (lastPos - 2)/2;

while (heapPos >= 0)

{

adjustHeap(v,heapPos, lastPos, comp);

heapPos--;

}

}


Example of implementing heap sort

Example of Implementing heap sort

template <typename T, typename Compare>

void heapSort (vector<T>& v, Compare comp)

{

makeHeap(v, comp);

int i, n = v.size();

for(i = n; i > 1;i--)

{

popHeap(v, i, comp);

}

}


Priority queue stl

Priority_queue(STL)

template <typename T, typename Compare = greater<T> >

class miniPQ

{

public:

miniPQ();

int size() const;

bool empty() const;

void push(const T& item);

void pop();

T& top();

const T& top() const;

private:

vector<T> pqList;

Compare comp;

};


Priority queue

Priority_queue

miniPQ<int>pqMax;

miniPQ<int, less<int>> pqmin;

template <typename T, typename Compare>

void miniPQ<T,Compare>::pop()

{

if (pqList.empty())

throw underflowError("miniPQ pop(): empty list");

popHeap(pqList, pqList.size(), comp);

pqList.pop_back();

}


Priority queue1

Priority_queue

#include <iostream>

#include <queue>

using namespace std;

Void main ()

{ priority_queue<int, vector<int>, less<int> > ipq;

priority_queue<int, vector<int>, greater<int> > gipq;

priority_queue<int, vector<int> > pq;

ipq.push(100); ipq.push(200); ipq.push(300);

gipq.push(100); gipq.push(200); gipq.push(300);

pq.push(100); pq.push(200); pq.push(300);

cout << "size of priority_queue ipq = " << ipq.size() << endl;

cout << "ipq <int,vector<int>, less<int> > = ";

while ( !ipq.empty() ) {

cout << ipq.top() << " ";

ipq.pop();}

}

//ipq <int,vector<int>, less<int> > = 300 200 100

//gipq <int,vector<int>, greater<int> > = 100 200 300

//pq <int,vector<int> > = 300 200 100


Huffman tree

Huffman Tree

Huffman Tree

哈夫曼编码:1952年由D.A.Huffman提出,用来构建满足立刻可解码性,即非前缀编码。

有损压缩(Lossy compression)

无损压缩(Lossless compression)


Lossless compression

23

Main Index

Contents

Lossless Compression

  • data compression loses no information

  • original data can be recovered exactly from the compressed data.

  • normally apply to "discrete" data, such as text, word processing files, computer applications, and so forth


Lossy compression

Lossy Compression

  • loses some information during compression and the data cannot be recovered exactly

  • shrink the data further than lossless compression techniques.

  • Sound files often use this type of compression,


Huffman compression

Huffman Compression

1.Prefix codes(optimal binary codes, minimal cost)

2.greedy algorithm

Example:

(16(3)+4(3)+8(3)+6(3)+20(3)+3(3))*1000=171000 bits

171000/8=21375 bytes

(16(8)+4(8)+8(8)+6(8)+20(8)+3(8))*1000/8=57000 bytes

21375/57000=62.5%

57000/21375=2.67(compression ration)


Building huffman tree

26

Main Index

Contents

Building Huffman Tree


Building huffman tree cont

27

Main Index

Contents

Building Huffman Tree (Cont…)


Building huffman tree cont1

Building Huffman Tree (Cont…)


Building huffman tree cont2

29

Main Index

Contents

Building Huffman Tree (Cont…)


Huffman compression1

Huffman Compression

(16(2)+4(4)+8(2)+6(3)+20(2)+3(4))*1000=134000 bits

134000/8=16750

57000/16750=3.4(compression ration)

Huffman算法创建最优二叉树,可产生最优前缀码,也称做最小成本树。

Huffman树的成本(也可称期望长度)

Cost=w1*l1+w2*l2……+wk*lk

Cost=4*3+4*4+6*3+8*2+16*2+20*2=134


  • Login