算法中的初始化0x3f
写算法的时候,我们常常需要用到设置一个常量用来代表“无穷大”,比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大。
但是以INT_MAX为无穷大常常面临一个问题,即加一个其他的数会溢出。而这种情况在动态规划,或者其他一些递推的算法中常常出现,很有可能导致算法出问题。
所以0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:if (d[u]+w[u][v]
所以我们常采用0x3f3f3f3f来作为无穷大。0x3f3f3f3f主要有如下好处:
- 0x3f3f3f3f的十进制为1061109567,和INT_MAX一个数量级,即109数量级,而一般场合下的数据都是小于109的
- 0x3f3f3f3f * 2 = 2122219134,无穷大相加依然不会溢出,可以使用memset(array, 0x3f, sizeof(array))来为数组设初值为0x3f3f3f3f,因为这个数的每个字节都是0x3f。
- memset是按字节来memset的,不是按个来memset的,int有四个字节,就会把每个字节都变成0x3f,一般要么memset成0,要么memset成-1,因为int 型 0每个字节都是0,-1每个字节都是-1.
所以在通常的场合下,const int INF = 0x3f3f3f3f;真的是一个非常棒的选择
分类:
算法 / ACWING算法基础课
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步