国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』③ - 算法分析專業(yè)工具——大O記法

這篇具有很好參考價值的文章主要介紹了『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』③ - 算法分析專業(yè)工具——大O記法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

本文內(nèi)容借鑒一本我非常喜歡的書——《數(shù)據(jù)結(jié)構(gòu)與算法圖解》。學(xué)習(xí)之余,我決定把這本書精彩的部分摘錄出來與大家分享。??


大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言?

?文章來源地址http://www.zghlxwxcb.cn/news/detail-596601.html

寫在前面

從之前的章節(jié)中我們了解到,影響算法性能的主要因素是其所需的步數(shù)。

然而,我們不能簡單地把一個算法記為“22步算法”,把另一個算法記為“400步算法”,因為一個算法的步數(shù)并不是固定的。

以線性查找為例,它的步數(shù)等于數(shù)組的元素數(shù)量。如果數(shù)組有22個元素,線性查找就需要 22步;如果數(shù)組有 400個元素,線性查找就需要 400步。

量化線性查找效率的更準(zhǔn)確的方式應(yīng)該是:對于具有 N 個元素的數(shù)組,線性查找最多需要 N步。

為了方便表達(dá)數(shù)據(jù)結(jié)構(gòu)和算法的時間復(fù)雜度,計算機科學(xué)家從數(shù)學(xué)界借鑒了一種簡潔又通用的方式,那就是大 O 記法。

掌握了大 O記法,就掌握了算法分析的專業(yè)工具。


1.大O:數(shù)步數(shù)

為了統(tǒng)一描述,大 O不關(guān)注算法所用的時間,只關(guān)注其所用的步數(shù)。

第 1章介紹過,數(shù)組不論多大,讀取都只需 1步。用大 O記法來表示,就是:O(1)

O(1)意味著一種算法無論面對多大的數(shù)據(jù)量,其步數(shù)總是相同的。

就像無論數(shù)組有多大,讀取元素都只要 1 步。這 1 步在舊機器上也許要花 20 分鐘,而用現(xiàn)代的硬件卻只要 1 納秒。但這兩種情況下,讀取數(shù)組都是 1步。其他也屬于 O(1)的操作還包括數(shù)組末尾的插入與刪除。之前已證明,無論數(shù)組有多大,這兩種操作都只需 1步,所以它們的效率都是O(1)。

下面研究一下大 O 記法如何描述線性查找的效率。回想一下,線性查找在數(shù)組上要逐個檢查每個格子。在最壞情況下,線性查找所需的步數(shù)等于格子數(shù)。即如前所述:對于 N個元素的數(shù)組,線性查找需要花 N步。

用大 O記法來表示,即為:O(N)


2.常數(shù)時間與線性時間

從 O(N)可以看出,大 O 記法不只是用固定的數(shù)字(如 22、440)來表示算法的步數(shù),而是基于要處理的數(shù)據(jù)量來描述算法所需的步數(shù)。

或者說,大 O 解答的是這樣的問題:當(dāng)數(shù)據(jù)增長時,步數(shù)如何變化?

O(N)算法所需的步數(shù)等于數(shù)據(jù)量,意思是當(dāng)數(shù)組增加一個元素時,O(N)算法就要增加 1步。而 O(1)算法無論面對多大的數(shù)組,其步數(shù)都不變。

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

當(dāng)數(shù)據(jù)增加一個單位時,算法也隨之增加一步。也就是說,數(shù)據(jù)越多,算法所需的步數(shù)就越多。O(N)也被稱為線性時間。

相比之下,O(1)則為一條水平線,因為不管數(shù)據(jù)量是多少,算法的步數(shù)都恒定。所以,O(1)也被稱為為常數(shù)時間。

因為大 O主要關(guān)注的是數(shù)據(jù)量變動時算法的性能變化,所以,即使一個算法的恒定步數(shù)不是 1,它也可以被歸類為 O(1)。

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

O(1)永遠(yuǎn)比O(N)更高效,原因在于,當(dāng)元素數(shù)量無限增多時,O(N)總會在某一臨界值超過O(1)。


3.同一算法,不同場景

之前的章節(jié)我們提到,線性查找并不總是 O(N)的。當(dāng)要找的元素在數(shù)組末尾,那確實是 O(N)。但如果它在數(shù)組開頭,1步就能找到的話,那么技術(shù)上來說應(yīng)該是 O(1)。所以概括來說,線性查找的最好情況是 O(1),最壞情況是 O(N)。

雖然大 O 可以用來表示給定算法的最好和最壞的情景,但若無特別說明,大 O 記法一般都是指最壞情況。

這種悲觀主義其實是很有用的:知道各種算法會差到什么程度,能使我們做好最壞打算,以選出最適合的算法。


4.第三種算法

上一章我們學(xué)到:在同一個有序數(shù)組里,二分查找比線性查找要快。

算法為何重要(二分查找)http://t.csdn.cn/YPs4s下面就來看看如何用大O記法描述二分查找。

二分查找的大 O記法是:O(log N)

簡單分析一下,倘若要用二分查找在含有N個元素的有序數(shù)組中查找某個元素。

二分查找的基本思想是,每次我們都能排除掉一半的數(shù)據(jù)。

所以考慮最壞情況,就是數(shù)組里沒有我們要查找的元素,那么我們每次排除一半的元素,多

少次才能全部排除(或者說只剩一個元素)呢?

答案是??。

簡單來說,O(log N)意味著該算法當(dāng)數(shù)據(jù)量翻倍時,步數(shù)加 1。

這里我們所提過的 3種時間復(fù)雜度,按照效率由高到低來排序的話,會是這樣:

O(1)<O(log N)<O(N)

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

現(xiàn)在回到大 O記法。當(dāng)我們說 O(log N)時,其實指的是 O(log 2 N),不過為了方便就省略了2而已。簡單來說,O(log N)算法的步數(shù)等于二分?jǐn)?shù)據(jù)直至元素剩余 1 個的次數(shù)。

下表是 O(N)和 O(log N)的效率對比。

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

每次數(shù)據(jù)量翻倍時,O(N)算法的步數(shù)也跟著翻倍,O(log N)算法卻只需加 1。

總結(jié)

學(xué)會大 O記法,我們在比較算法時就有了一致的參考系。有了它,我們就可以在現(xiàn)實場景中測量各種數(shù)據(jù)結(jié)構(gòu)和算法,寫出更快的代碼,更輕松地應(yīng)對高負(fù)荷的環(huán)境。?

下一章會用一個實際的例子,讓你看到大 O記法如何幫助我們顯著地提高代碼的性能。

大o記法,排序算法(C語言版),新星計劃免費學(xué)習(xí)專欄·數(shù)據(jù)結(jié)構(gòu)與算法,算法,數(shù)據(jù)結(jié)構(gòu),c語言

?

到了這里,關(guān)于『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』③ - 算法分析專業(yè)工具——大O記法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語言)】復(fù)雜鏈表(隨機指針,隨機鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語言)】復(fù)雜鏈表(隨機指針,隨機鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    目錄 ?1.隨機鏈表的復(fù)制 1.2題目描述? 1.3題目分析 1.4解題: 2.順序表和鏈表對比 2.1cpu高速緩存利用率 3.結(jié)語 一個長度為? n ?的鏈表,每個節(jié)點包含一個額外增加的隨機指針? random ? 該指針可以指向鏈表中的任何節(jié)點或空節(jié)點。? ? ? ? 構(gòu)造這個鏈表的? 深拷貝 。?深拷貝

    2024年03月10日
    瀏覽(94)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』① - 數(shù)據(jù)結(jié)構(gòu)為何重要

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』① - 數(shù)據(jù)結(jié)構(gòu)為何重要

    本文內(nèi)容借鑒一本我非常喜歡的書——《數(shù)據(jù)結(jié)構(gòu)與算法圖解》。學(xué)習(xí)之余,我決定把這本書精彩的部分摘錄出來與大家分享。 數(shù)組是計算機科學(xué)中最基本的數(shù)據(jù)結(jié)構(gòu)之一。如果你用過數(shù)組,那么應(yīng)該知道它就是一個含有 數(shù)據(jù)的列表。它有多種用途,適用于各種場景,下面

    2024年02月16日
    瀏覽(37)
  • go專業(yè)數(shù)據(jù)結(jié)構(gòu)與算法

    go專業(yè)數(shù)據(jù)結(jié)構(gòu)與算法

    2.數(shù)組概念 3.golang實現(xiàn)數(shù)組結(jié)構(gòu) 4.golang實現(xiàn)數(shù)組迭代器 5.數(shù)組棧的高級實現(xiàn) 6.棧模擬低級遞歸 7.斐波那契數(shù)列棧模擬遞歸 8.遞歸實現(xiàn)文件夾遍歷 9.棧模擬文件遞歸 10.層級展示文件夾 11.數(shù)組隊列的實現(xiàn) 12.隊列實現(xiàn)遍歷文件夾 13.循環(huán)隊列 14.鏈?zhǔn)綏?15.鏈?zhǔn)疥犃?16.作業(yè) 17.為什么需

    2024年02月13日
    瀏覽(21)
  • C語言完整版筆記(初階,進(jìn)階,深刨,初階數(shù)據(jù)結(jié)構(gòu))

    1.初階: 1.1C語言初階易忘知識點速記 2.進(jìn)階:? 1.2C語言進(jìn)階易忘點速記 3.深剖: 2.1C語言重點解剖要點速記 2.2C語言重點解剖操作符要點速記?? 2.3C語言重點解剖預(yù)處理要點速記 2.4C語言重點解剖指針和數(shù)組要點速記 2.5C語言重點解剖內(nèi)存管理函數(shù)要點速記 4.數(shù)據(jù)結(jié)構(gòu):

    2024年02月16日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)初階(用C語言實現(xiàn)簡單數(shù)據(jù)結(jié)構(gòu))--棧和隊列

    數(shù)據(jù)結(jié)構(gòu)初階(用C語言實現(xiàn)簡單數(shù)據(jù)結(jié)構(gòu))--棧和隊列

    ??歡迎來到T_X_Parallel的博客?。??????????博客主頁:T_X_Parallel ?????????專欄 : 數(shù)據(jù)結(jié)構(gòu)初階 ?????????歡迎關(guān)注:??點贊??收藏??留言 這小貓真好看 言歸正傳,通過上篇有關(guān)順序表和鏈表的博客,可以了解到線性表的一些大致特征,這篇博

    2024年02月08日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】之堆(C語言實現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)初階】之堆(C語言實現(xiàn))

    前言 :在二叉樹基礎(chǔ)篇我們提到了二叉樹的順序?qū)崿F(xiàn),今天讓我們來學(xué)習(xí)一下特殊的二叉樹———堆的相關(guān)知識。 ?? 博客主頁: 小鎮(zhèn)敲碼人 ?? 熱門專欄:數(shù)據(jù)結(jié)構(gòu)與算法 ?? 歡迎關(guān)注:??點贊 ????留言 ??收藏 ?? 任爾江湖滿血骨,我自踏雪尋梅香。 萬千浮云遮碧月

    2024年04月09日
    瀏覽(26)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑤ - 選擇排序

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑤ - 選擇排序

    本文內(nèi)容借鑒一本我非常喜歡的書——《數(shù)據(jù)結(jié)構(gòu)與算法圖解》。學(xué)習(xí)之余,我決定把這本書精彩的部分摘錄出來與大家分享。 ??? 目錄 寫在前面 1.選擇排序 2.選擇排序?qū)崙?zhàn) 3.選擇排序的實現(xiàn) 4.選擇排序的效率 5.忽略常數(shù) 6.大O的作用 7.總結(jié) ? ? 大 O 是一種能夠比較算法效

    2024年02月14日
    瀏覽(81)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』④ - 冒泡排序

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』④ - 冒泡排序

    ? 本文內(nèi)容借鑒一本我非常喜歡的書——《數(shù)據(jù)結(jié)構(gòu)與算法圖解》。學(xué)習(xí)之余,我決定把這本書精彩的部分摘錄出來與大家分享。 ?? ? 本章內(nèi)容 寫在前面 1.冒泡排序 2.冒泡排序?qū)崙?zhàn) 3.冒泡排序的實現(xiàn) 4.冒泡排序的效率 5.二次問題 6.線性解決 7.總結(jié) ? ? 大 O記法能客觀地衡量

    2024年02月16日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)初階之順序表(C語言實現(xiàn))

    順序表是數(shù)據(jù)結(jié)構(gòu)里面很基礎(chǔ)的一類,它是線性表的一種,其它線性表還有鏈表、棧和隊列等,今天來和博主一起學(xué)習(xí)關(guān)于順序表的知識吧。 順序表,它分為兩類: 動態(tài)順序表 和 靜態(tài)順序表 ,這兩個表的區(qū)別就是 前者的空間不固定 ,是 支持?jǐn)U容 的,后者的 空間是固定

    2024年02月03日
    瀏覽(24)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑥ - 插入排序&希爾排序

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』⑥ - 插入排序&希爾排序

    學(xué)習(xí)目標(biāo) 寫在前面 1.插入排序 2.插入排序?qū)崙?zhàn)? 3.插入排序的實現(xiàn)? 4.插入排序的效率 5.平均情況 6.希爾排序 7.希爾排序的實現(xiàn) 8.希爾排序的效率 9.總結(jié) ? 之前我們衡量一個算法的效率時,都是著眼于它在最壞情況下需要多少步。原因很簡單,連最壞的情況都做足準(zhǔn)備了,其

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包