The Algorithm Design Manual Second Edition


Stop and Think: Who’s where in the heap?



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

Stop and Think: Who’s where in the heap?

Problem: How can we efficiently search for a particular key in a heap?

Solution: We can’t. Binary search does not work because a heap is not a binary

search tree. We know almost nothing about the relative order of the n/2 leaf ele-

ments in a heap—certainly nothing that lets us avoid doing linear search through

them.



112

4 .


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

4.3.2

Constructing Heaps

Heaps can be constructed incrementally, by inserting each new element into the

left-most open spot in the array, namely the (+ 1)st position of a previously

n-element heap. This ensures the desired balanced shape of the heap-labeled tree,

but does not necessarily maintain the dominance ordering of the keys. The new

key might be less than its parent in a min-heap, or greater than its parent in a

max-heap.

The solution is to swap any such dissatisfied element with its parent. The old

parent is now happy, because it is properly dominated. The other child of the old

parent is still happy, because it is now dominated by an element even more extreme

than its previous parent. The new element is now happier, but may still dominate

its new parent. We now recur at a higher level, bubbling up the new key to its

proper position in the hierarchy. Since we replace the root of a subtree by a larger

one at each step, we preserve the heap order elsewhere.

pq_insert(priority_queue *q, item_type x)

{

if (q->n >= PQ_SIZE)



printf("Warning: priority queue overflow insert x=%d\n",x);

else {


q->n = (q->n) + 1;

q->q[ q->n ] = x;

bubble_up(q, q->n);

}

}



bubble_up(priority_queue *q, int p)

{

if (pq_parent(p) == -1) return; /* at root of heap, no parent */



if (q->q[pq_parent(p)] > q->q[p]) {

pq_swap(q,p,pq_parent(p));

bubble_up(q, pq_parent(p));

}

}



This swap process takes constant time at each level. Since the height of an n-

element heap is



lg n , each insertion takes at most O(log n) time. Thus an initial

heap of elements can be constructed in O(log n) time through such insertions:

pq_init(priority_queue *q)

{

q->n = 0;



}


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



113

make_heap(priority_queue *q, item_type s[], int n)

{

int i;


/* counter */

pq_init(q);

for (i=0; i

pq_insert(q, s[i]);

}


Download 5,51 Mb.

Do'stlaringiz bilan baham:
1   ...   99   100   101   102   103   104   105   106   ...   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