例析位运算在算法优化中的应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
例析位运算在算法优化中的应用

精品论文 参考文献 例析位运算在算法优化中的应用 钟川麟 福建省龙岩市武平一中 364300   在冯诺依曼计算机中,所有的数据和指令都是以二进制的形式存储、运算的。直接对内存中的二进制位进行操作,就称为“位运算”,位运算直接对内存数据进行操作,不需要转成十进制,所以处理速度非常快。下面通过一道例题,分析位运算的应用。   常见的逻辑运算有与、或、非、异或等等, pascal语言位运算符号有and、or、not、xor,相应的c语言位运算符号是amp;、|、~、^等等,实际编程中还常常关注shl和shr运算。这里需要先明确一下编译器对这些运算符号的处理原则,如果运算符两端是逻辑型变量,执行的是逻辑运算,如果运算符两端是整型变量,执行的就是位运算。   例题:平板涂色paint   CE数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。   为了涂色,APM需要使用一组刷子,每个刷子涂一种不同的颜色。为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色。例如图中矩形F必须在C和D涂色后才能涂色。注意,每一个矩形必须立刻涂满,不能只涂一部分。写一个程序求一个使APM拿起刷子次数最少的涂色方案。注意,如果一把刷子被拿起超过一次,则每一次都必须记入总数中。   【输入文件】第一行为矩形的个数N。下面有N行描述了N个矩形。每个矩形有5个整数描述,左上角的y坐标和x坐标,右下角的y坐标和x坐标,以及预定颜色。颜色号为1到20的整数。平板的左上角坐标总是(0, 0)。坐标的范围是0.99。N小于16。   【输出文件】只有一个数,即拿起刷子的最少次数。   【输入输出样例】   paint.in   7   0 0 2 2 1   0 2 1 6 2   2 0 4 2 1   1 2 4 4 2   1 4 3 6 1   4 0 6 4 1   3 4 6 6 2   paint.out    3   解题思路:平板划分成n个区域,请用最少的换刷子次数把平板涂成预定的颜色。涂色时要注意:当某一个区域“正上方”的所有区域都涂完之后才可以涂色。问题的实质,就是确定n个区域的先后涂色顺序。因为不同的顺序需要换刷子的次数是不同的,所以如何选择涂色顺序就是解决问题的关键了。我们不妨按下面方法来涂色:1.平板第一行的区域是可以直接涂色的,枚举从第一行的某个区域i出发;2.接着寻找一个没有涂色(且可以涂色)的区域k继续,如果k区域的颜色要求与i相同则不换刷子,反之如果k区域的颜色要求与i不相同则计算换刷子次数+1;3.递归执行第②步,直到所有区域都涂完色之后得到一种可行解;4.回溯,重复②、③步得到另一种可行解;5.对比所有可行解,得出问题的最优解。 因此,采用浓度优先搜索,或回溯算法都能实现。   实现算法的瓶颈:在搜索过程中,需要反复地判断某一个区域有没有涂色?或者可不可以涂色?这两个问题是回溯算法执行过程额外开销的,我们要尽量减少这些开销,克服实现算法的瓶颈。   为了方便状态的表示和扩展,我们需要先对平板进行“数字化”处理,对于n个区域的平板不妨采用n位的二进制数表示:没有涂色的区域用数字为0表示,涂色之后就修改为1。那么平板的初始状态就是n个0,最终状态就是n个1。而且平板的任何一种状态都对应着0~2n-1之间的一个整数。   平板经过“数字化”之后,位运算就派上用场了,比如当前状态为state,判断该状态下第i个区域是否涂色只需要判断state and (1 shl (i-1))是否等于0,而在此状态下将某区域i涂色也只需执行state or (1 shl(i-1))。利用这两条简单而快捷的位运算语句去实现上面分析的搜索算法,效率是非常明显的,是一种事半功倍的举措。   【数据结构】   map:array[0..16,1..4] of integer;{各区域的坐标}   col:array[0..16] of integer;{平板的涂色要求}   basd:array[0..16] of integer;{存储2的n次方}   g:array[0..16,0..16] of boolean;{g[i,j]=true表示区域i必须在区域j之前涂色}   f:array[0..16,0..65555] of integer;{f[i,j]:平板状态为j,涂完第i个区域需要的最少换刷子次数}   参考算法:   procedure search(k,state:longint);{当平板状态为state时,搜索第k个区域涂什么颜色}   var i,newstate,temp:longint;begin    if f[k,state]gt;0

文档评论(0)

xyz118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档