图着色算法详解

转载 2013年12月04日 22:11:39
图着色算法详解


图着色算法简介

       图的m-着色判定问题——给定无向连通图Gm种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

       图的m-着色优化问题——若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。


 

算法实现

算法描述:color[n]存储n个顶点的着色方案,可以选择的颜色为1到m。
当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。否则,依次对顶点t着色1-m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。

代码如下:

图着色算法的寄存器分配技术

    利用相交图(interference graph)来表示程序变量的生命期是否相交,将寄存器分配给变量的问题,可以近似地看成是给相交图着色:相交图中,相交的节点不能着同一颜色;每一种颜色对应一个寄存器。Chaitin等人最早提出了基于图着色的寄存器分配方法其着色思路采用了Kempe的着色方法,即,任意一个邻居节点数目少于k的节点,都能够被k着色。判断一个图是否能够被k(k>=3)种颜色着色,即k着色问题,被Karp证明是一个NP-complete问题。
 
    但是,寄存器分配不仅仅是图着色的问题。当寄存器数目不足以分配某些变量时,就必须将这些变量溢出到内存中,该过程成为spill。最小化溢出代价的问题,也是一个NP-complete问题。如果简化该问题——假设所有溢出代价相等,那么最小化溢出代价的问题,等价于k着色问题,仍然是NP-complete问题。
    此外,如果两个变量的生命期仅仅因为出现在同一个拷贝指令中而相邻,那么,通过将这两个变量分配到同一个寄存器,就可以消除该拷贝指令,成为coalescing。这个方向的努力在Chaitin的文章以后的1/4个世纪,成为推动寄存器分配的主要动力之一,涌现出了包括aggressive coalescing,conservative coalescing和optimistic coalescing。但是,将两个变量分配到同一个寄存器,等价于将这两个变量合并成同一个变量,生命期合并,因而会加剧相交图的聚簇现象,降低相交图的可着色性。Bouchez等人证明了目前的coalescing问题都是NP-complete的。
    为了降低相交图的聚簇现象,提高相交图的可着色性,可以通过将变量拷贝给一个临时变量,并将以后对该变量的使用替换成对该临时变量的使用,从而将一个变量的生命期分解成两个变量的生命期,称为live range splitting。显然,这是一个与coalescing的作用相反的过程。Bouchez等人考虑了该方法的复杂度。
    此外,寄存器分配还需要考虑寄存器别名(aliasing)和预着色(pre-coloring)的问题。寄存器别名是指,在某些体系结构中,一个寄存器的赋值可能会影响到另外一个寄存器。比如,在x86中,对AX寄存器的赋值,会影响AL和AH寄存器。预着色是指,某些变量必须被分配到特定的寄存器。比如,许多体系结构会采用特定寄存器来传递函数参数。
    George和Appel发展了Chaitin的算法,更好地考虑了coalescing过程和赋值过程,以及各过程之间的迭代,在基于图着色的寄存器分配方法中具有广泛的影响。

图着色算法详解

图着色算法详解 图着色算法简介        图的m-着色判定问题——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶...
  • chenglinhust
  • chenglinhust
  • 2013年06月20日 17:06
  • 7775

贪心算法求解 图的m着色问题

贪心算法求解 图的m着色问题 分类: C/C++ 数据结构/基础算法2013-03-29 19:45 1277人阅读 评论(2) 收藏 举报 图的m色判定问题: 给定无向连通图G和...
  • pi9nc
  • pi9nc
  • 2013年07月16日 09:36
  • 19252

回溯算法----图的M着色问题

问题: 给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,求有多少种方法。 邻接矩阵: 如下无向图结构和其邻接矩...
  • wutong_v
  • wutong_v
  • 2016年06月13日 19:07
  • 1925

使用颜色转换算法实现图像调色

在使用图像处理软件给图像调色时,我们通常会使用色彩平衡或曲线等功能,有时调来调去似乎总是不太满意。有没有一种方便、省事的方法,通过鼠标简单点选,就能将待处理的图片调成自己喜欢的某张图片色调呢?前几天浏...
  • u013085897
  • u013085897
  • 2014年01月02日 23:27
  • 3245

经典的基于图着色模型的寄存器分配

经典的基于图着色模型的寄存器分配: 1、如果变量(在指令/语句序列中,或称程序“基本块”?)不再被use(def也是use),则它dead 2、否则变量live(活着) 3、如果2个变量在一个...
  • cteng
  • cteng
  • 2016年05月07日 14:58
  • 1813

经典图着色算法作业

核心算法贴出来 package ore.lyt.edu.work; import java.io.BufferedReader; import java.io.File; import java.i...
  • u013510614
  • u013510614
  • 2016年01月14日 11:33
  • 280

Android 图片着色 Tint 详解

问题描述在app中可能存在一张图片只是因为颜色的不同而引入了多张图片资源的情况。比如一张右箭头的图片,有白色、灰色和黑色三种图片资源存在。所以我们可不可以只保留一张基础图片,在此图片基础上只是颜色改变...
  • JM_beizi
  • JM_beizi
  • 2017年02月07日 21:47
  • 3241

染色问题的算法

#include #define NUM 5 using namespace  std;   bool ok(int i,int b[],int a[NUM][NUM]) { f...
  • u013861473
  • u013861473
  • 2014年05月18日 19:22
  • 922

算法_10 : 图算法_5: 图的染色

待续
  • mijian1207mijian
  • mijian1207mijian
  • 2016年03月06日 21:19
  • 116

m-图着色问题(贪心解法)

problem 图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色。所需的最少颜色的数目m称为该图的色数。 图的m色判定问题: 给定无向连通图G和...
  • lime1991
  • lime1991
  • 2015年08月20日 11:55
  • 1966
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图着色算法详解
举报原因:
原因补充:

(最多只允许输入30个字)