c++算法关于常整型INF定义形式的解释
概念解释
单词:infinite的意思是无穷大
INF就是infinite的简写,表示无穷大常数
- 0x表示十六进制,后面的3f3f3f3f表示一个十六进制数
- 一般都是用0x3f3f3f3f作值,不怎么出错
0x7ffffff
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,取0x7ffffff作为无穷大,这是32-bit int的最大值,如果这个无穷大只用于一般的比较,比如求最小值时min变量的初值,更多的情况下选择0x3f3f3f3f
-
1.很多时候我们并不只是单纯拿无穷大作比较,而是会运算后再做比较,
例如在大部分最短路径算法中都会使用松弛操作:if(d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
若u,v,之间没有边,那么w[u][v]=INF,INF=0x7ffffff, 那么d[u]+w[u][v]会溢出而变成负数,松弛操作便出错了
-
2.不能满足无穷大加上无穷大依然是无穷大,而且会发生灾难性的错误
0x3f3f3f3f
鉴于以上两点,需要一个更好的INF来替代0x7ffffff,最严谨的办法是对无穷大
进行特别处理而不是找一个很大的常量来代替他(或者说模拟它),但是这样会让编程过程麻烦
最精巧的无穷大常量取值是0x3f3f3f3f
-
1.0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级), 而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
-
2.由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
-
3.0x3f3f3f3f还能给我们带来一个意想不到的额外好处:
如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效)
但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化)
就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦)
我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0
如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!
所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
原文地址:https://www.cnblogs.com/JHASH/p/15138484.html
- HDU 1250 Hat's Fibonacci
- Scrapy在Ubuntu下的安装与配置
- Selenium2+python自动化20-引入unittest框架
- HDU 1002 A + B Problem II(高精度加法(C++/Java))
- POJ 1018 Communication System
- POJ 1017 Packets
- Codeforces 725B Food on the Plane
- Codefoces 723B Text Document Analysis
- Codefoces 723A The New Year: Meeting Friends
- ECJTUACM16 Winter vacation training #1 题解&源码
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
- 看破欧拉函数的奥秘
- 线段树入门总结
- 从零基础学三分查找
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 树莓派基础实验28:红外避障传感器实验
- Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)
- Java Redis系列1 关系型数据库与非关系型数据库的优缺点及概念
- 树莓派基础实验29:I2C LCD1602实验
- Java Redis系列2 (redis的安装与使用+redis持久化的实现))
- Apache IoTDB 系列教程-1:数据模型
- Java Redis系列3(Jedis的使用+jedis连接池技术)
- kali中安装漏洞靶场Vulhub(超详细)
- [全部章节]栈论 : 递归与栈式访问,如何用栈实现所有递归操作 (内附幼儿园题目,要笑着做完)
- Apache IoTDB 系列教程-2:基础 SQL 操作
- Apache IoTDB 系列教程-3:部署运维
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇)
- kali下安装beef并联合Metasploit
- 初次使用maven创建web工程发现只有一个idea目录,src,webapp目录都不见了,解决方案
- 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目2)