2. 算法

算法:

算法是解決特定問題求解步驟的描述让腹,在計算機中表現(xiàn)為指令的有限序列,并且每條指令表示一個或多個操作达布。

2.4 算法的定義

什么是算法呢?算法是描述解決問題的方法斩熊。

算法定義中往枣,提到了指令,指令能被人或機器等計算裝置執(zhí)行粉渠。它可以是計算機指令分冈,也可以是我們平時的語言文字。

為了解決某個或某類問題霸株,需要把指令表示成一定的操作序列雕沉,操作序列包括一組操作,每一個操作都完成特定的功能去件,這就是算法了坡椒。

2.5 算法的特性

算法的特性.png

算法具有5個基本特征:輸入,輸出尤溜,有窮性倔叼,確定性和可行性

1 輸入輸出

算法具有零個或多個輸入宫莱。 算法至少有一個或多個輸出丈攒。

算法是一定需要輸出的,不需要輸出授霸,你用這個算法干嘛巡验?輸出的形式可以是打印輸出,也可以是返回一個或多個值等碘耳。

2 有窮性

有窮性:指算法在執(zhí)行有限的步驟之后显设,自動結(jié)束而不會出現(xiàn)無限循環(huán),并且每一個步驟在可接受的時間內(nèi)完成辛辨。

當(dāng)然這里有窮的概念并不是純數(shù)學(xué)意義的捕捂,而是在實際應(yīng)用當(dāng)中合理的,可以接受的“有邊界”愉阎。

3 確定性

確定性:算法的每一步驟都具有確定的含義绞蹦,不會出現(xiàn)二義性

算法在一定條件下榜旦,只有一條執(zhí)行路徑幽七,相同的輸入只能有唯一的輸出結(jié)果。算法的每個步驟被精確定義而無歧義溅呢。

4 可行性

可行性:算法的每一步都必須是可行的澡屡,也就是說猿挚,每一步都能夠通過執(zhí)行有限次數(shù)完成

可行性意味著算法可以轉(zhuǎn)換為程序上機運行驶鹉,并得到正確的結(jié)果绩蜻。

2.6 算法設(shè)計的要求

算法不是唯一的,同一個問題室埋,可以有多種解決問題的算法办绝。

算法設(shè)計的要求.png
2.6.1 正確性

正確性:算法的正確性是指算法至少應(yīng)該具有輸入,輸出和加工處理無歧義性姚淆,能正確反映問題的需求孕蝉,能夠得到問題的正確答案。

但是算法的“正確”通常在用法上有很大的區(qū)別腌逢,大體分為一下4個層次降淮。

  • 1.算法程序沒有語法錯誤。
  • 2.算法程序?qū)τ诤戏ǖ妮斎霐?shù)據(jù)能夠產(chǎn)生滿足要求的輸出結(jié)果搏讶。
  • 3.算法程序?qū)τ诜欠ǖ妮斎霐?shù)據(jù)能夠得出滿足規(guī)格說明的結(jié)果佳鳖。
  • 4.算法程序?qū)τ诰倪x擇的,甚至刁難的測試數(shù)據(jù)都有滿足要求的輸出結(jié)果媒惕。

對于這4層含義系吩,層次1要求最低,但是僅僅沒有語法錯誤實在談不上是好算法妒蔚。而層次4是最困難的淑玫,我們幾乎不可能逐一驗證所有的輸入都得到正確的結(jié)果。

因此算法的正確性在大部分情況下都不可能用程序來證明面睛,而是用數(shù)學(xué)方法來證明的。證明一個復(fù)雜算法在所有層次上都是正確的尊搬,代價非常昂貴叁鉴。所以一般情況下,我們把層次3作為一個算法是否正確的標(biāo)準(zhǔn)佛寿。

2.6.2 可讀性

可讀性:算法設(shè)計的另一目的是為了便于閱讀幌墓,理解和交流

我們寫代碼的目的冀泻,一方面是為了讓計算機執(zhí)行常侣,但還有一個重要的目的是為了便于他人閱讀,讓人理解或交流弹渔,自己將來也可能閱讀胳施,如果可讀性不好,時間長了自己都不知道寫了些什么肢专∥杷粒可讀性是算法好壞很重要的標(biāo)志焦辅。

2.6.3 健壯性

健壯性:當(dāng)輸入數(shù)據(jù)不合法時,算法也能做出相關(guān)處理椿胯,而不是產(chǎn)生異晨甑牵或莫名其妙的結(jié)果

2.6.4 時間效率高和存儲量低

時間效率指的是算法的執(zhí)行時間哩盲。

存儲量需求指的是算法在執(zhí)行過程中需要的最大存儲空間前方,主要指算法程序運行時所占用的內(nèi)存或外部硬盤存儲空間。

設(shè)計算法應(yīng)該盡量滿足時間效率高和存儲量低的需求廉油。

2.7 算法效率的度量方法

設(shè)計算法要提高效率惠险。這里效率大都指算法的執(zhí)行時間。

算法效率的度量方法.png

2.7.1 事后統(tǒng)計方法

事后統(tǒng)計方法:這種方法主要是通過設(shè)計好的測試程序和數(shù)據(jù)娱两,利用計算機計時器對對不同算法編制的程序的運行時間進(jìn)行比較莺匠,從而確定算法效率的高低

缺陷:

  • 必須依據(jù)算法事先編制好程序十兢,這通常需要花費大量的時間和精力趣竣。
  • 時間的比較依賴計算機硬件和軟件等環(huán)境因素。
  • 算法的測試數(shù)據(jù)設(shè)計困難旱物,并且程序的運行時間往往還與測試數(shù)據(jù)的規(guī)模有很大關(guān)系遥缕,效率高的算法在小的測試數(shù)據(jù)面前往往得不到體現(xiàn)。

基于事后統(tǒng)計方法有這樣那樣的缺陷宵呛,我們考慮不予采納单匣。

2.7.2 事前分析估算方法

事前分析估算方法:在計算機程序編制前,依據(jù)統(tǒng)計方法對算法進(jìn)行估算宝穗。

一個程序的運行時間户秤,依賴于算法的好壞和問題的輸入規(guī)模。所謂問題輸入規(guī)模是指輸入量的多少逮矛。

測定運行時間最可靠的方法就是計算對運行時間有消耗的基本操作的執(zhí)行次數(shù)鸡号。運行時間與這個計數(shù)成正比。

不記那些循環(huán)索引的遞增和循環(huán)終止條件须鼎,變量聲明鲸伴,打印結(jié)果等操作,最終晋控,在分析程序的運行時間時汞窗,最重要的是把程序看成是獨立于程序設(shè)計語言的算法或一系列步驟。

同樣問題的輸入規(guī)模是n,求和算法的第一種赡译,求1+2+3+4+...+n需要一段代碼執(zhí)行n次仲吏。那么這個問題的輸入規(guī)模使得操作數(shù)量是f(n)=n,顯然運行100次的同一段代碼規(guī)模試運行10次的10倍。而第二種蜘矢,無論n為多少狂男,運行次數(shù)都為1,即f(n)=1品腹,第三種岖食,運算100次是運算10次的100倍,因為他是f(n)=n2舞吭。

隨著n值的越來越大泡垃,它們在時間效率上的差異也就越來越大。

2.8 函數(shù)的漸進(jìn)增長

函數(shù)的漸進(jìn)增長:

給定兩個函數(shù)f(n)g(n),如果存在一個整數(shù)N羡鸥,使得對于所有的n>N,f(n)總是比g(n)大蔑穴,那么,我們說f(n)的增長漸近快于g(n)惧浴。

與最高次項相乘的常數(shù)并不重要存和。

  • 最高次項的指數(shù)大的,函數(shù)隨著n的增長衷旅,結(jié)果也會變得增長特別快捐腿。

  • 判斷一個算法的效率時,函數(shù)中的常數(shù)和其他次要項常呈炼ィ可以忽略茄袖,而更應(yīng)該關(guān)注主項(最高階項)的階數(shù)。

  • 判斷一個算法好不好嘁锯,我們只通過少量的數(shù)據(jù)是不能做出準(zhǔn)確判斷的宪祥。

某個算法嘴拢,隨著n的增大蝗茁,它會越來越優(yōu)于另一算法,或者越來越差于另一算法统翩。

2.9 算法時間復(fù)雜度

在進(jìn)行算法分析時仁锯,語句總的執(zhí)行次數(shù)T(n)是關(guān)于問題規(guī)模n的函數(shù)肘交,進(jìn)而分析T(n)n的變化情況并確定T(n)的數(shù)量級。算法的時間復(fù)雜度扑馁,也就是算法的時間量度,記做: T(n)=O(f(n))凉驻。它表示隨問題規(guī)模n的增大腻要,算法執(zhí)行時間的增長率和f(n)的增長率相同,稱作算法的漸近時間復(fù)雜度涝登,簡稱為時間復(fù)雜度雄家。其中f(n)是問題規(guī)模n的某個函數(shù)

這樣用大寫O()來體現(xiàn)算法時間復(fù)雜度的記法,我們稱之為大O記法胀滚。

一般情況下趟济,隨著n的增大乱投,T(n)增長最慢的算法為最優(yōu)算法。

由此算法時間復(fù)雜度的定義可知顷编,我們的三個求和算法的時間復(fù)雜度分別為O(n),O(1),O(n2)戚炫。我們分別給它們?nèi)×朔枪俜降拿Q,O(1)叫常數(shù)階媳纬,O(n)叫線性階双肤,O(n2)叫平方階

2.9.2 推導(dǎo)大O階方法

如何分析一個算法的時間復(fù)雜度呢钮惠?即如何推導(dǎo)大O階呢茅糜?

推導(dǎo)大O階:

  • 用常數(shù)1取代運行時間中的所有加法常數(shù)。
  • 在修改后的運行次數(shù)函數(shù)中素挽,只保留最高階項蔑赘。
  • 如果最高階項存在且不是1,則去除與這個項相乘的常數(shù)预明。得到的結(jié)果就是大O階缩赛。

2.9.3 常數(shù)階

這種與問題的大小無關(guān)(n的多少),執(zhí)行時間恒定的算法贮庞,我們稱之為具有O(1)的時間復(fù)雜度峦筒,又叫常數(shù)階

注意:不管這個常數(shù)是多少窗慎,我們都記作O(1)物喷,而不是O(3)O(12)等其他任何數(shù)字遮斥,這是初學(xué)者常常犯的錯誤峦失。

對于分支結(jié)構(gòu)而言,無論是真還是假术吗,執(zhí)行的次數(shù)都是恒定的尉辑,不會隨著n的變大而發(fā)生變化,所以單存的分支結(jié)構(gòu)(不包含在分支結(jié)構(gòu)中)较屿,其時間復(fù)雜度也是O(1)隧魄。

2.9.4 線性階

線性階的循環(huán)結(jié)構(gòu)會復(fù)雜很多,要確定某個算法的階次隘蝎,我們常常需要確定某個特定語句或某個語句集運行的次數(shù)购啄。因此我們要分析算法的復(fù)雜度,關(guān)鍵就是要分析循環(huán)結(jié)構(gòu)的運行情況嘱么。

線性階.png

對數(shù)階

對數(shù)階.png

平方階

循環(huán)的時間復(fù)雜度等于循環(huán)體的復(fù)雜度乘以該循環(huán)運行的次數(shù)狮含。

平方階.png

其實理解大O推導(dǎo)不算難,難的是對數(shù)列的一些相關(guān)運算,這更多的是考察你的數(shù)學(xué)知識和能力几迄。

2.10 常見的時間復(fù)雜度

常見的時間復(fù)雜度.png

2.11### 最壞情況和平均情況

最壞情況運行時間是一種保證蔚龙,那就是運行時間將不會再壞了。在應(yīng)用中映胁,這是一種最重要的需求木羹,通常,除非特被指定屿愚,我們提到的運行時間都是最壞情況的運行時間汇跨。

平均運行時間是所有情況中最有意義的,因為它是期望的運行時間妆距。

對算法的分析穷遂,一種方法是計算所有情況的平均值,這種時間復(fù)雜度的計算方法稱為平均時間復(fù)雜度娱据。另一種方法是計算最壞情況下的時間復(fù)雜度蚪黑,這種方法稱為最壞時間復(fù)雜度。一般在沒有特殊說明的情況下中剩,都是指最壞時間復(fù)雜度忌穿。

2.12 算法空間復(fù)雜度

算法的空間復(fù)雜度:通過計算算法所需的存儲空間實現(xiàn),算法空間復(fù)雜度的計算公式記作:S(n) = O(f(n)),其中结啼,n為問題的規(guī)模掠剑,f(n)為語句關(guān)于n所占存儲空間的函數(shù)。

通常郊愧,我們都使用“時間復(fù)雜度”來指運行時間的需求朴译,使用“空間復(fù)雜度”指空間需求。當(dāng)不用限定詞地使用“復(fù)雜度”時属铁,通常都是指時間復(fù)雜度眠寿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市焦蘑,隨后出現(xiàn)的幾起案子盯拱,更是在濱河造成了極大的恐慌,老刑警劉巖例嘱,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡逢,死亡現(xiàn)場離奇詭異,居然都是意外死亡拼卵,警方通過查閱死者的電腦和手機奢浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來间学,“玉大人,你說我怎么就攤上這事〉秃” “怎么了详羡?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘿悬。 經(jīng)常有香客問我实柠,道長,這世上最難降的妖魔是什么善涨? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任窒盐,我火速辦了婚禮,結(jié)果婚禮上钢拧,老公的妹妹穿的比我還像新娘蟹漓。我一直安慰自己,他們只是感情好源内,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布葡粒。 她就那樣靜靜地躺著,像睡著了一般膜钓。 火紅的嫁衣襯著肌膚如雪嗽交。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天颂斜,我揣著相機與錄音夫壁,去河邊找鬼。 笑死沃疮,一個胖子當(dāng)著我的面吹牛盒让,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忿磅,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼糯彬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葱她?” 一聲冷哼從身側(cè)響起撩扒,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吨些,沒想到半個月后搓谆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡豪墅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年泉手,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偶器。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡斩萌,死狀恐怖缝裤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颊郎,我是刑警寧澤憋飞,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站姆吭,受9級特大地震影響榛做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜内狸,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一检眯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昆淡,春花似錦锰瘸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倔既,卻和暖如春恕曲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渤涌。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工佩谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人实蓬。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓茸俭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親安皱。 傳聞我的和親對象是個殘疾皇子调鬓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 算法復(fù)雜度 時間復(fù)雜度 空間復(fù)雜度 什么是時間復(fù)雜度 算法執(zhí)行時間需通過依據(jù)該算法編制的程序在計算機上運行時所消耗...
    KODIE閱讀 3,237評論 0 9
  • 通常,對于一個給定的算法酌伊,我們要做 兩項分析腾窝。第一是從數(shù)學(xué)上證明算法的正確性,這一步主要用到形式化證明的方法及相關(guān)...
    西域小碼閱讀 1,840評論 0 11
  • 與傳統(tǒng)衣柜相比循集, 定制衣柜可以根據(jù)自己的喜好來設(shè)計,合理安排空間, 因而越來越受到人們的歡迎蔗草。 但它與踢腳線咒彤、頂角...
    kopok高博閱讀 1,764評論 0 0
  • 感受智商碾壓疆柔。 “邇來觸緒善感,歡寡悉殷镶柱,懷抱劇有秋氣婆硬。每攬鏡自照,神寒形削奸例,清癯非壽者相。竊恐我躬不閱向楼,周女士或...
    無言的白茶閱讀 936評論 0 0
  • cookie:存儲數(shù)據(jù)查吊,當(dāng)用戶訪問了某個網(wǎng)站的時候,我們可以通過cookie來向訪問者電腦上存儲數(shù)據(jù)湖蜕。 1.不同的...
    編程小飛俠閱讀 961評論 0 6