程式設計中無窮大的量的使用技巧
如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式員都取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不能滿足“無窮大加一個有窮的數依然是無窮大”,它變成了一個很小的負數。 - 除了要滿足加上一個常數依然是無窮大之外,我們的常量還應該滿足“無窮大加無窮大依然是無窮大”,至少兩個無窮大相加不應該出現災難性的錯誤,這一點上0x7fffffff依然不能滿足我們。
所以我們需要一個更好的傢伙來頂替0x7fffffff,最嚴謹的辦法當然是對無窮大進行特別處理而不是找一個很大很大的常量來代替它(或者說模擬它),但是這樣會讓我們的程式設計過程變得很麻煩。在我讀過的程式碼中,最精巧的無窮大常量取值是0x3f3f3f3f,我不知道是誰最先開始使用這個精妙的常量來做無窮大,不過我的確是從一位不認識的ACMer(ID:Staginner)的部落格上學到的,他/她的很多程式碼中都使用了這個常量,於是我自己也嘗試了一下,發現非常好用,而當我對這個常量做更深入的分析時,就發現它真的是非常精巧了。
- 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,現在好了,如果我們將無窮大設為0x3f3f3f3f,那麼奇蹟就發生了,0x3f3f3f3f的每個位元組都是0x3f!所以要把一段記憶體全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。
所以在通常的場合下,0x3f3f3f3f真的是一個非常棒的選擇。
相關文章
- 關於ACM中的無窮大ACM
- 程式常用的設計技巧
- 程式設計技巧│提高 Javascript 程式碼效率的技巧程式設計JavaScript
- python如何表示無窮大Python
- 程式設計中快取的使用程式設計快取
- 大廠程式設計師的除錯技巧,偷學到了!程式設計師除錯
- 好程式設計師Web前端分享無法忽視的JavaScript技巧程式設計師Web前端JavaScript
- 程式設計師程式設計時的簡單方法與技巧程式設計師
- 程式設計中暫存器的使用程式設計
- Linux系統程式設計:mmap使用技巧Linux程式設計
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- Python程式設計進階,常用8大技巧!Python程式設計
- 【程式設計小技巧】程式設計
- Java程式設計技巧Java程式設計
- ACCESS 關於表設計中,驗證規則的使用技巧
- 學習營銷郵件的設計技巧,掌握7大技巧
- Go程式設計技巧–Goroutine的優雅控制Go程式設計
- Python的22個程式設計技巧,請收下!Python程式設計
- 《中世紀合金》:用心的設計與貧窮的困境
- 高數上 無窮小計算
- 詳解MapReduce中的五大程式設計模型程式設計模型
- UI設計培訓教程分享:UI設計師的色彩使用技巧UI
- 輕量級卷積神經網路的設計技巧卷積神經網路
- 無程式碼程式設計程式設計
- 協程在 UI 程式設計中的使用指南UI程式設計
- JS中的程式設計題JS程式設計
- golang中的socket程式設計Golang程式設計
- 老程式設計師的10個程式設計小技巧,教你寫出高質量程式碼!程式設計師
- 中軟卓越:Java程式設計師面試技巧3Java程式設計師面試
- Java程式設計指南:高階技巧解析 - Excel單元格樣式的程式設計設定Java程式設計Excel
- 論跟程式設計師談話的技巧:千萬不要跟程式設計師說,你的程式碼有bug程式設計師
- 30個Python程式設計師需要知道的程式設計技巧,可以讓你的工作事半功倍!Python程式設計師
- Python 程式設計實用技巧Python程式設計
- 15個與語言無關的REST API設計技巧 - bluethlRESTAPI
- 分享6個Python程式設計非常實用的技巧!Python程式設計
- 好程式設計師分享Vue的一些小技巧程式設計師Vue
- 程式設計中的自頂向下設計思想程式設計
- 第七節 無窮小的比較
- 女程式設計師的無奈你不懂程式設計師