小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

了解一下“算法”,每個(gè)人都要掌握的編程知識(shí)

 書山居士 2019-03-14

假設(shè)我們有一個(gè)難題需要解決,那怎么解決呢?解決的步驟怎樣呢?如果有一樣?xùn)|西能把這個(gè)解決這個(gè)難題的步驟描述出來,那就叫做這個(gè)問題的算法。

你看,如果我們學(xué)習(xí)算法的話其實(shí)學(xué)習(xí)的是解決問題的步驟,無論我們從事哪個(gè)行業(yè)學(xué)一下算法都是很有幫助的。

算法解決問題的步驟

01 算法概念的理解

了解一下“算法”,每個(gè)人都要掌握的編程知識(shí)

算法可以很復(fù)雜也可以很簡單

百度百科上對(duì)算法的定義:

算法(Algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。

為什么算法是解題方案的準(zhǔn)確、完整的描述,而且還要清晰的指令呢?因?yàn)榻^大多數(shù)算法最終需要轉(zhuǎn)換成計(jì)算機(jī)程序給計(jì)算機(jī)執(zhí)行的,而計(jì)算機(jī)是比較死板的。更直白地講,算法呢大多數(shù)時(shí)候是充當(dāng)了人和計(jì)算機(jī)之間的一種“翻譯”的角色。

那么我們用什么方法或者是工具來準(zhǔn)確、完整、清晰的描述解題方案呢?也就是說,我們用什么方法來描述算法呢?

給人看的算法呢,經(jīng)常采用三種方式來描述它:

  1. 自然語言。所謂自然語言就是人類的語言,我們?nèi)祟愓Z言最大的特點(diǎn)就是不嚴(yán)謹(jǐn),同樣一句話不同的語境、不同的人可能會(huì)有不同的理解,這和算法的定義是背道而馳的。所以又有了下面兩種算法描述方法。
  2. 流程圖,N-S圖。又稱程序框圖,用一組統(tǒng)一規(guī)定的標(biāo)準(zhǔn)符號(hào)描述程序運(yùn)行具體步驟的圖形表示。這是一種非常好的算法描述方法,一圖勝千言。我們做02典型算法的例子里會(huì)介紹。
  3. 偽代碼。一種非正式的,類似于英語結(jié)構(gòu)的,用于描述模塊結(jié)構(gòu)圖的語言

了解一下“算法”,每個(gè)人都要掌握的編程知識(shí)

流程圖的符號(hào)描述

了解一下“算法”,每個(gè)人都要掌握的編程知識(shí)

一段求三個(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)考的高考,全國那么多考生的成績排序,如果是人工排的話那得多大的工作量?光中午管盒飯也不老少啊!

了解一下“算法”,每個(gè)人都要掌握的編程知識(shí)

常見的幾種經(jīng)典排序算法

我們以上圖中的第一種冒泡排序?yàn)槔齺碚f明一下算法,及其描述。

如果我們用自然語言來描述冒泡排序是這樣的:

  1. 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
  2. 對(duì)每一對(duì)相鄰元素做同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這之后,最后的元素應(yīng)該會(huì)是最大的數(shù)。
  3. 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
  4. 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

你如果看上面這段名字可能有點(diǎn)懵逼,如果帶入一個(gè)問題場景來理解冒泡排序可能會(huì)容易的多。

比如說,我們有一組10個(gè)同學(xué)到操場集合站成一列,這個(gè)時(shí)候體育老師來了說:“大家按照身高從低到高排好!” 那怎么排列呢?那這個(gè)時(shí)候呢就可以這樣來看:

  1. 從第一個(gè)開始比較相鄰的兩個(gè)同學(xué),如果第一個(gè)同學(xué)比第二個(gè)同學(xué)高,那么他們換一下位置。
  2. 第一個(gè)和第二個(gè)比完(可能要交換位置)之后呢,那么第二個(gè)就肯定比第一個(gè)高了;這個(gè)時(shí)候再把第二個(gè)和第三個(gè)比較,如果還比第三個(gè)高,那么再和第三個(gè)也交換一下位置。這樣一直比到第10個(gè),那么經(jīng)過這么一輪的比較之后,站在第10個(gè)的同學(xué)肯定就是所有同學(xué)里面最高的了。
  3. 然后再用步驟1、2同樣的方法來對(duì)前面的9個(gè)同學(xué)操作,那第9個(gè)同學(xué)又變成剩下的9個(gè)里面最高的了。
  4. 然后再對(duì)剩下的8個(gè)同學(xué)進(jìn)行類似操作,然后是剩下的7個(gè)。。。一直到最后一個(gè),這樣一輪又一輪地操作之后就把這10個(gè)同學(xué)從矮到高拍好了。

如果這樣的冒泡算法用流程圖來表示,是怎樣的呢?

了解一下“算法”,每個(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)劣:

  1. 時(shí)間復(fù)雜度,可以粗暴地理解為運(yùn)行這個(gè)算法所需要的時(shí)間;
  2. 空間復(fù)雜度,可以粗暴地理解為運(yùn)行這個(gè)算法占用的計(jì)算機(jī)(或手機(jī)之類的)內(nèi)存大小,就是手機(jī)發(fā)燙不發(fā)燙;
  3. 正確性,這個(gè)就很好理解了;
  4. 可讀性,對(duì)于一些簡單問題的算法別整的像相對(duì)論那么難理解;
  5. 健壯性,就是說如果我們給這個(gè)算法的輸入條件出錯(cuò)了,這個(gè)算法會(huì)不會(huì)出錯(cuò),也叫容錯(cuò)率。就好比前面對(duì)學(xué)生按高矮排序的時(shí)候,突然插入一個(gè)其它班的同學(xué)、或者跑過來一條小狗狗,算法有沒有考慮到這些情況。

好了,關(guān)于算法的理解入門,石頭就說這么多了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多