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