在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具体问题取一个99999999之类的数(显得很不专业啊!)

在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择。

但是更多情况下,0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作:

if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];

如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了!

准确来说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”这个条件,它会变成了一个很小的负数。

更进一步的,如果有一个数能够满足“无穷大加无穷大依然是无穷大”,那么就更好了!

前阵子无意中看到了一个不一样的取值,INF=0x3f3f3f3f,这时我又郁闷了,这个值又代表的是什么?于是我去寻找答案,发现这个值的设置真的很精妙!

0x3f3f3f3f的十进制是1061109567,是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:
如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),方便又高效,但是当我们想将某个数组全部赋值为无穷大时,就不能使用memset函数而得自己写循环了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0(一般我们只有赋值为-1和0的时候才使用它)。现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择!

【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?相关推荐

  1. 【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?(转)

    摘自https://blog.csdn.net/jiange_zh/article/details/50198097 在算法竞赛中,我们常常需要用到一个"无穷大"的值,对于我来说, ...

  2. 为何说数据结构是程序员最重要的基本功?

    想必每一个程序员在刚刚入行的时候都有学过数据结构和算法.但是据我所知,真的掌握这方面知识的人却是少之又少. 之前我们在自己的用户群中做过一次调研,主要是1-5年编程经验的工程师,有应届生.有小厂的程序 ...

  3. 算法学习之路和程序员(技术)学习必读书籍

    原文链接:http://lucida.me/blog/on-learning-algorithms/ 转 算法学习之路和程序员(技术)学习必读书籍 2015年05月26日 09:46:56 阅读数:1 ...

  4. 10月16日云栖精选夜读 | 为什么程序员喜欢在半夜写代码?

    本文的作者是 Swizec Teller,他是一名自由职业者兼连续创业家,有超过17 年以上的软件开发经验,自称 A Geek with a Hat.几年前因为在inside.com上发了一篇文章&l ...

  5. chrome java插件_Java程序员喜欢的10款软件里有你在用的吗?

    作为一名Java程序员,日常开发的过程中,我们需要借助很多工具来进行编码.好的工具可以极大的提升程序员的工作效率,今天我们来认识下大多数程序员喜欢的10款软件.持不同意见或有想要补充的小伙伴,欢迎评论 ...

  6. 如何让程序员喜欢上编码

     如何让程序员喜欢上编码 奇葩图片网(www.78tp.com) 多少人是因为兴趣而选择编码的,既然做程序员,为什么不选择喜欢编码呢?商业内幕最近发表了一篇文章说做程序员压力山大,很多人都快疯了. ...

  7. 算法设计和数据结构学习_2(常见排序算法思想)

    一般约定我们是按照从小到大的顺序排序. 按照向量的形式来参考排序中数组元素的相对位置,行向量中最左边为数组的第一个元素,且称为前面.列向量中最上面的元素为数组的第一个元素,也是称为前边. 对常见的排序 ...

  8. 测试/开发程序员喜欢跳槽?跳了就能涨工资吗?

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  9. 为什么中国的程序员喜欢用英文写代码,甚至注释也用英文?

    为什么中国的程序员喜欢用英文写代码,甚至注释也用英文? 1.因为英语是国际通用的,用英语方便各国程序员. 2.因为英文才专业 3.因为语句只能用英文 4.因为变量名用英文方便外国同行看代码 5.因为英 ...

最新文章

  1. 程序员不是神……心态决定一切(转载)
  2. 修改正文中参考文献标注_论文写作中怎样正确插入参考文献,引用文献如何标注?...
  3. Android开发笔记(九十八)往图片添加部件
  4. 计算机网络的概述发展填空题,计算机网络安全概述填空题.doc
  5. Java中的try/catch/finally
  6. 计算机中音乐设备数字接口,多媒体cai课件制作技术复习题
  7. 关于Tableau试用版停止
  8. 在MyEclipse中安装SVN插件subclipse
  9. 邮件群发软件哪个好用?
  10. 在线供应链系统服务方案:构建企业供应链平台业务、功能、技术管理架构
  11. rs485数据线接反_RS485引脚说明及接口说明
  12. gee微端服务器系统设置,geem2微端服务器设置
  13. 高校企业双向赋能,首届飞桨启航菁英计划圆满结束
  14. 【离散数学】第一章 —— 基础:逻辑和证明
  15. Jetson-Nano挂载TF卡/挂载磁盘
  16. 免杀远程监控软件大盘点
  17. Python:生成随机偏态分布
  18. Linux学习笔记(四):正则表达式
  19. CV_RETR_TREE’ was not declared in this scope
  20. 跳槽找工作避坑指南(2019最新新版)

热门文章

  1. LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分
  2. 千万别付钱!史上最贵勒索软件作者“忘记”备份密钥
  3. 常见传感器分析及应用代码
  4. 危化安全智慧管理平台必备功能之一双重预防机制数字化系统
  5. DCache踩坑记录
  6. joint和join_connect、join、joint、juncture、link的区别_近义词词典_词林在线词典
  7. 通过servlet.jsp.tagext.TagSupport的自定义标签实现按钮权限控制
  8. Responsive Safety in Reinforcement Learning by PID Lagrangian Methods
  9. 模数转换器ADC的基本指标
  10. (2014)七夕大爆发的安卓XX神奇蠕虫分析