<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何從最壞、平均、最好的情況分析復(fù)雜度?

          共 1709字,需瀏覽 4分鐘

           ·

          2020-07-28 15:55

          前言

          你好,我是彤哥,一個每天爬二十六層樓還不忘讀源碼的硬核男人。

          上一節(jié),我們從事后統(tǒng)計法過渡到漸近分析法,詳細(xì)講解了如何進(jìn)行算法的復(fù)雜度分析。

          但是,如果遵循嚴(yán)格的漸近分析法,需要掌握大量數(shù)學(xué)知識,這無疑給我們評估算法的優(yōu)劣帶來了很大的挑戰(zhàn)。

          那么,有沒有更好地評估算法的方法呢?

          答案是必然的,本節(jié),我們就從最壞、平均、最好三種情況來分析分析復(fù)雜度。

          案例

          為了便于講解,我寫了一個小例子:

          public class LinearSearch {
          public static void main(String[] args) {
          int[] array = new int[]{1, 8, 9, 3, 5, 6, 10, 13};
          int index = search(array, 10);
          System.out.println("index=" + index);
          }

          private static int search(int[] array, int value) {
          for (int i = 0; i < array.length; i++) {
          if (array[i] == value) {
          return i;
          }
          }
          return -1;
          }
          }

          這個例子使用線性搜索從一個數(shù)組中查找一個元素,這個元素有可能存在,也有可能不存在于數(shù)組中。

          最壞情況

          在最壞情況下,要查找的元素不存在于數(shù)組中,此時,它的時間復(fù)雜度是多少呢?

          很簡單,必然需要遍歷完所有元素才會發(fā)現(xiàn)要查找的元素不存在于數(shù)組中。

          所以,最壞情況下,使用線性查找的時間復(fù)雜度為O(n)。

          平均情況

          在平均情況下,我們要照顧到每一個元素,此時,它的時間復(fù)雜度如何計算呢?

          在上一節(jié),我們已經(jīng)講過計算方式了,不過,這里考慮到有元素不存在于數(shù)組中,所以,是(n+1)種可能:

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

          所以,在平均情況下,忽略掉常數(shù)項(xiàng),使用線性查找的時間復(fù)雜度也是O(n)。

          為什么要忽略掉常數(shù)項(xiàng)?

          當(dāng)n趨向于無窮大的時候,常數(shù)項(xiàng)的意義不是很大,所以,可以忽略,比如(n+2)/2=n/2 + 1,n本身已經(jīng)趨向于無窮大,加不加1有什么意義呢,n的倍數(shù)是2還是1/2并不會有明顯的差別。

          同樣地,低階項(xiàng)一般也會抹掉,比如2n^2 + 3n + 1,當(dāng)n趨向于無窮大的時候,n^2的值是遠(yuǎn)遠(yuǎn)大于3n的,所以,不需要保留3n。

          所以,計算復(fù)雜度時通常都會把常數(shù)項(xiàng)和低階項(xiàng)抹掉,只保留高階項(xiàng)。

          最好情況

          最好情況是什么呢?

          如果我們要查找的元素正好是數(shù)組的第一個元素,查找一次就找到了,這無疑是最好的情況。

          所以,在最好情況下,使用線性查找的時間復(fù)雜度是O(1)。

          小結(jié)

          通過上面的分析,可以看到,最壞情況和最好情況是比較好評估的,而平均情況則比較難以計算。

          但是,最好情況又不能代表大多數(shù)樣本,且平均情況與最壞情況在省略常數(shù)項(xiàng)的情況下往往是比較接近的。

          所以,通常,我們使用最壞情況來評估算法的時間復(fù)雜度,這也是比較簡單的一種評估方法,且往往也是比較準(zhǔn)確的。

          后記

          本節(jié),我們從最壞、平均、最好三種情況分析了線性查找的時間復(fù)雜度,經(jīng)過詳細(xì)地分析,我們得出結(jié)論,通常使用最壞情況來評估算法的時間復(fù)雜度。

          請注意,我們這里使用了“通?!保f明有些情況是不能使用最壞情況來評估算法的時間復(fù)雜度的。

          那么,你知道什么情況下不能使用最壞情況來評估算法的時間復(fù)雜度嗎?

          下一節(jié),我們接著聊。

          關(guān)注公眾號“彤哥讀源碼”,解鎖更多源碼、基礎(chǔ)、架構(gòu)知識!

          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰在线中文字幕 | 精品国产污污污免费入口15 | 在线sm调教视频网站 | 久操成人毛片 | 日韩无码专区电影 |