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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法复杂度及渐进符号

發(fā)布時(shí)間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法复杂度及渐进符号 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法復(fù)雜度及漸進(jìn)符號(hào)

一、算法復(fù)雜度

每一個(gè)程序在運(yùn)行時(shí),都需要占用一定的計(jì)算機(jī)資源,比如內(nèi)存,磁盤,這些稱之為空間。
計(jì)算過程中需要判斷,循環(huán)執(zhí)行某些邏輯,周而反復(fù),這些是時(shí)間。

那么我們可以通過算法復(fù)雜度理論來衡量算法的效率。

復(fù)雜度有兩個(gè)維度:時(shí)間和空間。

  • 如果計(jì)算機(jī)的速度越快,那么這個(gè)算法時(shí)間復(fù)雜度越低
  • 如果占用的計(jì)算機(jī)資源越少,那么空間復(fù)雜度越低
  • 我們要選擇復(fù)雜度低的算法,衡量好空間和時(shí)間的消耗,選出適合特定場景的算法。

    二、算法規(guī)模

    例如:我們要計(jì)算1+2+3+…+100,那么最直觀的寫法

    package mainimport "fmt"func sum(n int) int {total := 0// 從1加到N,1+2+3+4+5....for i := 1; i <= n; i++ {total += i}return total }func main() {fmt.Println(sum(100)) }

    當(dāng)n是一個(gè)比較小的數(shù)字的時(shí)候計(jì)算很快,但是當(dāng)n接近無限大的時(shí)候,計(jì)算很慢。

    所以,算法衡量的是在不同問題規(guī)模n下,算法的速度。

    在這里,因?yàn)橐h(huán)計(jì)算n-1次,而當(dāng)n無限大的時(shí)候,常數(shù)項(xiàng)基本忽略不計(jì),所以這個(gè)算法的時(shí)間復(fù)雜度我們用**O(n)**表示。

    我們還有另外的計(jì)算方式:

    func sum2(n int) int {total := ((1 + n) * n) / 2return total }

    這次算法只需要執(zhí)行1次,所以這個(gè)算法的時(shí)間復(fù)雜度是O(1)。可以看出,時(shí)間復(fù)雜度為**O(1)的算法優(yōu)于算法復(fù)雜度為O(n)**的算法

    算法的優(yōu)先級(jí)排列如下,一般排在上面的要優(yōu)于排在下面的:

  • 常數(shù)復(fù)雜度:O(1)
  • 對數(shù)復(fù)雜度:O(logn)
  • 一次方復(fù)雜度:O(n)
  • 一次方乘對數(shù)復(fù)雜度:O(nlogn)
  • 乘方復(fù)雜度:O(n2),O(n3)
  • 指數(shù)復(fù)雜度:O(2^n)
  • 階乘復(fù)雜度:O(n!)
  • 無限大指數(shù)復(fù)雜度:O(n^n)
  • 三、漸進(jìn)符號(hào)

    如何量化一個(gè)復(fù)雜度,到底有多復(fù)雜,計(jì)算機(jī)抽象出了幾個(gè)復(fù)雜度漸進(jìn)符號(hào)。

    漸進(jìn)符號(hào)如下: O,ο,Θ,Ω,ω

    分別讀作:Omicron(大歐),omicron(小歐),Theta(西塔),Omega(大歐米伽),omega(小歐米伽)。

    3.1.漸進(jìn)符號(hào):θ

    假設(shè)算法A的運(yùn)行時(shí)間表達(dá)式:

    T(n) = 5 * n^3 + 4 * n^2

    如果問題規(guī)模n足夠大,那么低次方的獎(jiǎng)項(xiàng)將無足輕重,運(yùn)行時(shí)間取決于高次方的第一項(xiàng):5 * n^3。

    隨著n的增大,第一項(xiàng)中的常數(shù)也不重要了,所以算法A的運(yùn)行時(shí)間T(n)約等于n^3,記為:

    T(n) = θ(n^3)

    Θ 的數(shù)學(xué)含義:

    設(shè) f(n) 和 g(n) 是定義域 n 為自然數(shù)集合的函數(shù),兩個(gè)函數(shù)同階,也就是當(dāng) n 無窮大時(shí),f(n)/g(n) 等于某個(gè)大于0的常數(shù) c。

    也可以說,存在正常量 c1,c2 和 n0,對于所有 n >= n0,有 0 <= c1 * g(n) <= f(n) <= c2 * g(n)。

    那么可以記 f(n) = Θ(g(n)),g(n) 是 f(n) 的漸進(jìn)緊確界。

    3.2. 漸進(jìn)符號(hào):

    O 的數(shù)學(xué)含義:

    設(shè) f(n) 和 g(n) 是定義域 n 為自然數(shù)集合的函數(shù), f(n) 函數(shù)的階不高于 g(n) 函數(shù)的階。

    也可以說,存在正常量 c 和 n0,對于所有 n >= n0,有 0 <= f(n) <= c * g(n)。

    那么可以記 f(n) = O(g(n))。g(n) 是 f(n) 的漸進(jìn)上界。

    3.3. 漸進(jìn)符號(hào):Ω

    Ω 的數(shù)學(xué)含義:

    設(shè) f(n) 和 g(n) 是定義域 n 為自然數(shù)集合的函數(shù), f(n) 函數(shù)的階不低于 g(n) 函數(shù)的階。

    也可以說,存在正常量 c 和 n0,對于所有 n >= n0,有 0 <= cg(n) <= f(n)。

    那么可以記 f(n) = Ω(g(n))。g(n) 是 f(n) 的漸進(jìn)下界。

    3.4. 漸進(jìn)分析

    上面的定義很復(fù)雜,我們可以來看圖:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-eAR81BRb-1646902918628)(E:\筆記\Go數(shù)據(jù)結(jié)構(gòu)與算法\Go筆記圖片\degree.png)]

    當(dāng) n 值超過某個(gè)值時(shí),f(n) 被 g(n) 兩條線夾在中間,那么 g(n) 就是漸進(jìn)緊確界。

    如果 g(n) 的線在上面,就是漸進(jìn)上界。

    如果 g(n) 線在下面,就是漸進(jìn)下界。

    我們一般會(huì)評(píng)估一個(gè)算法的漸進(jìn)上界 O,因?yàn)檫@表示算法的最壞情況,這個(gè)上界可以十分不準(zhǔn)確,但我們一般會(huì)評(píng)估得足夠準(zhǔn)確,比如:

    設(shè) f(n) = 5 * n^3 + 4 * n^2,我們要求漸進(jìn)上界。

    那么:

    f(n) = O(n^3),g(n) = n^3 f(n) = O(n^4),g(n) = n^4

    兩個(gè) g(n) 都是上界,因?yàn)榱?c = 5 時(shí)都存在:0 <= f(n) <= c * g(n))。

    我們會(huì)取乘方更小的那個(gè),因?yàn)檫@個(gè)界更逼近 f(n) 本身,所以我們一般說 f(n) = O(n^3),算法的復(fù)雜度為大歐 n 的三次方,表示最壞情況。

    同理,漸進(jìn)下界 Ω 剛好與漸進(jìn)上界相反,表示最好情況。比如還是這個(gè)假設(shè):

    設(shè) f(n) = 5 * n^3 + 4 * n^2,我們要求漸進(jìn)下界。

    那么:

    f(n) = Ω(n^3),g(n) = n^3 f(n) = Ω(n^2),g(n) = n^2

    兩個(gè) g(n) 都是下界,因?yàn)榱?c =5 時(shí)都存在:0 <= cg(n) <= f(n)。

    我們準(zhǔn)確評(píng)估的時(shí)候,要取乘方更大的那個(gè),因?yàn)檫@個(gè)界更逼近 f(n) 本身,所以我們一般說 f(n) = Ω(n^3),算法的復(fù)雜度為大歐米伽 n 的三次方,表示最好情況。

    我們發(fā)現(xiàn)當(dāng) f(n) = Ω(n^3) = O(n^3) 時(shí),其實(shí) f(n) = Θ(n)。

    另外兩個(gè)漸進(jìn)符號(hào) ο 和 ω 一般很少使用,指不那么緊密的上下界。

    也就是評(píng)估的時(shí)候,不那么準(zhǔn)確去評(píng)估,在評(píng)估最壞情況的時(shí)候使勁地往壞了評(píng)估,評(píng)估最好情況則使勁往好的評(píng)估,但是它不能剛剛好,比如上面的結(jié)果:

    f(n) = O(n^3),g(n) = n^3 f(n) = O(n^4),g(n) = n^4 f(n) = Ω(n^3),g(n) = n^3 f(n) = Ω(n^2),g(n) = n^2

    我們可以說:

    f(n) = ο(n^4),g(n) = n^4 往高階的評(píng)估,不能同階 f(n) = ω(n^2),g(n) = n^2 往低階的評(píng)估,不能同階

    四、總結(jié)

    記號(hào)含義通俗理解
    Θ緊確界相當(dāng)于"="
    O上界相當(dāng)于"<="
    ο非緊的上界相當(dāng)于"<"
    Ω下界相當(dāng)于">="
    ω非緊的下界相當(dāng)于">"

    我們一般用 O 漸進(jìn)上界來評(píng)估一個(gè)算法的時(shí)間復(fù)雜度,表示逼近的最壞情況。其他漸進(jìn)符合基本不怎么使用。

    緊確界 | 相當(dāng)于"=" |
    | O | 上界 | 相當(dāng)于"<=" |
    | ο | 非緊的上界 | 相當(dāng)于"<" |
    | Ω | 下界 | 相當(dāng)于">=" |
    | ω | 非緊的下界 | 相當(dāng)于">" |

    我們一般用 O 漸進(jìn)上界來評(píng)估一個(gè)算法的時(shí)間復(fù)雜度,表示逼近的最壞情況。其他漸進(jìn)符合基本不怎么使用。

    總結(jié)

    以上是生活随笔為你收集整理的算法复杂度及渐进符号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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