摘自https://blog.csdn.net/jiange_zh/article/details/50198097

在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具体问题取一个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真的是一个非常棒的选择!

转载于:https://www.cnblogs.com/wkfvawl/p/10439382.html

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

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

    在算法竞赛中,我们常常需要用到一个"无穷大"的值,对于我来说,大多数时间我会根据具体问题取一个99999999之类的数(显得很不专业啊!) 在网上看别人代码的时候,经常会看到他们把 ...

  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. 插入10000条数据测试DB性能
  2. 远程连接Kali Linux使用PuTTY实现SSH远程连接
  3. C#操作符??和?:
  4. 1:Hello world
  5. OpenGL CPU光线跟踪
  6. [ASP,VB] - 利用ASP调用API COM接口实现开关机
  7. Cobertura和Sonar 5.1的问题
  8. linux attach 指令,以太坊实战-attach命令详解
  9. Android 开发笔记 一
  10. 高斯数据库-GaussDB
  11. t480 拆触摸板_thinkpad t470怎么关闭触摸板?
  12. python数据分析案例简单实战项目(二)--疫情数据分析
  13. 软件测试 | 期末复习——软件质量概述
  14. js Qrcode.js实现文字内容通过二维码展示
  15. 技能分享 | 麦肯锡教给我的写作武器:连接词是文章通顺的灵魂
  16. mysql查询从周一开始算本周第一天
  17. 全球最豪华手机诺基亚Vertu
  18. 用Python试了试人脸识别
  19. Arduino ESP32 SD卡读写实例
  20. 2016年第二季度总结

热门文章

  1. G6 图可视化引擎——核心概念——节点/边/Combo——内置节点——Rect
  2. 2013年第四届蓝桥杯C/C++ A组国赛 —— 第四题:约数倍数选卡片
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1068:与指定数字相同的数的个数
  4. Java常用API(六)Date 日期类介绍及使用
  5. 【Linux】一步一步学Linux——telinit命令(144)
  6. 【Linux】一步一步学Linux——df命令(79)
  7. 【C语言】控制台窗口图形界面编程(六):光标设置
  8. python函数的组成要素_python函数要素有哪些?这7点是你写好python代码的关键
  9. java toHalf_MoreThanHalfInArray.java
  10. 每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置