算法中的初始化0x3f

算法中的初始化0x3f写算法的时候,我们常常需要用到设置一个常量用来代表“无穷大”,比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大。但是以INT_MAX为无穷大常常面临一个问题,即加一个其他的数会溢出。而这种情况在动态规划,或者其他一些递推的算法中常常出现,很有可能导致算法出问题。

大家好,欢迎来到IT知识分享网。算法中的初始化0x3f

写算法的时候,我们常常需要用到设置一个常量用来代表“无穷大”,比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大。

但是以INT_MAX为无穷大常常面临一个问题,即加一个其他的数会溢出。而这种情况在动态规划,或者其他一些递推的算法中常常出现,很有可能导致算法出问题。

所以0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:if (d[u]+w[u][v]

所以我们常采用0x3f3f3f3f来作为无穷大。0x3f3f3f3f主要有如下好处:

  1. 0x3f3f3f3f的十进制为1061109567,和INT_MAX一个数量级,即109数量级,而一般场合下的数据都是小于109的
  2. 0x3f3f3f3f * 2 = 2122219134,无穷大相加依然不会溢出,可以使用memset(array, 0x3f, sizeof(array))来为数组设初值为0x3f3f3f3f,因为这个数的每个字节都是0x3f。
  3. memset是按字节来memset的,不是按个来memset的,int有四个字节,就会把每个字节都变成0x3f,一般要么memset成0,要么memset成-1,因为int 型 0每个字节都是0,-1每个字节都是-1.

所以在通常的场合下,const int INF = 0x3f3f3f3f;真的是一个非常棒的选择

参考资料:图论中的0x3f和memset使用注意事项(较详细)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31819.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信