Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0

          導航

          <2006年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          公告

          Flyingis博客空間內所有文章除特別聲明為[轉載],均為作者的學習心得和原創作品。如要轉載,請注明作者名flyingis及原文地址

          聯系方式

          常用鏈接

          留言簿(41)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          新聞檔案

          .Net 技術

          Ajax Technology

          Eclipse Technology

          ESRI Technology

          GIS Technology

          Java Technology

          Linux Technology

          Open Source

          個人博客

          精彩博客(技術類)

          精彩博客(非技術)

          搜索

          •  

          積分與排名

          • 積分 - 661649
          • 排名 - 72

          最新評論

          閱讀排行榜

          評論排行榜

          算法分析規則

          作者:Flyingis

              算法作為實現計算機程序實現時解決問題的方法,在計算機應用領域發揮著舉足輕重的作用。它研究的內容是解決問題的方法,而不是計算機程序的本身。一個優秀的算法可以運行在比較慢的計算機上,但一個劣質的算法在一臺性能很強的計算機上也不一定能滿足應用的需要,因此,在計算機程序設計中,算法設計往往處于核心地位。如何去設計一個適合特定應用的優秀算法是眾多開發人員所關注的焦點,在算法設計時,需要了解算法設計的規則。

          要想充分理解算法并有效地應用于實際問題,關鍵是對算法的分析。通常我們可以利用實驗對比分析、數學方法來分析算法。實驗對比分析很簡單,兩個算法相互比較,它們都能解決同一問題,在相同環境下,哪個算法的速度快我們一般就會認為這個算法性能更好。數學方法能將算法分析的更為細致,能在嚴密的邏輯推理基礎上判斷算法的優劣,但在完成實際項目過程中,我們很多時候都不能去做這種嚴密的論證與推斷,因為我們不是在完成一道數學難題,也不是數學領域的專家,將大量的時間花費在公式的計算與證明上會導致整個項目進度緩慢、成本過高,因此,在算法設計中,我們往往采用能近似表達性能的方法來展示某個算法的性能指標。例如,計算機對n2n2+2n的響應速度,當n比較大的時候幾乎一樣沒什么區別,我們便可直接認為后者算法的復雜度為n2。在分析算法時,隱藏細節的數學表示法成為大O記法,它可以幫助我們簡化算法復雜度的許多細節,提取主要成分,這和遙感圖像處理中的主成分分析思想相近。

          基于算法復雜度簡化表達的思想基礎上,我們通常會對算法進行最壞情況分析和平均情況分析。對于一個給定的算法,如果能保證它的最壞情況下的性能依然不錯當然很好,但是在某些情況下,程序的最壞情況算法的運行時間和實際情況的運行時間相差很大,在實際應用中我們幾乎不會碰到最壞情況下的輸入,那么此時進行最壞情況分析顯得有些畫蛇添足,特別是分析最壞情況算法會花費大量精力的時候。算法的平均情況分析可以幫助我們估計程序的性能,作為算法分析的基本指標之一,但是平均情況和實際情況仍然會有相差很大的時候,這時我們便可以使用隨機法來盡量模擬現實中的情況,這樣可以得到在嚴格的概率意義上的預測運行時間。另外,對于一個經典算法,我們沒有必要再去對該算法進行改進,研究它的上界和下界,只需要了解該算法的特性,然后在合適的時候使用它。

          最后,當一個程序變快和變慢,讓計算機反映出來的時間差幾乎不會讓人產生感覺的時候,我們也沒有必要去改進這個算法,例如程序進行1000次循環花費0.001秒,改進后為0.1秒,在實際應用中通常也只需要幾千次循環,此時我們就沒有必要去花時間來研究這個算法了,只要該算法能正確完成任務即可。

          posted on 2006-01-22 00:34 Flyingis 閱讀(3364) 評論(9)  編輯  收藏 所屬分類: Algorithm

          評論

          # re: 算法分析規則  回復  更多評論   

          叫大O標記,可能好一點。因為西文叫Big O. :)
          2006-01-22 13:09 | Big O

          # re: 算法分析規則  回復  更多評論   

          仔細讀了一下,發現你對算法是不了解的。我簡單更正一下。

          Big O notaion是有嚴格數學定義的。你理解的那個不對。你說多項式的情況還可以,要其他函數形式呢?

          Big O notation Definition:
          f(n) = O(g(n)) means there are positive constants c and k, such that 0 ≤ f(n) ≤ cg(n) for all n ≥ k. The values of c and k must be fixed for the function f and must not depend on n.

          大O標記,表示的是函數的緊上界(注意是≤ ).如果只是<,就只是上界,用小O標記,表示。

          其他,還有ω,Ω,表示緊下屆,下屆。Θ表示,同時上界和下屆。

          程序員是不需要自己寫算法,但是需要了解算法的。 比如,java Collection Framework里面的sort,是改進的merge sort ,而且是stable的。了解了才可以用好他們:)
          2006-01-22 13:35 | 程序員

          # re: 算法分析規則  回復  更多評論   

          補充一下,是叫做asymptotic upper bound,
          中文真不知道叫什么。應該叫非表象上界,不是普通的上界。這個asymptotic是你說的簡化細節的意思了。
          2006-01-22 13:46 | 程序員

          # re: 算法分析規則  回復  更多評論   

          "大O記法"的中文定義:
          若存在常數c和k,對所有n>k,使0<f(n)<cg(n)成立,函數f(n)就可以稱為O(f(n))
          使用O記法的原因主要是:當我們忽視數學公式中的小項時,當我們忽略對整個分析量只起了少量作用的部分程序時,限制可能出現的錯誤,并且根據算法總體運行時間的上界,對算法分類。定義中的小于還是小于等于還沒有認真考究,感謝“程序員”的評論。
          我學習算法一是因為興趣,二是因為以后工作很可能會需要。和“程序員”建議的一樣,細節我不會去深究,但要了解各種算法的特性。寫一些文章有時顯得有點班門弄斧,不妥之處請各位高手同行直接批評糾正,幫助我提高!
          2006-01-22 16:41 | Flyingis

          # re: 算法分析規則  回復  更多評論   

          剛才在公司沒有五筆,現在在寫幾句.不好意思我只是討論問題,有冒犯的地方,老兄多包含.

          大O標記其實是n>=k的時候函數的上界,有了這個定義才能時候算法分析.時間或空間復雜度進行推導的時候,某一步可以證明有這么一個K,n>=k的時候,g()>=f(),于是,就可以用O(g)來表示了.

          不能如你說的就是簡化掉表達示后面的東西,那在數學上也講不通呀.

          算法分析的技術,除了上面那種根據程序寫出復雜度f,再推出O(g)的直接方式.還有一種叫做amortize的技術,中文應該翻譯成分期嘗還的分析技術.中文的教材里都不講這個,分析基本都不講,清華那本<數據結構>只講結果不講為什么沒有證明過程,象一本速查手冊,現在覺得那些教材編的太差了,誤人子弟.
          2006-01-22 16:54 | 程序員

          # re: 算法分析規則  回復  更多評論   

          今天看了你很多的blog還是收獲很多的.以后多交流.有冒犯之處,多多原諒呀.
          2006-01-22 16:59 | 程序員

          # re: 算法分析規則  回復  更多評論   

          @ 程序員

          你見外了:)

          在這里,我本來就應該抱著學習的態度來寫文章,看大伙的評論。在我看來,只要是學術或研究方面的問題,可以直接指出,甚至爭論,前提是只對事,不對人。能和比我經驗豐富的人討論問題是我的榮幸。

          國內的教材的確令人不敢恭維,我現在看的是Robert Sedgewick的Algorithms in Java,感覺不錯。

          在學習過程中,我喜歡將看過的內容用自己的思維去重新組織一遍,然后覺得有用的東西就寫下來,這里面自然就會有一些思想上的誤區與表達上的問題,貼在blogjava上就是來和大家交流,讓大家提意見的。只有一點一滴的積累,才有最后質的變化。

          感謝你的指正!
          2006-01-22 17:09 | Flyingis

          # re: 算法分析規則  回復  更多評論   

          你在美國?現在上網,又在公司加班了吧:)
          2006-01-22 17:13 | Flyingis

          # re: 算法分析規則  回復  更多評論   

          現在已經在家了,白天到公司了.沒有加班,比較閑所以有空在blog上瞎寫了:)
          2006-01-22 17:19 | 程序員
          主站蜘蛛池模板: 乌鲁木齐县| 长兴县| 杭锦旗| 昌邑市| 陇南市| 连云港市| 环江| 叶城县| 斗六市| 清镇市| 花垣县| 浮山县| 都江堰市| 九寨沟县| 肥东县| 两当县| 乌兰浩特市| 湾仔区| 北辰区| 英吉沙县| 云浮市| 黄平县| 贵定县| 丹凤县| 刚察县| 新源县| 任丘市| 高雄市| 江川县| 曲水县| 乐至县| 中牟县| 马龙县| 南雄市| 子洲县| 兰考县| 凤山市| 丰县| 广南县| 乌兰察布市| 永和县|