顧名思義,目算就是用眼睛計算。

我不是陽炎廚千萬別炸我啊。
目算通常是在編寫代碼前設計方案的時候發動,主要目的是估算程序需要運行的時間和需要占用的空間,并以此作為方案評估的標準之一。
這個Kata就是在鍛煉目算,所以很高興我們又不用寫代碼了。
Kata中提出了兩類問題:How Big和How Fast,也就是計算空間和時間,下面分別列出題目內容。
How Big?
- 下面這些無符號數字大約需要占用多少二進制位?
- 1,000
- 1,000,000
- 1,000,000,000
- 1,000,000,000,000
- 8,000,000,000,000
- 我的家在東北松花江上啊,那里大約有20000居民,如果每個居民都需要存儲姓名、地址和電話號碼的話,需要多少空間?所有數據都存為字符形式。
- 要把一百萬個整數存入二叉樹,大約需要多少個節點?二叉樹大約有幾層?如果系統是32位,大約需要多少存儲空間?
How Fast?
- MFC Windows程序設計大約有1200頁,用我家56k的鐵通寬帶傳需要多長時間?
- 我的二分查找算法處理一萬個元素大約需要4.5秒,處理十萬個元素大約需要6秒,那處理一千萬個元素需要多長時間?(假設空間足夠)
- (這段原文太長我只提取中心思想)假設要破解最長為16位的密碼,每位有96種可能性,嘗試一次需要1ms,破解出來大約要多長時間?
知識點
這些內容沒有標準答案,關鍵是思路。我說幾個我認為比較關鍵的知識點供大家參考:
- 1字節(1B)=8個二進制位(1b),1個字=4字節=32個二進制位,雙字=8字節=64個二進制位
- 字符按照編碼方式不同占用長度不同,一般英文字符一個占1字節,漢字一個占2字節,大家估算一下即可
- 二叉樹中每個節點至少要有三個內容:數字和兩個指針,兩個指針分別指向左右孩子節點,所以告訴你32位系統的目的就是計算指針長度
- MFC Windows程序設計這本書我真有,而且真超過了1000頁,不過好像沒到1200頁,不要在意細節
- 二分查找復雜度logn,算的時候別直接用比例算
- 破解密碼的話,MD5理論上無法逆推,但是有各種MD5反查網站,他們會正向計算各種常見密碼的MD5,然后等你查的時候如果他們計算過就知道密碼是什么了
- 通用的密碼破解方法是彩虹表,和反查MD5原理一樣,暴力計算出所有可能性。不過彩虹表這東西極其大,我上初中的時候電腦硬盤只有40G,當時常用的彩虹表已經過百G了。
- 我真不是陽炎廚
KB,MB,GB,KiB,MiB,GiB的區別
最后補充一個大知識點。
很多人都遇到過這種情況,買硬盤或者U盤,寫著64G120G,回家一插電腦上發現實際容量會小一點,大家可能不太在意,覺得這是自帶的一些存儲內容占用了空間。其實不是這樣,這是廠家耍的一個小把戲。
我們常說的KB,MB,GB,計算的時候是以10為底的,也就是說1KB其實就等于1000B,但是KiB,MiB,GiB是以2為底的,所以1KiB=1024B,也就是說KB,MB和GB實際上是小于KiB,MiB和GiB的。
廠家標容量的時候都是用KB,MB,GB,但是計算機實際使用的是KiB,MiB和GiB,所以你買的硬盤實際容量會比你想象的小一些。