WEB开发网
开发学院软件开发数据结构 c语言算法 - 贪婪算法 - 二分覆盖 阅读

c语言算法 - 贪婪算法 - 二分覆盖

 2010-01-28 11:58:20 来源:WEB开发网   
核心提示:2.降低复杂性通过使用有序数组N e wi、最大堆或最大选择树(max selection tree)可将每步选取顶点v的复杂性降为( 1 ),但利用有序数组,c语言算法 - 贪婪算法 - 二分覆盖(3),在每步的最后需对N e wi 值进行重新排序,若使用箱子排序,N o d e Ty p e是一个具有私有整型成员l

2.降低复杂性

通过使用有序数组N e wi、最大堆或最大选择树(max selection tree)可将每步选取顶点v的复杂性降为( 1 )。但利用有序数组,在每步的最后需对N e wi 值进行重新排序。若使用箱子排序,则这种排序所需时间为(S i z e O f B ) ( S i z e O fB=|B| ) (见3 .8 .1节箱子排序)。由于一般S i z e O f B比S i z e O f A大得多,因此有序数组并不总能提高性能。

如果利用最大堆,则每一步都需要重建堆来记录N e w值的变化,可以在每次N e w值减1时进行重建。这种减法操作可引起被减的N e w值最多在堆中向下移一层,因此这种重建对于每次N e w值减1需( 1 )的时间,总共的减操作数目为O (e)。因此在算法的所有步骤中,维持最大堆仅需O (e)的时间,因而利用最大堆时覆盖算法的总复杂性为O (n2 )或O (n+e)。

若利用最大选择树,每次更新N e w值时需要重建选择树,所需时间为(log S i z e O f A)。重建的最好时机是在每步结束时,而不是在每次N e w值减1时,需要重建的次数为O (e),因此总的重建时间为O (e log S i z e OfA),这个时间比最大堆的重建时间长一些。然而,通过维持具有相同N e w值的顶点箱子,也可获得和利用最大堆时相同的时间限制。由于N e w的取值范围为0到S i z e O f B,需要S i z e O f B+ 1个箱子,箱子i 是一个双向链表,链接所有N e w值为i 的顶点。在某一步结束时,假如N e w [ 6 ]从1 2变到4,则需要将它从第1 2个箱子移到第4个箱子。利用模拟指针及一个节点数组n o d e(其中n o d e [ i ]代表顶点i,n o d e [ i ] .l e f t和n o d e [ i ] .r i g h t为双向链表指针),可将顶点6从第1 2个箱子移到第4个箱子,从第1 2个箱子中删除n o d e [ 0 ]并将其插入第4个箱子。利用这种箱子模式,可得覆盖启发式算法的复杂性为O (n2 )或O(n+e)。(取决于利用邻接矩阵还是线性表来描述图)。

3.双向链接箱子的实现

为了实现上述双向链接箱子,图1 - 9定义了类U n d i r e c t e d的私有成员。N o d e Ty p e是一个具有私有整型成员l e f t和r i g h t的类,它的数据类型是双向链表节点,程序1 3 - 3给出了U n d i r e c t e d的私有成员的代码。

void CreateBins (int b, int n)

创建b个空箱子和n个节点

void DestroyBins() { delete [] node;

delete [] bin;}

void InsertBins(int b, int v)

在箱子b中添加顶点v

void MoveBins(int bMax, int ToBin, int v)

从当前箱子中移动顶点v到箱子To B i n

int *bin;

b i n [ i ]指向代表该箱子的双向链表的首节点

N o d e Type *node;

n o d e [ i ]代表存储顶点i的节点

图1-9 实现双向链接箱子所需的U n d i r e c t e d私有成员

上一页  1 2 3 4 5  下一页

Tags:语言 算法 贪婪

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接