Java 基礎
異常捕獲
異常捕獲是典型的Plan B思想——設想程序執(zhí)行過程中可能出現(xiàn)的問題,然后對此問題準備一套解決方案,讓整體目標仍然能夠得到實現(xiàn)。
我們可以把程序類比成做某件事的計劃,我們事先會準備一套方案,但是有些方案誰也沒把握會不會出問題,那么為了增加方案的魯棒性,我們必須思考可能出現(xiàn)的問題,然后準備plan B。
主動拋出異常
有些方案在執(zhí)行過程中可能并不會出現(xiàn)引人注目的問題,但是不等于沒有問題。這個時候就要預測那些可能覺察不到的問題,并且保持關注。
所以要增強方案的魯棒性,既要為可能出現(xiàn)的問題提供Plan B,也要思考問題能不能被覺察,以何種方式被覺察。
封裝
一個造汽車的公司沒有必要了解輪胎的技術細節(jié),他應該集中精力于利用零件組裝出更適合市場需求的汽車。封裝是生產(chǎn)力發(fā)展的必然結果。其實他的另一個叫法是:分工合作。
編程發(fā)展到一定階段,必然面領著生產(chǎn)力的瓶頸,這時候人們意識到,只有通過封裝,每個人專注于不同層面問題的解決,才能夠產(chǎn)生更大的生產(chǎn)力。
從這個視角出發(fā),面向對象編程希望我們不要自己造輪子,多多利用好的輪子,然后組裝出更好地機器。
當然從另外一個角度出發(fā),它也希望我們把問題分層,一個團隊專注于一個層面的問題解決,合起來解決更大的問題。這就是公司的管理思想。從這個角度看,一個公司要想發(fā)揮更大的效率,就要讓每個人專注于解決一類問題,然后通過耦合解決更大的問題。這個社會是傾向于分工細化的,個人一定要思考自己是那個層面的問題解決者。
總之分工最大的好處在于每個人可以專注于自己那一小塊問題領域,精耕細作,把問題的解決方案做到極致。
繼承
一個產(chǎn)品的可擴展性也是很重要的性能。因為一個產(chǎn)品不可能滿足所有人的需求,要留有余地讓別人個性化自己的產(chǎn)品,使之更好地服務于他。
根本矛盾是生產(chǎn)與需求的矛盾。
所以任何一個解決方案在解決一個核心問題外還要留有其他的可能性,使之能夠滿足更多人的需求。
團隊里的任何一個人在專注于自己的核心業(yè)務之外也要根據(jù)團隊的需求不同發(fā)展額外的業(yè)務。
這是解決供需的一個折中方案。
接口
接口是為了解決多重繼承的問題。
一個物體會有很多種屬性,其中有共性也有個性。對于其中的共性我們可以抽象出一個超物體作為這個物體的母體。但共性和個性也是相對的,拿性格舉個例子。每個人都有各種各樣的性格,其中樂觀的人可以分為一類,作為這一類里面的共性,這時候慷慨就變成了個性;如果慷慨的人分為一類,樂觀就變成了個性。因此,一個物體對應有很多個抽象的超物體。因而理論上,一個物體可以繼承自很多母體。
那么為什么要關心物體可能存在的母體呢?
這個時候可能出現(xiàn)的問題是多個母體有相同的屬性和方法,這就要出問題了。所以java不允許多重繼承,但是想出了接口這個完美的解決方案——接口作為抽象類,完全不實現(xiàn)任何方法,因而及時方法與繼承類重合,也不會發(fā)生沖突。
算法分析
加一點限制,可以大幅度縮減所需信息,進而優(yōu)化算法。
最大連續(xù)子序列和實例探討基本思想
簡單窮舉搜索算法(<img src="http://chart.googleapis.com/chart?cht=tx&chl=O(N^3)" style="border:none;">)
- 列舉出所有可能的結果通常是及其低下的。
- for循環(huán)盡量少用,一層嵌套意味著一個次方。
利用丟棄信息(<img src="http://chart.googleapis.com/chart?cht=tx&chl= O(N^2)" style="border:none;">)
- 計算過程中很多信息可以重復利用,不要直接舍棄。但是本質沒有變。
線性算法
- 學會分析:最大子序列和一定不會從負數(shù)開始。也一定不會從負的子序列和開始。
- 學會證明:用數(shù)學語言證明嚴謹性。
形式化分析語言
- 大O規(guī)則:給出上限,T(N) = O(F(N))意味著從某個點N0開始,T(N) <=cF(N)。
- 大<img src="http://chart.googleapis.com/chart?cht=tx&chl=\Omega" style="border:none;">規(guī)則:給出下限
- 大<img src="http://chart.googleapis.com/chart?cht=tx&chl=\Theta" style="border:none;">規(guī)則:給出精確值
- 小o規(guī)則:給出嚴格上限
靜態(tài)查找問題
靜態(tài)數(shù)據(jù)是不允許改變的數(shù)據(jù)
評判好壞的三個維度
- 查找不成功所需要的開銷
- 最壞情況下查找成功的開銷
- 平均情況下查找成功的開銷
順序查找
- 數(shù)據(jù)無序,一個地方一個地方找,我們平時找東西最多用的方法,因為這個世界是熵增的。
- 順序查找是線性的。
二分法查找
- 數(shù)據(jù)有序,每次與中位值比較然后縮小一半的范圍。
- 數(shù)據(jù)量很小的時候并不比順序查找有效,生活中也是這樣,當我們把查找范圍減少到一定程度時,我們傾向于使用簡單的順序查找。
- 現(xiàn)實中用二分可能不是很容易,因為不是所有性質都可以排序。
插值查找
- 總是用中點進行二分有的時候有點傻。比如電話簿中查找Casablanca,從中間字母二分顯然有點愚蠢,我們應該根據(jù)被查找對象的自身性質這一信息盡可能多的排除不可能數(shù)據(jù),上面的例子從C附近開始就比較合理。
- 把數(shù)據(jù)分布看成均勻分布進行均勻插值求取下一個點是一個典型的建模思想。
永遠沒有最佳的解法,只有更好的解法。
實證分析
- 改變N,觀察增長率
- 改變N,觀察T(N)/F(N)是收斂與常數(shù),0,還是發(fā)散?
大O分析局限性
- 不適合少量輸入的分析,對于少量輸入,使用最簡單的算法。
- 忽略常數(shù)和低階項有的時候會產(chǎn)生問題。