日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法和时间复杂度概念(一级)

發(fā)布時間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法和时间复杂度概念(一级) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第一個內(nèi)容什么是算法?什么是算法的復(fù)雜度?什么是算法的空間復(fù)雜度?我們的標(biāo)題是數(shù)據(jù)結(jié)構(gòu)和算法入門,這兩個就是數(shù)據(jù)結(jié)構(gòu)的入門,這三個就是算法的入門什么叫算法?算法就是指令的集合,是為解決特定問題而規(guī)定的一系列操作,我一般不愿意說概念性的問題,什么叫算法呢,簡單的說,算法就是計(jì)算機(jī)解題的思路,解題的過程,我們舉生活中的一個例子來說,如何求1+2+3+....+100=?,我們怎么來實(shí)現(xiàn),要實(shí)現(xiàn)的方式有很多算法1: 我們學(xué)了 while do-while for循環(huán),任何一種循環(huán)都可以吧這個問題搞定,因?yàn)?+2+3是可以重復(fù)的,用我們的循環(huán)語句,就可以把這個問題搞定,但是大家要明白一點(diǎn),我們使用計(jì)算機(jī)語言,是在欺負(fù)計(jì)算機(jī),欺負(fù)他運(yùn)算的快,充分的利用計(jì)算機(jī)運(yùn)算的快這個特征來做的,這個依次相加用for循環(huán)來算效率高嗎?效率不高,但是就是計(jì)算機(jī)運(yùn)行的速度比較快,那我們?yōu)槭裁催€要用循環(huán),兩個原因,第一個原因計(jì)算機(jī)運(yùn)行的速度快,第二個對我們來說最主要的,我們寫的代碼少,我們寫個for循環(huán),兩行代碼就出來了,是這么來做的,但是如果真的花的時間來說,這種效率還是比較低的,那有更好的辦法嗎,當(dāng)然有了算法2: 高斯解法,這個故事大家應(yīng)該都知道,老師懲罰一個學(xué)生的,上課不好好學(xué)習(xí),給你們出一道題,1+2+3+...+100=?,結(jié)果所有的學(xué)生除了高斯都在蒙頭拿著紙算,就像計(jì)算機(jī)一樣,重復(fù)的操作,就高斯在那里不算,老師說你怎么不算,老師我已經(jīng)算出來,不可能啊,怎么回事,他就用梯形的面積公式來算,梯形的面積公式怎么來的,上底加下底,(1+100),一共有一百個數(shù),(1+100)*100/2,你看結(jié)果就出來了,如果是要加到10000,你換一下就可以了,(1+10000)*10000/2,他算3次,是不是就可以了,他也可以用三角形的面積公式來算,如果三角形的面積公式來算前面要加個0,0+1+2+3+....+100=?,結(jié)果沒有影響,底乘以高,底是多少底是100,用了101個數(shù),再除以2,100*101/2,有人說我不明白,這怎么可以用梯形面積來算呢,這個就不解釋,明白就明白,不明白我也就不在這里解釋了,小學(xué)數(shù)據(jù)老師要解釋的,如果要是10000的話,你采用兩種方式的效率千差萬別,效率差的太多了,你的思維要擴(kuò)散一下,不要總想著那三種循環(huán),或者使用哪種循環(huán),哪種循環(huán)都不對,必須要跳出這種循環(huán)的思維,可以用這種方式來做,還有沒有別的算法,他發(fā)的時間一樣嗎,不一樣算法3; 比如我們使用遞歸來實(shí)現(xiàn),為什么呢,sum(100)=sum(99)+100,我想求出sum(100),我只要求出sum(99)就可以,但是你要想求出sum(99),你只要求出sum(98)就可以了,依次往下類推,sum(2)=sum(1)+1,你想求出sum(2),你只要求出sum(1)就可以了sum(1)=1,sum(1)就不用再求了,sum(1)就等于1,那你求sum(100),求sum(99),求sum(2)用的這種解題的思路都是一樣的,用遞歸,用遞歸來解決,這就是算法一個問題,我們在這里提供了三種算法,請問我要用哪一個,我們怎么來評價(jià)算法的優(yōu)劣,兩個角度來考慮,第一個你要花多少時間,我要這個時間短的,第二個你在內(nèi)存里面占多少空間,我們要找那個占用內(nèi)存空間少的,時間最少空間也最少的,有是最好,一般是沒有的,有時候是時間少了,空間可能就會多一些,空間少了時間可能就會多一些,一般來說是這樣的,上面的例子來說那就是高斯解法,這個最簡單了,時間也少空間也少,我們下面會專門來分析的 什么叫算法?我們給大家講一下相關(guān)的理論大家知道,一個算法通常具有5個特征:1. 輸入:你得有輸入,比如這個算法是輸入100還是1萬,就是上限,如果你都是從1開始的話,1就不用輸了2. 輸出:輸出什么意思,輸出就是最終的結(jié)果3. 可行性:我這個算法能算出來,5年之后這個算法就出來了,5年后黃花菜都涼了,生生再長長,長長再生生,那肯定不行,需要在有限的時間內(nèi)完成,對時間是有要求的4. 有窮性:別來個死循環(huán)就行5. 確定性:我同樣的一個問題,算法每次解決的結(jié)果都一樣這就是我們講的一些算法,再來看算法時間的復(fù)雜度.大家想一下,算法的時間復(fù)雜度用英文來表示,Time Complexity兩個單詞,他的名詞叫時間復(fù)雜度,它是沒說時間,時間和時間復(fù)雜度一樣嗎至少一說時間是什么啊,花了幾秒,幾微秒,那時間復(fù)雜呢,那就不是幾秒和幾微秒了,因?yàn)橐粋€算法到底花幾秒和幾微秒,這個你確定嗎,你是不確定的,為什么不確定,具體花多長時間隨著硬件的發(fā)展那個時間是沒有多大現(xiàn)實(shí)意義的,但是我同樣一個算法不管在什么樣的計(jì)算機(jī)上有一點(diǎn)是一樣的,同樣的一個算法寫了一個程序,我在不同的電腦上花的時間是不一樣的,但是有一點(diǎn)是一樣的,執(zhí)行語句的條數(shù)是一樣的,這一條算法都是這么多條語句唄,我把它都執(zhí)行了一遍,為什么有些快有些慢,因?yàn)镃PU的頻率不一樣,有快有慢,所以大家記住.時間頻度: 對于一個算法來說,我們獲取時間沒有實(shí)際的意義,我們不可能對每個算法都上機(jī)測試,算算他一共花了幾秒鐘,因?yàn)檫@是沒有實(shí)際意義的,但是我們知道,一個算法花費(fèi)的時間與算法中語句的執(zhí)行次數(shù)是成正比的,語句越多時間越多,語句越少花的時間就越少,所以我們就不算時間了,我們算一個算法中的語句的執(zhí)行次數(shù),一共執(zhí)行多少次,這就叫執(zhí)行次數(shù),這叫時間復(fù)雜度嗎,不叫,他叫時間頻度,用一個符號來 表示T(n),T是什么意思,T是Time,n就是問題的規(guī)模,你要運(yùn)行個for循環(huán),for循環(huán)最后那個數(shù)是多少,n代表問題的規(guī)模,但是你會發(fā)現(xiàn)呢,這個時間頻度,他不是時間復(fù)雜度,實(shí)際的過程中我們也很少去計(jì)算時間的頻度,比如說我們算了一下,比如一個算法我們費(fèi)了九牛二虎之力T(N)是不是代表時間頻度啊,T(n)=100000n2+10n+6T(n)+6,這是一個時間頻度,再來一個,T(n)=10n2+10n+6T(n)+6,后面又算了一個T(n)=n2,比如我們一共有三個算法,語句執(zhí)行次數(shù),結(jié)果你發(fā)現(xiàn)他們的最高次冪,是不是都是一樣的,最高次冪都是一樣的,當(dāng)我們衡量一個算法的時間頻度的時候,時間性能的話,我們會把這個問題再簡化一下,怎么簡化,叫時間復(fù)雜度時間復(fù)雜度: 我們想知道的是時間的規(guī)模,而不是具體的次數(shù),想知道時間的規(guī)模,而不是具體的次數(shù),所以我們引入了時間的復(fù)雜度,什么是時間的復(fù)雜度T(n)=100000n2+10n+6,T(n)=10n2+10n+6,T(n)=n2,這叫不叫時間的復(fù)雜度,這叫時間頻度,最高次冪不是n的平方嗎,低于n的平方的全部去掉常數(shù)項(xiàng)6去了,10n去了,最高的前面的系數(shù)10,也去了,常數(shù)低次冪也去了,前面的這個系數(shù)很大,當(dāng)n無窮大的時候系數(shù)100000還是一個常數(shù),你還是一個特別小的數(shù),大學(xué)學(xué)過數(shù)學(xué)應(yīng)該都知道這個問題了,我要把這個數(shù)也去了,上面是時間頻度一共算了多少次,我們不研究這么細(xì),我們只研究規(guī)模就可以了,最后你發(fā)現(xiàn)T(n)=n2,T(n)都是n的平方了,但是我們能這么寫嗎,不能這么寫,因?yàn)槿绻氵@么寫的話就會理解成都和T(n)=n2一樣,每個算法都是n的平方次,這個是具體的次數(shù),這個只是規(guī)模,你怎么表示規(guī)模呢,前面加上一個大O,這么來表示,Tn=O(n2)里面寫n的平方,這么來寫的話,他就不是時間頻度了,就不是具體執(zhí)行的次數(shù)了,而只是問題的規(guī)模,我們研究到這個層次啊,就可以了,沒有必要了,因?yàn)樽罡叩拇蝺?就決定了他的基本數(shù)量級了一定要知道時間復(fù)雜度,我們把這個講完之后總結(jié)一下,第一個回答我的問題什么叫時間復(fù)雜度?不是一個算法真正執(zhí)行的時間,不是幾秒幾毫秒,不是一個算法真正執(zhí)行的次數(shù),真正執(zhí)行的次數(shù)叫時間頻度,那時間復(fù)雜度是什么?是這個問題執(zhí)行的規(guī)模,這個規(guī)模和時間頻度是什么關(guān)系,去掉常數(shù)項(xiàng),去掉低次冪,去掉最高次冪的常數(shù),是不是用大O來表示,這個大家明確了,時間復(fù)雜度最壞時間復(fù)雜度和平均時間復(fù)雜度你們想一下我們在實(shí)際的學(xué)習(xí)中,要計(jì)算一個算法的復(fù)雜度,我們是求他最快的呢還是求他平均的呢,一般來說我們是求平均的,在這里告訴大家我們一般是求最壞時間復(fù)雜度,為什么呢?1. 第一個平均時間復(fù)雜度,太難求了,要花很多的時間來求這個,2. 還有一個你花半天勁把我求出來了,你會發(fā)現(xiàn)他跟最壞時間復(fù)雜度是一個級別的了,可能最壞時間復(fù)雜度后面有一個后綴,或者前面有個系數(shù),但是兩個是一個級別的,我們本來就不求次數(shù),我們要的是一個規(guī)模,所以基于這兩點(diǎn),我們一般討論最壞時間復(fù)雜度就可以了在這里我們認(rèn)識三個符號,以后我們討論時間復(fù)雜度,最多的是這個O,一般你把它叫做大哦就可以了,一見到大哦,我們就要明白,明白他是最壞時間復(fù)雜度,T(n)=n2他是時間復(fù)雜度的上界,他是最壞情況,有時候你會見到T(n)=Ω(n2),他叫Omega,所以我用漢子標(biāo)記一下歐米伽Omega是最好的情況,他是最好的時間復(fù)雜度,那還有一個,如果最好和最壞是同一個級別的,那我么就用這個符號θ西塔,如果你最好和最壞都是同一個級別的,T(n)=θ(n2),那我們就可以用這個符號來表示,這三個符號大家要知道,以后我們使用最多的還是Tn=O(n2)這個,叫大哦表示法,這是我們講的一些相關(guān)的概念。

?

總結(jié)

以上是生活随笔為你收集整理的算法和时间复杂度概念(一级)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。