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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法复杂度及渐进符号

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

算法復(fù)雜度及漸進符號

一、算法復(fù)雜度

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

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

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

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

    二、算法規(guī)模

    例如:我們要計算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是一個比較小的數(shù)字的時候計算很快,但是當(dāng)n接近無限大的時候,計算很慢。

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

    在這里,因為要循環(huán)計算n-1次,而當(dāng)n無限大的時候,常數(shù)項基本忽略不計,所以這個算法的時間復(fù)雜度我們用**O(n)**表示。

    我們還有另外的計算方式:

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

    這次算法只需要執(zhí)行1次,所以這個算法的時間復(fù)雜度是O(1)??梢钥闯?#xff0c;時間復(fù)雜度為**O(1)的算法優(yōu)于算法復(fù)雜度為O(n)**的算法

    算法的優(yōu)先級排列如下,一般排在上面的要優(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)
  • 三、漸進符號

    如何量化一個復(fù)雜度,到底有多復(fù)雜,計算機抽象出了幾個復(fù)雜度漸進符號。

    漸進符號如下: O,ο,Θ,Ω,ω

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

    3.1.漸進符號:θ

    假設(shè)算法A的運行時間表達式:

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

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

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

    T(n) = θ(n^3)

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

    設(shè) f(n) 和 g(n) 是定義域 n 為自然數(shù)集合的函數(shù),兩個函數(shù)同階,也就是當(dāng) n 無窮大時,f(n)/g(n) 等于某個大于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) 的漸進緊確界。

    3.2. 漸進符號:

    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) 的漸進上界。

    3.3. 漸進符號:Ω

    Ω 的數(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) 的漸進下界。

    3.4. 漸進分析

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

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

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

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

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

    我們一般會評估一個算法的漸進上界 O,因為這表示算法的最壞情況,這個上界可以十分不準(zhǔn)確,但我們一般會評估得足夠準(zhǔn)確,比如:

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

    那么:

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

    兩個 g(n) 都是上界,因為令 c = 5 時都存在:0 <= f(n) <= c * g(n))。

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

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

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

    那么:

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

    兩個 g(n) 都是下界,因為令 c =5 時都存在:0 <= cg(n) <= f(n)。

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

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

    另外兩個漸進符號 ο 和 ω 一般很少使用,指不那么緊密的上下界。

    也就是評估的時候,不那么準(zhǔn)確去評估,在評估最壞情況的時候使勁地往壞了評估,評估最好情況則使勁往好的評估,但是它不能剛剛好,比如上面的結(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 往高階的評估,不能同階 f(n) = ω(n^2),g(n) = n^2 往低階的評估,不能同階

    四、總結(jié)

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

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

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

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

    總結(jié)

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

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