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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章學習了:如何分析、統計算法的執行效率和資源消耗? 點擊鏈接查看上一篇文章:復雜度分析上

今天的文章學習以下內容:

  • 最好情況時間復雜度
  • 最壞情況時間復雜度
  • 平均情況時間復雜度
  • 均攤時間復雜度

1、最好與最壞情況時間復雜度

我們首先來看一段代碼,利用上一篇文章學習的知識看看能否分析出它的時間復雜度。

// n 表示數組 array 的長度 int find(int[] array, int n, int x) {int i = 0;int pos = -1;for (; i < n; ++i) {if (array[i] == x) {pos = i;break;}}return pos; }

這段代碼很簡單:就是在一個數組中找到一個數X的下標,將其返回。

利用上一篇文章學習的大O表示法來分析時間復雜度的話,有一些問題。if循環中有一個breadk語句,當條件成立,得到下標值立馬退出循環。那么時間復雜度,就不能籠統的說是O(n)。

因為當想要查找的數就在第一個位置時,時間復雜度實際上是O(1),當想要查找的數在最后一個位置的時候,時間復雜度是O(n)。那么這個時候,我們就需要引入幾個新名詞:最好情況時間復雜度,最壞情況時間復雜度。

很容易理解。

  • 最好情況時間復雜度就是在最理想的情況下,執行代碼需要的時間復雜度。就像上述代碼,如果想要查找的數就是數組中的第一個位置,那么時間復雜度就是O(1),此時就是最好情況時間復雜度。
  • 最壞情況時間復雜度是在最不理想的情況下,執行代碼需要的時間復雜度。還是如上述代碼,入股我們想要查找的數在數組的最后一個位置,那么時間復雜度就是O(n),此時就是最壞情況時間復雜度。

其實還有一種情況,就是我們想要查找的數不在第一個位置也不在最后一個位置的時候。此時的時間復雜度是多少呢?這種情況下叫做平均情況時間復雜度

那么平均情況時間復雜度如何計算?它是多少呢?

2、平均情況時間復雜度

還是拿上面的代碼做例子。

想要計算出它的平均情況時間復雜度,有兩種方法,一種不嚴謹的感官上的方法,一種嚴格的概率上的方法。

  • 不嚴謹的感官上的方法
  • 我們知道,想要查找的數據x有兩種情況的存在,一種是存在數組的0~n-1的某一個位置(n種可能),一種是不在這個數組中(1中可能,就是不在數組中)。這兩種情況一共有n+1種可能。對于在數組中的n中可能中,每一種查找的次數分別是1,2,3,4…n。對于不在數組中的這種可能,查找次數是n。所以可以這么計算平均情況時間復雜度:

    (1+2+3+...+n+n)/(n+1)=n(n+3)/2(n+1)

    上一篇文章我們知道,利用大O表示法,,可以將計算結果的系數,低階,常量去掉。那么上述的結果就是O(n)。

    為什么說他不嚴謹呢?考慮以下情況。要找的數x存在于數組中與不存在于數組中的概率是否一樣?x存在的話。它存在于數組中每個位置的概率是否一樣?

    很明顯,上述方法沒有考慮概率的問題。

  • 概率的方法
  • 現在假設,x出現在數組中與不出現在數組中的概率是相等的,都是1/2.同時假設x如果出現在數組中,則它存在數組中的每一個位置的概率都是一樣的1/n。那么可以用如下方法計算平均情況時間復雜度。

    (1×1n×12+2×1n×12+3×1n×12+...+n×1n×12+n×12)=3n+14(1 \times \frac{1}{n} \times \frac{1}{2}+2 \times \frac{1}{n} \times \frac{1}{2} +3 \times \frac{1}{n} \times \frac{1}{2} +...+n \times \frac{1}{n} \times \frac{1}{2} + n \times \frac{1}{2})= \frac{3n+1}{4}1×n1?×21?+2×n1?×21?+3×n1?×21?+...+n×n1?×21?+n×21?=43n+1?

    利用大O表示法來表示的話,依然是O(n)。這就是上面那段代碼的平均情況時間復雜度。

    一般情況下,我們只是用其中一種復雜度來分析問題就夠了,不需要費力去求解三種時間復雜度。只有在時間復雜度有量級的差距時,才會在不同的情況下使用不同的時間復雜度。

    3、均攤時間復雜度

    上面學會了最好最壞與平均時間復雜度。還有一種時間復雜度叫做均攤時間復雜度。 為了理解均攤時間復雜度,我們先來看一個代碼:

    // array 表示一個長度為 n 的數組// 代碼中的 array.length 就等于 nint[] array = new int[n];int count = 0;void insert(int val) {if (count == array.length) {int sum = 0;for (int i = 0; i < array.length; ++i) {sum = sum + array[i];}array[0] = sum;count = 1;}array[count] = val;++count;}

    上述代碼的意思是:往數組中插入數據。當數組沒有滿的時候,直接在最后插入,當數組滿的時候,先把數組的所有元素求和,然后清空數組,將求得的和放到數組的第一個位置,然后將要插入的數插到第二個位置(聰明的人已經發現它其實就是一個求輸入流中所有數字的和,至于清空數組,這個只是將下標count從末尾挪到第二個位置,就可以認為是清空數組)。

    利用上述的分析,我們可以求得:

    • 最好情況時間復雜度:O(1),因為數組不滿的時候直接插入,不用計算和。
    • 最壞情況時間復雜度:O(n),因為此時數組滿了,需要遍歷一遍數組然后求和。

    平均時間復雜度,還可以利用上述的概率分析法來計算。假設數組長度是n,往數組插入數據會有兩種情況發生。數組沒滿時,插入的時間復雜度是O(1),且插入的位置有n種可能。數組滿時,插入的時間復雜度是O(n),插入的位置只有一種可能。所以一共有n+1種可能插入的位置,且插入到它們位置的概率是一樣的都是1/(n+1)。所以可以利用下面的方法計算平均情況時間復雜度:
    (1×1n+1+2×1n+1+3×1n+1+...+n×1n+1+n×1n+1)=O(1)(1 \times \frac{1}{n+1}+2 \times \frac{1}{n+1} +3 \times \frac{1}{n+1} +...+n \times \frac{1}{n+1} + n \times \frac{1}{n+1})= O(1)1×n+11?+2×n+11?+3×n+11?+...+n×n+11?+n×n+11?=O1

    所以

    • 平均情況時間復雜度:O(1)

    上述計算平均時間復雜度的方法,不管怎么樣,還是有一些復雜。畢竟我們不是研究數學的。所以還是希望盡可能簡單。

    針對上面的兩個代碼例子,一個是find函數,一個是insert函數??纯此麄冇惺裁床煌?strong>find函數是最極端的情況下時間復雜度是O(1),大多數的情況下時間復雜度是O(n),而insert函數是大多數情況下的時間復雜度是O(1),只有極端的情況下時間復雜度是O(n)。

    而且,對于insert函數,它的O(1)出現的是連續出現多次,然后出現一次O(n)時間復雜度。這具有一種時序關系。

    針對這種情況,給出一種特殊的時間復雜度分析方法,均攤時間復雜度。可以通過攤還分析法,的帶均攤時間復雜度。那么針對insert函數,如何通過攤還分析法來得到均攤時間復雜度呢?

    首先,對于insert函數,大多是出現O(1)時間復雜度的,一共出現n次O(1)時間復雜度后,才出現一次O(n)時間復雜度。雖然O(n)時間復雜度消耗的時間比較多,但是O(1)時間復雜度出現的次數多,我們可以將O(n)消耗的時間,均攤給其他n個O(1)時間復雜度操作上的話,對于O(1)時間復雜度,也并不會有多大的影響,就好比,100個人共同抬100斤水泥,而另外又有一個人在抬100斤水泥,如果這個人把水泥平均分給那100人,那100人也才每個人多抬了一斤的水泥,這相比讓那一個人抬100斤水泥,簡直不要太輕松!!!。 所以,對于insert函數均攤時間復雜度為O(1)。這等于大多數情況下的時間復雜度。

    綜上:

    • 均攤時間復雜度為:O(1)

    由以上的分析,我們得出,大概在以下情況下可以使用攤還分析來分析均攤時間復雜度

    對一個數據結構進行連續的操作,如果大多數情況下的時間復雜度比較低,只有極端情況下時間復雜度很高,而且這些操作在時序上存在前后連貫的關系。那么此時,就可以將比較耗時的那個操作,均攤給大多數低的時間復雜度的操作上。

    而且,一般可以用均攤時間復雜度分析的情況,均攤時間復雜度就等于最好情況時間復雜度

    4、總結

    上面學習了四種時間復雜度的分析。但是一般來說,平均時間復雜度用的很少,均攤時間復雜度用的就更少。而且,均攤時間復雜度,實際上是一種特殊的平均時間復雜度。

    所以不必糾結到底用什么復雜度來分析問題,根據實際問題需要實際分析。對于一段代碼,如果它的時間復雜度在不同情況下量級不同,可以采用不同的方法進行對比分析。其中最好最壞時間復雜度比較好分析,平均時間復雜度與均攤時間復雜度比較難分析。

    但是對于平均和均攤。他們實際是一個意思,都有平均的意思。當出現O(1)操作的多于O(n)操作的時候,平均和均攤時間復雜度就都是O(1)。 這是一種感覺。一般情況下,我們都可以感覺對,而不用實際的計算。

    本文是自己學習極客時間專欄-數據結構與算法之美后的筆記總結。如有侵權請聯系我刪除文章。

    學習探討加個人(免費送技術書籍PDF電子書):
    qq:1126137994
    微信:liu1126137994

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。