算法中的初始化0x3f

发布时间 2023-04-02 10:23:21作者: wenli7363

写算法的时候,我们常常需要用到设置一个常量用来代表“无穷大”,比如对于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使用注意事项(较详细)