|
假設(shè)我們有一個(gè)難題需要解決,那怎么解決呢?解決的步驟怎樣呢?如果有一樣?xùn)|西能把這個(gè)解決這個(gè)難題的步驟描述出來,那就叫做這個(gè)問題的算法。 你看,如果我們學(xué)習(xí)算法的話其實(shí)學(xué)習(xí)的是解決問題的步驟,無論我們從事哪個(gè)行業(yè)學(xué)一下算法都是很有幫助的。 算法解決問題的步驟 01 算法概念的理解算法可以很復(fù)雜也可以很簡單 百度百科上對(duì)算法的定義:
為什么算法是解題方案的準(zhǔn)確、完整的描述,而且還要清晰的指令呢?因?yàn)榻^大多數(shù)算法最終需要轉(zhuǎn)換成計(jì)算機(jī)程序給計(jì)算機(jī)執(zhí)行的,而計(jì)算機(jī)是比較死板的。更直白地講,算法呢大多數(shù)時(shí)候是充當(dāng)了人和計(jì)算機(jī)之間的一種“翻譯”的角色。 那么我們用什么方法或者是工具來準(zhǔn)確、完整、清晰的描述解題方案呢?也就是說,我們用什么方法來描述算法呢? 給人看的算法呢,經(jīng)常采用三種方式來描述它:
流程圖的符號(hào)描述 一段求三個(gè)數(shù)中最大數(shù)的偽代碼 02 一個(gè)典型算法的例子其實(shí)我們碰到的很多問題,在不同的時(shí)間、不同的地點(diǎn)可能已經(jīng)有另外的一些人碰到過很多很多次了。所以呢,就有很多很經(jīng)典的算法,我們?nèi)绻J(rèn)真的研究一下這些算法,你會(huì)覺得比打游戲打怪升級(jí)還更有意思。比如下面這張圖里幾種常見的排序算法,所謂排序算法就是給計(jì)算機(jī)一組雜亂無章的數(shù),讓它幫我們從小到大或者從大到小排列起來。 排序算法最常見的應(yīng)用就是,期末考試的時(shí)候我們老師把每個(gè)同學(xué)的成績都輸入給計(jì)算機(jī),計(jì)算機(jī)能幫我們把這些成績排個(gè)序。想象一下,如果是全國統(tǒng)考的高考,全國那么多考生的成績排序,如果是人工排的話那得多大的工作量?光中午管盒飯也不老少啊! 常見的幾種經(jīng)典排序算法 我們以上圖中的第一種冒泡排序?yàn)槔齺碚f明一下算法,及其描述。 如果我們用自然語言來描述冒泡排序是這樣的:
你如果看上面這段名字可能有點(diǎn)懵逼,如果帶入一個(gè)問題場景來理解冒泡排序可能會(huì)容易的多。 比如說,我們有一組10個(gè)同學(xué)到操場集合站成一列,這個(gè)時(shí)候體育老師來了說:“大家按照身高從低到高排好!” 那怎么排列呢?那這個(gè)時(shí)候呢就可以這樣來看:
如果這樣的冒泡算法用流程圖來表示,是怎樣的呢? 一個(gè)100個(gè)數(shù)的數(shù)組的冒泡排序 流程圖呢,其實(shí)是計(jì)算機(jī)專業(yè)的或者相近專業(yè)的人才看的東東。普通人要想看明白它呢,也很簡單。首先,找到“開始”,然后順著箭頭一路向下,如果碰到一個(gè)菱形就是一個(gè)分支,這個(gè)棱形里面呢是一個(gè)條件,所謂條件就是滿足條件結(jié)果為真、不滿足為假,然后從棱形出來就要根據(jù)這個(gè)條件的取值選擇走哪條,如果是走回頭路的話就變成了一個(gè)循環(huán),所以那你就帶著一個(gè)值慢慢跟著箭頭走,很容易搞明白。 03 怎樣評(píng)價(jià)算法的好壞?俗話說“條條大路通羅馬”,但是呢并不是每條路都那么好走的。有些路比較好找,但是需要走的時(shí)間長;有些路可以很快到達(dá),但是很難走;有些路理論上能到達(dá)目的地,但是實(shí)際上幾乎相當(dāng)于死路走不通。這樣的話呢,不同的衡量標(biāo)準(zhǔn)下呢這不同的路就有了好壞之分。 那么解題的算法也是一樣,同一個(gè)問題可能有很多個(gè)算法,就像我們?cè)?2里看到的排序算法。那么,這么多算法,我們有沒有什么標(biāo)準(zhǔn)可以評(píng)價(jià)他們的好壞呢?答案是肯定的。 主要從幾個(gè)方面來衡量一個(gè)算法的優(yōu)劣:
好了,關(guān)于算法的理解入門,石頭就說這么多了。 |
|
|