在做一道需要對二維陣列遍歷的題時,我莫名其妙地使用了列主序的迴圈順序,如下:
for
(int j =
0;j < n;j++
)}
對應的邏輯上完全等價的行主序寫法如下:
for
(int i =
0;i < n;i++
)}
正當我認為必a無疑地交上去的時候:
可以看到,時間為2045ms,而題目限制2000ms,百思不得其解,找來標程對比,就差在迴圈順序了,而行主序的迴圈順序,時間竟然比我這列主序的順序快了一倍:
仔細想了想(其實是助教的點撥),記得大一的時候學過,其實二維陣列在本質上也是一維陣列,二者的記憶體分布並沒有不同,都是一片連續的記憶體空間,做乙個聯合就知道了:
union
u;
在上述的聯合中,有如下等式:
&u.a ==
&u.b
&u.a[0]
==&u.b[0]
&u.a[1]
==&u.b[5]
&u.a[2]
==&u.b[10]
&u.a[2]
[3]==
&u.b[
13]
並且有如下規律:
&u.a[m]
[n]==
&u.b[m*
5+n]
//5是a的第二維的長度
回到之前的問題上,出現執行時間如此大差別的原因就很明顯了,對於行主序的迴圈順序,在定址時是乙個接乙個地往後走,每次只需要執行乙個下標+1的操作,就可以到達下乙個元素,如從dp[0][0]到dp[0][1];而對於列主序的迴圈順序,每次需要做一次定址公式:從dp[0][0]到dp[1][0],記憶體中做了一次+dp第二維長度的操作,這樣下來,在兩個維度的長度較小時看不出差別,但是當到達104級別時,反映出來的效率差別就是兩倍了。
對二維陣列進行遍歷時
一定要行主序!
一定要行主序!
一定要行主序!
for
(int i =
0;i < n;i++
)}
iOS 奇妙bug集錦
最近設計師想要使用某款非系統字型的數字字型,想了個辦法把數字字型提取出來 提取工具是fontzip,提取完才7kb 放到專案中,正常執行,但到組裡其他人的電腦上就會遇到ios10以下的模擬器,uilabel載入這個字型後,只要涉及到渲染的api 比如sizetofit 就會崩潰,崩潰是停在類似於以下...
bug修復記錄
telnet ping netaddr traceroute netaddr 這是乙個linux下的命令可以通過vmmap觀察程式執行時所需要的依賴庫協議裡面涉及到陣列的,一定要判斷最大值 basegamelibdata stlibbasedata gamelib基本資料 uint32 t dwui...
Bug記錄 歸納
之前若干 不要完全依賴web端 移動端,期待他們傳正確的值 第三方介面呼叫是否捕獲異常取決於業務有沒有這個必要 不傳有預設值或者是空值,不一定要要求前端一定傳 介面考慮版本相容處理,實在區別很大,可以公升版本。2017年8月1日 新增字段,需要考慮關聯影響,比如說乙個模組加了乙個新的字段,那麼涉及的...