首先,咱們得先知道徘层,什么是算法峻呕?
在生活中,當(dāng)我們做菜趣效,玩游戲瘦癌,都有一些“套路”,無(wú)論是所謂的游戲秘籍跷敬,還是大師菜譜讯私,在計(jì)算機(jī)的世界中,稱之為算法西傀。其目的就是為了解決一個(gè)問(wèn)題妄帘,從而開(kāi)展的不同的步驟,但究竟是不是這么簡(jiǎn)單呢池凄,咱們就從算法的特性說(shuō)起抡驼。
咱們可以從書(shū)中得知,算法有五個(gè)特性:
聽(tīng)上去很是玄乎肿仑,但是仔細(xì)分析還是可以有些不同的收獲致盟。
- 確定性
一種算法除了能得出正確的結(jié)論之外,還得有明確操作步驟尤慰。如同把大象放進(jìn)冰箱馏锡,第一步是打開(kāi)冰箱,第二布是把大象放進(jìn)去伟端,第三步就是關(guān)上門(mén)杯道。 - 可行性
上面我提到把大象放進(jìn)冰箱的幾個(gè)步驟,第二個(gè)步驟顯然是不可行的责蝠,所以自然也無(wú)法得出正確的結(jié)構(gòu)党巾。那么可行性就很重要了。 - 有窮性
我再舉一個(gè)例子霜医,如果咱們要統(tǒng)計(jì)中國(guó)的人口齿拂,你不好好查人口數(shù)據(jù),非要一個(gè)個(gè)的數(shù)肴敛。這樣子雖然聽(tīng)上去總有一天數(shù)完署海,但是顯然是不可能的吗购,所以算法還需要有窮的步驟和有窮的執(zhí)行時(shí)間。 - 輸入和輸出
這兩個(gè)我就和起來(lái)說(shuō)砸狞,簡(jiǎn)而言之就是捻勉,輸入就是問(wèn)題,輸出就是答案刀森。而且只要問(wèn)題不變贯底,同一個(gè)算法得出的答案自然也是相同。
現(xiàn)在我們知道了什么是算法撒强,那么——什么樣的算法是一個(gè)好的算法呢禽捆?
正確是最最最最最最重要的
算法本身就是為了得出正確的結(jié)果而總結(jié)的“套路”,(除非是你用錯(cuò)了算法)如果沒(méi)能得出正確的結(jié)論飘哨,那這個(gè)算法還有什么存在的意義呢胚想?
不是我自己的錯(cuò),我也要承擔(dān)的綠帽精神(健壯)
咱們都知道芽隆,是人那就會(huì)犯錯(cuò)浊服,比如咱們做了個(gè)計(jì)算器,讓用戶輸入數(shù)字和符號(hào)進(jìn)行計(jì)算胚吁,然而卻給咱輸入了一堆字母牙躺,自然得不出正確的結(jié)果,咱又不能去揍他腕扶,畢竟用戶是上帝嘛孽拷,當(dāng)然是選擇原諒他
。那么面對(duì)錯(cuò)誤的輸入時(shí)不會(huì)出錯(cuò)甚至能給出正確的解答半抱,這也是好算法的一方面脓恕。
只有上帝知道我上個(gè)月前寫(xiě)的是什么玩意(可讀)
如果是在工作中,可不是只有自己會(huì)看自己所寫(xiě)的代碼窿侈,咱們不僅得看別人寫(xiě)的代碼炼幔,還得有別人看自己代碼的準(zhǔn)備。在你痛罵別人不寫(xiě)注釋
的同時(shí)史简,不妨也給自己的代碼寫(xiě)上乃秀,因?yàn)楹苡锌赡苓^(guò)段時(shí)間,你自己也看不懂了圆兵。除此之外跺讯,更加重要的是寫(xiě)代碼的時(shí)候遵守規(guī)范,語(yǔ)法正確衙傀,代碼結(jié)構(gòu)清晰有條理抬吟,命名合理
。统抬。。。
天下武功聪建,唯快不破钙畔!
咱們的計(jì)算機(jī)性能是有限的,在提高硬件水平的同時(shí)金麸,咱們所寫(xiě)的程序也要盡量的高效擎析。解決同一個(gè)問(wèn)題,不同的算法做耗費(fèi)的時(shí)間和資源有這天壤之別挥下。有個(gè)笑話是這么說(shuō)的揍魂,有個(gè)人為了給銀行找麻煩,特意兌換了好幾萬(wàn)的硬幣去銀行棚瘟,要存錢(qián)现斋。本來(lái)準(zhǔn)備好好看柜員們數(shù)錢(qián)數(shù)到天昏地暗,結(jié)果一稱重量偎蘸,一除就得出了總數(shù)庄蹋。這,就是算法的力量迷雪。
那么說(shuō)了這么多限书,我還是不知道該怎么判斷什么樣的算法是好算法
在正確的前提下,咱們希望算法能夠占用的資源少章咧,運(yùn)行的時(shí)間快倦西。也就是讓馬兒少吃草,快快跑赁严,你說(shuō)這可能嗎调限?還真就有可能。
咱們要建立標(biāo)準(zhǔn)误澳,量化效率耻矮,構(gòu)建理想模型。比如圖靈機(jī)模型忆谓,RAM模型等
用復(fù)雜度(大O記號(hào))來(lái)表示效率裆装,之后咱們就根據(jù)這個(gè)來(lái)評(píng)判算法的好壞(快慢)。