Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325567
  • 博文数量: 78
  • 博客积分: 2536
  • 博客等级: 少校
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-29 01:50
文章分类

全部博文(78)

文章存档

2011年(1)

2010年(17)

2009年(52)

2008年(8)

我的朋友

分类: C/C++

2009-10-10 22:20:49

我曾一直肤浅的认为贪心算法是没有什么理论基础来支撑的,是有局部最优解而导致可能的整体最优解,可是最近看了拟阵和贪心的相关,才知道,拟阵理论是贪心策略的理论基础.....

拟阵

拟阵是满足下列条件的一个序对M=(S,I);

1)S是一个有穷的集合。

2)I是S的一类具有遗传性质的非空子集族。遗传性质定义为:如果B∈I且A⊂B,那么A∈I。即若B∈I,则B是S的独立子集(独立子集的定义),且B的任意子集也都是S的独立子集。空集必为I的成员。注意,I是集合的集合。

3)I满足交换性质。交换性质定义为,若A∈I,B∈I且|A|<|B|,则存在某一元素x∈B-A,使得A∪{x}属于I。(这条性质给了我们已知集合B,构造集合A的方法。而性质2暗示了我们已知集合B,找出其子集的性质的办法)

下面是一个拟阵的例子:

无向图G=(V,E)的拟阵,定义为M[G]=(S[G],I[G])。

*集合S[G]定义为E,即G的边集。

*如果A是E的子集,而且A是无回路的,则A属于IG。亦即,一组边A是独立的当且仅当子图G[A]=(V,A)构成了一个森林。

下面证明M[G]是一个拟阵

1)显然S[G]=E是一个有穷集合。

2)I[G]是遗传的。对于任意的B∈I[G],A⊂B,边集A都∈I[G],原因是从无环的一组边中去掉一些边并不会产生出回路。

3)具有k条边的森林恰好包含|V|-k棵树。若G[A]=(V,A)和G[B]=(V,B)是G的森林,且|B|>|A|,则G[A]中有|V|-|A|棵树,G[B]中有|V|-|B|棵树。由于G[B]中的树比G[A]中的树要少,必有边e(u,v)∈G[B],!∈G[A]而且连接G[A]中的两棵树。将e添加进A,不会产生回路。A∪{e}∈I。

命题得证。

给定拟阵M=(S,I),对于I中的独立子集A∈I,若S有一元素x!∈A,使得将x加入A中仍保持独立性,即A∪{x}∈I,则称x为A的可扩展元素。当拟阵M中的独立子集A没有可扩展元素时,即A不被M中别的独立子集所包含时。称A为极大独立子集。类似于极大线性无关组的证明,所有的极大独立子集具有相同的势。

若对拟阵M=(S,I)中的S指定权函数W,使得对于任意x∈S,有W(x)>0,则称拟阵M为带权拟阵。依此权函数,对于S的子集A有W(A)=Σ(x∈A)W(x)。

适宜用贪心方法获得最优解的许多问题,都可以归结为在加权矩阵中找出一个具有最大权值的独立子集问题。因为任意元素的权值都是正的,故找出的最优子集同时也是最大子集。下面是求带权拟阵最优子集的贪心算法。

GREEDY( M , W )

A<-空集

将S中的元素按照权值W大优先组织成一个优先队列。

While ( S不为空 )

   x = GetMax( S ) ;

    if ( A ∪ {x} ∈ I)

     A = A ∪ {x} ;

return A

这个算法排序的时间为O(NlogN),共判断N次,设判断复杂度为f(N),则整个算法运行时间为O(NlogN+Nf(N))

下面证明算法GREEDY返回的是一个最优子集。

引理1(拟阵具有贪心选择性质)

假设M=(S,I)是一个具有权函数W的加权拟阵,且S被按权值的单调减顺序排列。设x是S的第一个使{x}独立的元素。如果x存在,则存在S的一个包含x的最优子集A

引理2 设M=(S,I)为任意一个拟阵。如果x是S的任意元素,是S的独立子集A的一个可扩展元素,那么x也必然是空集的一个可扩展元素。

推论 设M=(S,i)为任意一个矩阵。如果x不是空集的可扩展元素,那么x也不会是S的任意独立子集A的一个可扩展元素。(这个推论说明了任何元素如果不能被立即用到,则以后也绝不会被用到。所以,在开始时,对S中的那些不是空集的可扩展元素的略过没有漏掉解)

引理3(拟阵具有最优子结构性质)

设x为S中被作用于加权拟阵M=(S,I)的GREEDY算法第一个选择的元素。找一个包含x的具有最大权值的独立子集问题,可以化归为找出加权矩阵M'=(S',I')的一个具有最大权值的独立子集问题,此处

S'={y∈S|{x,y}∈I}

I'={B⊂S-{x}|B∪{x}∈I}

其中,M'权函数为受限于S'的M的权函数(即M的由x引起的收缩)。

故可得定理,GREEDY返回最优子集。

首先,开始时被略去的不是空集的元素不予考虑(推论)。一旦选择了第一个元素x,将它加入A是正确的(引理1)。最后,余下的问题就是一个在M的由x引起的收缩M'中寻找一个最优子集问题(引理3)。在过程GREEDY将A置为{x}后,余下的各步骤都可解释为是在拟阵M'=(S',I')中进行的。因为B在M'中是独立的,当且仅当B∪{x}在M中是独立的,其中B为任意属于I'的集合。这样,GREEDY的后续操作就会找出M'中的一个具有最大权值的独立子集。而GREEDY的全部操作就可找出M的一个具有最大权值的独立子集。

应用拟阵思想,便可建立了贪心策略的理论基础,还好,终于对贪心有了更新的认识...

阅读(1141) | 评论(0) | 转发(0) |
0

上一篇:epoll机制

下一篇:Linux下core文件调试方法

给主人留下些什么吧!~~