算法的確很重要,就跟電腦一樣。沒電腦怎么編程,但貌似不是80%的程序員該考慮的。
人們之所以說算法很重要,是因為任何的程序,任何的軟件,都是由很多的算法和數據結構組成的。從這點上說算法很重要,但是這不意味著算法對于每個軟件設計人員的實際工作都是很重要的。其實,軟件行業(yè)是可以分為算法密集型,典型的比如一個搜索引擎。 業(yè)務邏輯密集型,典型的比如一個ERP。 使用體驗密集型,典型的比如一個全Flash站點。所以并不是每個軟件從業(yè)者都要求有很好的算法功底。關鍵是看你解決問題的能力,遇到自己不會的東西可以迅速掌握。
做游戲的開發(fā)要熟悉各種的算法flashlite也不例外,要找到適合這個游戲的算法就可以了,這需要時間去積累,平時要做到多思考、多看、多問(有時一個人想,不如2個或幾個人討論效果在好不過了)。
做flashlite手機開發(fā),要想到手機運算的限制一定要做好優(yōu)化.
記得大學時上c語言的時侯,我問老師:“這個能做什么用?”老師讓我自己思考找答案 班里的同學也沒幾個用心學的因為當時也有java很直接的可以做出相應的軟件、網站等。現在感覺c很有用!
開始接觸falshlite后慢慢的知道了算法的重要!不管是java、c、flashlite、php、......都離不開它,而且告訴你動點腦筋你會發(fā)在flashlite游戲里面的算法也可以在java使用。
比如做幾只螞蟻去拿食物,那么你會想到什么?“蟻群算法(ant colony optimization, ACO),又稱螞蟻算法,是一種用來在圖中尋找優(yōu)化路徑的機率型技術。它由Marco Dorigo于1992年在他的博士論文中引入,其靈感來源于螞蟻在尋找食物過程中發(fā)現路徑的行為。”
有人也許會說:“今天計算機這么快,算法還重要嗎?”其實永遠不會有太快的計算機,因為我們總會想出新的應用。雖然在摩爾定律的作用下,計算機的計算能力每年都在飛快增長,價格也在不斷下降?晌覀儾灰,需要處理的信息量更是呈指數級的增長,F在每人每天都會創(chuàng)造出大量數據(照片,視頻,語音,文本等等)。日益先進的紀錄和存儲手段使我們每個人的信息量都在爆炸式的增長;ヂ摼W的信息流量和日志容量也在飛快增長。在科學研究方面,隨著研究手段的進步,數據量更是達到了前所未有的程度。無論是三維圖形、海量數據處理、機器學習、語音識別,都需要極大的計算量。在網絡時代,越來越多的挑戰(zhàn)需要靠卓越的算法來解決。
再舉另一個網絡時代的例子。在互聯網和手機搜索,如果要找附近的咖啡店,那么搜索引擎該怎么處理這個請求呢?最簡單的辦法就是把整個城市的咖啡館都找出來,然后計算出它們的所在位置與你之間的距離,再進行排序,然后返回最近的結果。但該如何計算距離呢?圖論里有不少算法可以解決這個問題。
這么做也許是最直觀的,但絕對不是最迅速的。如果一個城市只有為數不多的咖啡館,那么這么做應該沒什么問題,反正計算量不大。但如果一個城市里有很多咖啡館,又有很多用戶都需要類似的搜索,那么服務器所承受的壓力就大多了。在這種情況下,我們該怎樣優(yōu)化算法呢?
首先,我們可以把整個城市的咖啡館做一次“預處理”。比如,把一個城市分成若干個“格子(grid)”,然后根據用戶所在的位置把他放到某一個格子里,只對格子里的咖啡館進行距離排序。
問題又來了,如果格子大小一樣,那么絕大多數結果都可能出現在市中心的一個格子里,而郊區(qū)的格子里只有極少的結果。在這種情況下,我們應該把市中心多分出幾個格子。更進一步,格子應該是一個“樹結構”,最頂層是一個大格——整個城市,然后逐層下降,格子越來越小,這樣有利于用戶進行精確搜索——如果在最底層的格子里搜索結果不多,用戶可以逐級上升,放大搜索范圍。
上述算法對咖啡館的例子很實用,但是它具有通用性嗎?答案是否定的。把咖啡館抽象一下,它是一個“點”,如果要搜索一個“面”該怎么辦呢?比如,用戶想去一個水庫玩,而一個水庫有好幾個入口,那么哪一個離用戶最近呢?這個時候,上述“樹結構”就要改成“r-tree”,因為樹中間的每一個節(jié)點都是一個范圍,一個有邊界的范圍。
通過這個小例子,我們看到,應用程序的要求千變萬化,很多時候需要把一個復雜的問題分解成若干簡單的小問題,然后再選用合適的算法和數據結構。
上面的例子在Google里就要算是小case了!每天Google的網站要處理十億個以上的搜索,GMail要儲存幾千萬用戶的2G郵箱,Google Earth要讓數十萬用戶同時在整個地球上遨游,并將合適的圖片經過互聯網提交給每個用戶。如果沒有好的算法,這些應用都無法成為現實。
在這些的應用中,哪怕是最基本的問題都會給傳統(tǒng)的計算帶來很大的挑戰(zhàn)。例如,每天都有十億以上的用戶訪問Google的網站,使用Google的服務,也產生很多很多的日志(Log)。因為Log每份每秒都在飛速增加,我們必須有聰明的辦法來進行處理。我曾經在面試中問過關于如何對Log進行一些分析處理的問題,有很多面試者的回答雖然在邏輯上正確,但是實際應用中是幾乎不可行的。按照它們的算法,即便用上幾萬臺機器,我們的處理速度都根不上數據產生的速度。
那么Google是如何解決這些問題的?
首先,在網絡時代,就算有最好的算法,也要能在并行計算的環(huán)境下執(zhí)行。在Google的數據中心,我們使用的是超大的并行計算機。但傳統(tǒng)的并行算法運行時,效率會在增加機器數量后迅速降低,也就是說,十臺機器如果有五倍的效果,增加到一千臺時也許就只有幾十倍的效果。這種事半功倍的代價是沒有哪家公司可以負擔得起的。而且,在許多并行算法中,只要一個結點犯錯誤,所有計算都會前功盡棄。
那么Google是如何開發(fā)出既有效率又能容錯的并行計算的呢?
Google最資深的計算機科學家Jeff Dean認識到,Google所需的絕大部分數據處理都可以歸結為一個簡單的并行算法:Map and Reduce。這個算法能夠在很多種計算中達到相當高的效率,而且是可擴展的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也可以達到幾百倍的效果)。Map and Reduce的另外一大特色是它可以利用大批廉價的機器組成功能強大的server farm。最后,它的容錯性能異常出色,就算一個server farm宕掉一半,整個fram依然能夠運行。正是因為這個天才的認識,才有了Map and Reduce算法。借助該算法,Google幾乎能無限地增加計算量,與日新月異的互聯網應用一同成長。
舉一個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都能幾個TB的數據量。但因為處理能力和存儲能力的不足,科學家不得不把絕大部分未經處理的數據丟棄掉。可大家要知道,新元素的信息很有可能就藏在我們來不及處理的數據里面。同樣的,在其他任何領域里,算法可以改變人類的生活。例如人類基因的研究,就可能因為算法而發(fā)明新的醫(yī)療方式。在國家安全領域,有效的算法可能避免下一個911的發(fā)生。在氣象方面,算法可以更好地預測未來天災的發(fā)生,以拯救生命。
所以,如果你把計算機的發(fā)展放到應用和數據飛速增長的大環(huán)境下,你一定會發(fā)現;算法的重要性不是在日益減小,而是在日益加強。