关于0x3f3f3f3f(0x四个3f)
在之前一道最小生成樹問題中遇到過,我按照以前的習(xí)慣把INF定義為10億,然后初始化數(shù)組為最大值,然后輸入連通的路+value,最后值仍然為INF的即為不通的。但是這里出問題了,INF定義為10億的話,最后顯示的數(shù)組的值是負(fù)的,最后改成0x3f3f3f3f終于解決了。
今天正好看到一篇相關(guān)的博客,故細(xì)細(xì)分析一下。
引用自:http://blog.csdn.net/bossup/article/details/9090277
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
如果問題中各數(shù)據(jù)的范圍明確,那么無窮大的設(shè)定不是問題,在不明確的情況下,很多程序員都取0x7fffffff作為無窮大,因?yàn)檫@是32-bit int的最大值。如果這個無窮大只用于一般的比較(比如求最小值時min變量的初值),那么0x7fffffff確實(shí)是一個完美的選擇,但是在更多的情況下,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]會溢出而變成負(fù)數(shù),我們的松弛操作便出錯了,更一般的說,0x7fffffff不能滿足“無窮大加一個有窮的數(shù)依然是無窮大”,它變成了一個很小的負(fù)數(shù)。
所以我們需要一個更好的家伙來頂替0x7fffffff,最嚴(yán)謹(jǐn)?shù)霓k法當(dāng)然是對無窮大進(jìn)行特別處理而不是找一個很大很大的常量來代替它(或者說模擬它),但是這樣會讓我們的編程過程變得很麻煩。在我讀過的代碼中,最精巧的無窮大常量取值是0x3f3f3f3f,我不知道是誰最先開始使用這個精妙的常量來做無窮大,不過我的確是從一位不認(rèn)識的ACMer(ID:Staginner)的博客上學(xué)到的,他/她的很多代碼中都使用了這個常量,于是我自己也嘗試了一下,發(fā)現(xiàn)非常好用,而當(dāng)我對這個常量做更深入的分析時,就發(fā)現(xiàn)它真的是非常精巧了。
所以在通常的場合下,0x3f3f3f3f真的是一個非常棒的選擇。
負(fù)無窮大用0xcfcfcfcf比較好。
總結(jié)
以上是生活随笔為你收集整理的关于0x3f3f3f3f(0x四个3f)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle域完整性约束
- 下一篇: 一篇搞定 SpringBoot+Myba