程序開發(fā)的基本步驟 如何評估一個算法的優(yōu)劣與價值?
如何評估一個算法的優(yōu)劣與價值?幻風的AI之路為您解答算法是什么?我們首先應該知道什么是算法?算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或者多個操作。算法的特性知道了
如何評估一個算法的優(yōu)劣與價值?
幻風的AI之路為您解答
算法是什么?
我們首先應該知道什么是算法?算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或者多個操作。
算法的特性
知道了算法的特點之后,我們應該知道算法有哪些特性?
有窮性:一個算法必須總是(對任何合法的輸入值)在執(zhí)行有窮步之后結束,且每一步都可在有窮時間內完成。
確定性:算法中每一條指令必須有確切的含義,讀者理解時不會產生二義性。也就是說相同的輸入必須產生相同的輸出。
可行性:一個算法是可以通過有限的基本運算實現(xiàn)。
輸入:一個算法有零格或多個輸入
輸出:一個算法有一個多個輸出
什么是好的算法
最后要回答什么是一個好的算法?應該可以從下面的一個角度來對算法進行評價
正確性:算法應該能夠正確的解決問題
可讀性:算法應該易于理解
健壯性:即使是輸入非法數(shù)據(jù),算法也難以進行處理
效率和存儲量:效率快,存儲量低
如何判斷一個程序員寫代碼好與不好?
程序員寫的代碼質量好壞可以從兩個角度入手
1.好的代碼一般通俗易懂
高手總會化繁為簡,寫的代碼首先是能讓人看懂,谷歌蘋果的工程師代碼提交之前都會找上周圍的同時給看一遍,如果對方覺得沒有什么問題可以直接提交,并且在提交注釋里面寫上reviewer名字,這樣同時也把責任給擔起來了,看似一個很簡單的模式,卻被絕大部分技術公司沿用。
所以代碼不能只有自己能看懂,讓別人能看懂你的思路,你的設計意圖。
2.好的代碼,遵守整個系統(tǒng)編碼規(guī)范,不出格,最重要的一點好的代碼能夠經得起實踐的考驗,在實際運轉過程中,沒有很重大的系統(tǒng)崩潰出現(xiàn)才能稱得上好代碼
所以代碼不能只是看著好,在性能上也需要有不俗的體現(xiàn),對于程序員來講代碼就是臉面,特別是在團隊配合之中,如果一個人寫的代碼質量高就會給人形成一種靠譜的感覺,在配合過程中也比較容易形成默契的感覺,一看誰寫的代碼如果平時代碼質量高,大家在調用該模塊的時候會覺得很舒心,很放心。代碼直接關系著程序員的品質問題了,有很多老程序員對于代碼質量非常關注,不允許自己犯一些很低級的錯誤,導致自己的名譽受損。
為什么有人說弄懂了《算法導論》的90%,就超越了90%的程序員?
其實計算機程序底層核心就是各種數(shù)學算法,剩下就是怎么用代碼去實現(xiàn)數(shù)學,世界上有名的計算機程序大牛幾乎都跟數(shù)學權威方面的專家有關。
Python語言其實很慢,為什么機器學習這種快速算法步驟通常還是用呢?
對于用過幾種開發(fā)語言(java,c#,nodejs,erlang),而后轉Python做機器學習的人,我說說我的看法。
首先,大家說python慢是真的嗎?我的回答是真的。非常慢,for循環(huán)比cpp慢兩個數(shù)量級。
那為什么還用Python?假如我們遍歷過億的數(shù)據(jù),兩個數(shù)量級的差異是無法接受的。但如果我們用python做最上層的邏輯,把上億數(shù)據(jù)進行分塊,python只循環(huán)十幾次,剩下扔給cpu和gpu。那么兩個數(shù)量級是否就無所謂了呢?1毫秒和100毫秒在整個系統(tǒng)中真的無所謂了。
python最大的優(yōu)勢在于,可以非常非常優(yōu)雅的把數(shù)據(jù)扔給高效的c,cuda去做計算。numpy,pandas,numba這些優(yōu)秀的開源庫可以非常方便的高效的處理海量的數(shù)據(jù),借助zmq,celery等還可以做分布式計算,gevent借助系統(tǒng)的epoll進行io優(yōu)化。所以,不需要花太多精力,就可以優(yōu)雅,高效的實現(xiàn)海量的數(shù)據(jù)處理,機器學習的任務。這是python火爆的原因。
想想,同樣的性能,代碼只有cpp或java的三分之一甚至更少,是不是很有誘惑力?
為什么有些算法可讀性很低?
建議閱讀源碼,可讀性差的主要原因是因為都是封裝好的庫,如果不熟悉相應的庫,基本上看不懂,有問題可以私信我,審核期求采納,先謝謝老鐵!
算法的評價指標包括什么?
1.時間復雜度
算法的時間復雜度是指執(zhí)行算法所需要的時間。一般來說,計算機算法是問題規(guī)模n 的函數(shù)f(n),算法的時間復雜度也因此記做。
T(n)=Ο(f(n))
因此,問題的規(guī)模n 越大,算法執(zhí)行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度
2.空間復雜度
算法的空間復雜度是指算法需要消耗的內存空間。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。
3.正確性
算法的正確性是評價一個算法優(yōu)劣的最重要的標準。
4.可讀性
算法的可讀性是指一個算法可供人們閱讀的容易程度。
5.健壯性
健壯性是指一個算法對不合理數(shù)據(jù)輸入的反應能力和處理能力,也成為容錯性。