The Algorithm Design Manual Second Edition



Download 5,51 Mb.
Pdf ko'rish
bet102/488
Sana31.12.2021
Hajmi5,51 Mb.
#273936
1   ...   98   99   100   101   102   103   104   105   ...   488
Bog'liq
2008 Book TheAlgorithmDesignManual

4.3.1

Heaps

Heaps are a simple and elegant data structure for efficiently supporting the priority

queue operations insert and extract-min. They work by maintaining a partial order

on the set of elements which is weaker than the sorted order (so it can be efficient

to maintain) yet stronger than random order (so the minimum element can be

quickly identified).

Power in any hierarchically-structured organization is reflected by a tree, where

each node in the tree represents a person, and edge (x, y) implies that directly

supervises (or dominates) y. The fellow at the root sits at the “top of the heap.”

In this spirit, a heap-labeled tree is defined to be a binary tree such that the

key labeling of each node dominates the key labeling of each of its children. In a



110

4 .


S O R T I N G A N D S E A R C H I N G

4

6



7

1

2



5

10

3



8

9

1941



2001

1918


1963

1804


1945

1865


1492

1783


1776

1783


2001

1941


1865

1918


1492

1804


1776

1945


1963

Figure 4.2: A heap-labeled tree of important years from American history (l), with the corre-

sponding implicit heap representation (r)

min-heap, a node dominates its children by containing a smaller key than they do,

while in a max-heap parent nodes dominate by being bigger. Figure

4.2

(l) presents



a min-heap ordered tree of red-letter years in American history (kudos to you if

you can recall what happened each year).

The most natural implementation of this binary tree would store each key in

a node with pointers to its two children. As with binary search trees, the memory

used by the pointers can easily outweigh the size of keys, which is the data we are

really interested in.

The heap is a slick data structure that enables us to represent binary trees

without using any pointers. We will store data as an array of keys, and use the

position of the keys to implicitly satisfy the role of the pointers.

We will store the root of the tree in the first position of the array, and its left

and right children in the second and third positions, respectively. In general, we

typedef struct {

item_type q[PQ_SIZE+1];

/* body of queue */

int n;

/* number of queue elements */



} priority_queue;

What is especially nice about this representation is that the positions of the

parent and children of the key at position are readily determined. The left child

of sits in position 2and the right child in 2+ 1, while the parent of holds

will store the 2

l

1

keys of the lth level of a complete binary tree from left-to-right

in positions 2

l

1

to 2


l

− 1, as shown in Figure

4.2(


r). We assume that the array

starts with index 1 to simplify matters.

court in position

k/2 . Thus we can move around the tree without any pointers.



4 . 3

H E A P S O R T : F A S T S O R T I N G V I A D A T A S T R U C T U R E S



111

pq_parent(int n)

{

if (n == 1) return(-1);



else return((int) n/2);

/* implicitly take floor(n/2) */

}

pq_young_child(int n)



{

return(2 * n);

}

So, we can store any binary tree in an array without pointers. What is the



catch? Suppose our height tree was sparse, meaning that the number of nodes

n < 2

h

. All missing internal nodes still take up space in our structure, since we must

represent a full binary tree to maintain the positional mapping between parents

and children.

Space efficiency thus demands that we not allow holes in our tree—i.e., that each

level be packed as much as it can be. If so, only the last level may be incomplete.

By packing the elements of the last level as far to the left as possible, we can

represent an n-key tree using exactly elements of the array. If we did not enforce

these structural constraints, we might need an array of size 2

n

to store the same

elements. Since all but the last level is always filled, the height of an element

heap is logarithmic because:



h



i=0

2

i

= 2


h+1

− ≥ n

so =



lg n .

This implicit representation of binary trees saves memory, but is less flexible

than using pointers. We cannot store arbitrary tree topologies without wasting

large amounts of space. We cannot move subtrees around by just changing a single

pointer, only by explicitly moving each of the elements in the subtree. This loss of

flexibility explains why we cannot use this idea to represent binary search trees,

but it works just fine for heaps.


Download 5,51 Mb.

Do'stlaringiz bilan baham:
1   ...   98   99   100   101   102   103   104   105   ...   488




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish