1. 一些简单的实现
a. 可以用链表,在头以O(1)执行插入操作,并遍历该链表删除最小的元素,这需要O(n)的时间。或者是链表始终保持排序状态,插入的时间花费O(N),而删除最小元素需要的时间为O(1)。删除的操作次数不多于插入操作次数,应此前一种结构更好。
b. 二叉查找树, 删除和插入操作的时间都为O(logN)。但是会破坏树的平衡性。
2. 二叉堆
a. 堆是一棵完全二叉树(complete binary tree), 有可能的例外在底层,底层上的元素从左到右填入。
b. 一棵高为h的完全二叉树有2
h到2
h+1 - 1节点
。这意味着完全二叉树的高是log(N)。
c. 可以用一个数组把二叉堆映射到数组里面,i任意位置, 其左儿子是2i,右儿子是2i + 1。数组的0空着,放入最小的数据,例如MIN_INT。
-
// binheap.h
-
-
typedef int ElementType;
-
-
/* START: fig6_4.txt */
-
#ifndef _BinHeap_H
-
#define _BinHeap_H
-
-
struct HeapStruct;
-
typedef struct HeapStruct *PriorityQueue;
-
-
PriorityQueue Initialize( int MaxElements );
-
void Destroy( PriorityQueue H );
-
void MakeEmpty( PriorityQueue H );
-
void Insert( ElementType X, PriorityQueue H );
-
ElementType DeleteMin( PriorityQueue H );
-
ElementType FindMin( PriorityQueue H );
-
int IsEmpty( PriorityQueue H );
-
int IsFull( PriorityQueue H );
-
-
#endif
-
-
/* END */
-
// fatal.h
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
#define Error( Str ) FatalError( Str )
-
#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 )
阅读(553) | 评论(0) | 转发(0) |