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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法的时间复杂度(大O表示法)

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

首先我們先來看個例子, 我想找個1~100的數(shù)字`,你的目標是以最少的次數(shù)猜到這個數(shù)字。你每次猜測后,我會說小了、大了或?qū)α恕?/font>下面我們來看下兩種簡單的方法(方法有很多種),再來引入算法的運行時間!``

方法一(循環(huán)遍歷):

假設(shè)你從1開始依次往上猜,猜測過程會是這樣!


這是簡單查找,更準確的說法是傻找。每次猜測都只能排除一個數(shù)字。如果我想的數(shù)字是99,
你得猜99次才能猜到!

方法二(二分查找):

(如果我想的數(shù)字是99)首先從100中 找到中間的值50,然后和50比較,小了?繼續(xù)找中間值75,和75比較,小了?,繼續(xù)找中間值88,和88比較,小了?繼續(xù)找中間值94,和94比較,小了?繼續(xù)找中間值97,和97比較,小了?繼續(xù)找中間值99,和99比較,相等!最終找到了99這個數(shù)字!


使用二分查找時,每次都排除一半的數(shù)字!不管是哪個數(shù)字,你在7次之內(nèi)都能猜到,因為每次猜測都將排除很多數(shù)字!對于包含n個元素的列表,用二分查找最多需要 log?2n\log_2 nlog2?n步,而簡單查找最多需要n步。

你可能不記得什么是對數(shù)了,但很可能記得什么是冪。log10100相當于問“將多少個10相乘的結(jié)果為100”。答案是兩個:10 × 10 = 100。因此,log10100 = 2。對數(shù)運算是冪運算的逆運算。

22 ?\leftrightarrow? log24{log_2{4}}log2?4 = 2
23 ?\leftrightarrow? log28{log_2{8}}log2?8 = 3
24 ?\leftrightarrow? log216{log_2{16}}log2?16 = 4
對數(shù)是冪運算的逆運算 討論運行時間時,log指的都是log2。使用簡單查找法查找元素時,在最糟情況下需要查看每個元素。因此,如果列表包含8個數(shù)字,你最多需要檢查8個數(shù)字。而使用二分查找時,最多需要檢查log n個元素。如果列表包含8個元素,你最多需要檢查3個元素,因為log 8 = 3(23 = 8)。如果列表包含1024個元素,你最多需要檢查10個元素,因為log 1024 = 10(210 =1024)。`

大O 表示法

大O表示法是一種特殊的表示法,指出了算法的速度有多快。實際上,你經(jīng)常要使用別人編寫的算法,在這種情況下,知道這些算法的速度大有裨益。下面將介紹大O表示法是什么,并使用它列出一些最常見的算法運行時間。還是先來看個小例子!需要編寫一個查找算法, 這個算法在火箭即將登陸月球前開始執(zhí)行,幫助計算著陸地點,必須在10秒鐘內(nèi)找出著陸地點,否則火箭將偏離方向!為確保萬無一失,Bob需要計算列表包含100個元素的情況下需要的時間!

例子分析:

假設(shè)檢查一個元素需要1毫秒。使用簡單查找時,必須檢查100個元素,因此需要100毫秒才能查找完畢。而使用二分查找時,只需檢查7個元素(log2100log_2100log2?100大約為7),因此需要7毫秒就能查找完畢。然而,實際要查找的列表可能包含10億個元素,在這種情況下,簡單查找需要多長時間呢?二分查找又需要多長時間呢?Bob使用包含10億個元素的列表運行二分查找,運行時間為30毫秒(log21 000 000 000大約為30)。他心里想,二分查找的速度大約為簡單查找的15倍,因為列表包含100個元素時,簡單查找需要100毫秒,而二分查找需要7毫秒。因此,列表包含10億個元素時,簡單查找需要30 × 15 = 450毫秒,完全符合在10秒內(nèi)查找完畢的要求。Bob決定使用簡單查找。這是正確的選擇嗎?不是。實際上,Bob錯了,而且錯得離譜。列表包含10億個元素時,簡單查找需要10億毫秒,相當于11天!為什么會這樣呢?因為二分查找和簡單查找的運行時間的增速不同。

也就是說,隨著元素數(shù)量的增加,二分查找需要的額外時間并不多,而簡單查找需要的額外時間卻很多。因此,隨著列表的增長,二分查找的速度比簡單查找快得多。Bob以為二分查找速度為簡單查找的15倍,這不對:列表包含10億個元素時,為3300萬倍!有鑒于此,僅知道算法需要多長時間才能運行完畢還不夠,還需知道運行時間如何隨列表增長而增加。這正是大O表示法的用武之地。

大O表示法指出了算法有多快。例如,假設(shè)列表包含n個元素。簡單查找需要檢查每個元素,因此需要執(zhí)行n次操作。使用大O表示法,這個運行時間為O(n),二分查找需要執(zhí)行log2nlog_2 nlog2?n次操作。使用大O表示法,這個運行時間怎么表示呢?O(log2nlog_2 nlog2?n),單位秒呢?大O表示法指的并非以秒為單位的速度。大O表示法讓你能夠比較操作數(shù),它指出了算法運行時間的增速。一般而言,大O表示法像下面這樣:

這指出了算法需要執(zhí)行的操作數(shù)。之所以稱為大O表示法,是因為操作數(shù)前有個大O!

一些常見的大O 運行時間

下面按從快到慢的順序列出了你經(jīng)常會遇到的5種大O運行時間。

  • O(log n),也叫對數(shù)時間,這樣的算法包括二分查找(不懂點擊這里)。
  • O(n),也叫線性時間,這樣的算法包括簡單查找。
  • O(n * log n),快速排序——一種速度較快的排序算法。(不懂的點擊這里)
  • O(n2),選擇排序——一種速度較慢的排序算法。
  • O(n!),一種非常慢的算法。
  • 再看下例子,假設(shè)你要繪制一個包含16格的網(wǎng)格,且有5種不同的算法可供選擇,這些算法的運行時間如上所示。如果你選擇第一種算法,繪制該網(wǎng)格所需的操作數(shù)將為4(log 16 = 4)。假設(shè)你每秒可執(zhí)行10次操作,那么繪制該網(wǎng)格需要0.4秒。如果要繪制一個包含1024格的網(wǎng)格呢?這需要執(zhí)行10(log 1024 = 10)次操作,換言之,繪制這樣的網(wǎng)格需要1秒。這是使用第一種算法的情況。第二種算法更慢,其運行時間為O(n)。即要繪制16個格子,需要執(zhí)行16次操作;要繪制1024個格子,需要執(zhí)行1024次操作。執(zhí)行這些操作需要多少秒呢?下面按從快到慢的順序列出了使用這些算法繪制網(wǎng)格所需的時間:

    還有其他的運行時間,但這5種是最常見的。這里做了簡化,實際上,并不能如此干凈利索地將大O運行時間轉(zhuǎn)換為操作數(shù),但就目前而言,這種準確度足夠了。等學習其他一些算法后,回過頭來再次討論大O表示法。

    大O 運行時間平均情況,最佳情況和最糟情況

    就拿快速排序來說吧!假設(shè)你總是將第一個元素用作基準值,且要處理的數(shù)組是有序的。由于快速排序算法不檢查輸入數(shù)組是否有序,因此它依然嘗試對其進行排序。

    注意,數(shù)組并沒有被分成兩半,相反,其中一個子數(shù)組始終為空,這導致調(diào)用棧非常長。現(xiàn)在假設(shè)你總是將中間的元素用作基準值,在這種情況下,調(diào)用棧如下。

    調(diào)用棧短得多!因為你每次都將數(shù)組分成兩半,所以不需要那么多遞歸調(diào)用。你很快就到達
    了基線條件,因此調(diào)用棧短得多。第一個示例展示的是最糟情況,而第二個示例展示的是最佳情況。在最糟情況下,棧長為O(n),而在最佳情況下,棧長為O(log n)。現(xiàn)在來看看棧的第一層。你將一個元素用作基準值,并將其他的元素劃分到兩個子數(shù)組中。這涉及數(shù)組中的全部8個元素,因此該操作的時間為O(n)。在調(diào)用棧的第一層,涉及全部8個元素,但實際上,在調(diào)用棧的每層都涉及O(n)個元素。

    即便以不同的方式劃分數(shù)組,每次也將涉及O(n)個元素。

    因此,完成每層所需的時間都為O(n)。

    在這個示例中,層數(shù)為O(log n)(用技術(shù)術(shù)語說,調(diào)用棧的高度為O(log n)),而每層需要的時間為O(n)。因此整個算法需要的時間為O(n) * O(log n) = O(n log n)。這就是最佳情況。在最糟情況下,有O(n)層,因此該算法的運行時間為O(n) * O(n) = O(n2)。這里要告訴你的是,最佳情況也是平均情況。只要你每次都隨機地選擇一個數(shù)組元素作為基準值,快速排序的平均運行時間就將為O(n log n)。快速排序是最快的排序算法之一,也是D&C典范(divide and conquer 分而治之)

    總結(jié):
  • 算法的速度指的并非時間,而是操作數(shù)的增速。
  • 談?wù)撍惴ǖ乃俣葧r,我們說的是隨著輸入的增加,其運行時間將以什么樣的速度增加。
  • 算法的運行時間用大O表示法表示。
  • 例子中O(log n)比O(n)快,當需要搜索的元素越多時,前者比后者快得越多。
  • 總結(jié)

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

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