<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      算法(一)時間復雜度

      1.算法的效率

      雖然計算機能快速的完成運算處理,但實際上,它也需要根據輸入數據的大小和算法效率來消耗一定的處理器資源。要想編寫出能高效運行的程序,我們就需要考慮到算法的效率。
      算法的效率主要由以下兩個復雜度來評估:
      時間復雜度:評估執行程序所需的時間??梢怨浪愠龀绦驅μ幚砥鞯氖褂贸潭?。
      空間復雜度:評估執行程序所需的存儲空間??梢怨浪愠龀绦驅τ嬎銠C內存的使用程度。

      設計算法時,一般是要先考慮系統環境,然后權衡時間復雜度和空間復雜度,選取一個平衡點。不過,時間復雜度要比空間復雜度更容易產生問題,因此算法研究的主要也是時間復雜度,不特別說明的情況下,復雜度就是指時間復雜度。

      2.時間復雜度

      時間頻度
      一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,只需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。并且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

      時間復雜度
      前面提到的時間頻度T(n)中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什么規律,為此我們引入時間復雜度的概念。一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數,記作T(n)=O(f(n)),它稱為算法的漸進時間復雜度,簡稱時間復雜度

      3.大O表示法

      像前面用O( )來體現算法時間復雜度的記法,我們稱之為大O表示法。
      算法復雜度可以從最理想情況、平均情況和最壞情況三個角度來評估,由于平均情況大多和最壞情況持平,而且評估最壞情況也可以避免后顧之憂,因此一般情況下,我們設計算法時都要直接估算最壞情況的復雜度,而大O表示法O(f(n)就是指出了算法最壞情況下的運行時間。
      大O表示法O(f(n)中的f(n)的值可以為1、n、logn、n2等,因此我們可以將O(1)、O(n)、O(logn)、O(n2)分別可以稱為常數階、線性階、對數階和平方階,那么如何推導出f(n)的值呢?我們接著來看推導大O階的方法。

      推導大O階
      推導大O階,我們可以按照如下的規則來進行推導,得到的結果就是大O表示法:
      1.用常數1來取代運行時間中所有加法常數。
      2.修改后的運行次數函數中,只保留最高階項
      3.如果最高階項存在且不是1,則去除與這個項相乘的常數。

      在前面大O表示法的語言描述可能有些晦澀難懂,這里用通俗的語言來說,

      常數階
      先舉了例子,如下所示。

      int sum = 0,n = 100; //執行一次  
      sum = (1+n)*n/2; //執行一次  
      System.out.println (sum); //執行一次

      上面算法的運行的次數的函數為f(n)=3,根據推導大O階的規則1,我們需要將常數3改為1,則這個算法的時間復雜度為O(1)。如果sum = (1+n)*n/2這條語句再執行10遍,因為這與問題大小n的值并沒有關系,所以這個算法的時間復雜度仍舊是O(1),我們可以稱之為常數階。

      線性階
      線性階主要要分析循環結構的運行情況,如下所示。

      for(int i=0;i<n;i++){
      //時間復雜度為O(1)的算法
      ...
      }

      上面算法循環體中的代碼執行了n次,因此時間復雜度為O(n)。

      對數階
      接著看如下代碼:

      int number=1;
      while(number<n){
      number=number*2;
      //時間復雜度為O(1)的算法
      ...
      }

      可以看出上面的代碼,隨著number每次乘以2后,都會越來越接近n,當number不小于n時就會退出循環。假設循環的次數為X,則由2^x=n得出x=log?n,因此得出這個算法的時間復雜度為O(logn)。

      平方階
      下面的代碼是循環嵌套:

      for(int i=0;i<n;i++){   
          for(int j=0;j<n;i++){
             //復雜度為O(1)的算法
             ... 
          }
      }

      內層循環的時間復雜度在講到線性階時就已經得知是O(n),現在經過外層循環n次,那么這段算法的時間復雜度則為O(n2)。
      接下來我們來算一下下面算法的時間復雜度:

      for(int i=0;i<n;i++){   
          for(int j=i;j<n;i++){
             //復雜度為O(1)的算法
             ... 
          }
      }

      需要注意的是內循環中int j=i,而不是int j=0。當i=0時,內循環執行了n次;i=1時內循環執行了n-1次,當i=n-1時執行了1次,我們可以推算出總的執行次數為:

      n+(n-1)+(n-2)+(n-3)+……+1
      =(n+1)+[(n-1)+2]+[(n-2)+3]+[(n-3)+4]+……
      =(n+1)+(n+1)+(n+1)+(n+1)+……
      =(n+1)n/2
      =n(n+1)/2
      =n2/2+n/2

      根據此前講過的推導大O階的規則的第二條:只保留最高階,因此保留n2/2。根據第三條去掉和這個項的常數,則去掉1/2,最終這段代碼的時間復雜度為O(n2)。

      其他常見復雜度

      除了常數階、線性階、平方階、對數階,還有如下時間復雜度:
      f(n)=nlogn時,時間復雜度為O(nlogn),可以稱為nlogn階。
      f(n)=n3時,時間復雜度為O(n3),可以稱為立方階。
      f(n)=2?時,時間復雜度為O(2?),可以稱為指數階。
      f(n)=n!時,時間復雜度為O(n!),可以稱為階乘階。
      f(n)=(√n時,時間復雜度為O(√n),可以稱為平方根階。

      4.復雜度的比較

      下面將算法中常見的f(n)值根據幾種典型的數量級來列成一張表,根據這種表,我們來看看各種算法復雜度的差異。

      nlogn√nnlognn22?n!
      5 2 2 10 25 32 120
      10 3 3 30 100 1024 3628800
      50 5 7 250 2500 約10^15 約3.0*10^64
      100 6 10 600 10000 約10^30 約9.3*10^157
      1000 9 31 9000 1000 000 約10^300 約4.0*10^2567

      從上表可以看出,O(n)、O(logn)、O(√n )、O(nlogn )隨著n的增加,復雜度提升不大,因此這些復雜度屬于效率高的算法,反觀O(2?)和O(n!)當n增加到50時,復雜度就突破十位數了,這種效率極差的復雜度最好不要出現在程序中,因此在動手編程時要評估所寫算法的最壞情況的復雜度。

      下面給出一個更加直觀的圖:

      其中x軸代表n值,y軸代表T(n)值(時間復雜度)。T(n)值隨著n的值的變化而變化,其中可以看出O(n!)和O(2?)隨著n值的增大,它們的T(n)值上升幅度非常大,而O(logn)、O(n)、O(nlogn)隨著n值的增大,T(n)值上升幅度則很小。
      常用的時間復雜度按照耗費的時間從小到大依次是:

      O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2?)<O(n!)

       

      posted on 2016-10-19 22:04  安卓筆記俠  閱讀(764)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 三级网站视频在在线播放| 国产一区二区日韩在线| 亚洲国产精品无码av| 中文字幕av中文字无码亚| 中文字幕有码日韩精品| 国产性色av免费观看| av激情亚洲男人的天堂| 老色99久久九九爱精品| 骚虎视频在线观看| 五月丁香激激情亚洲综合| 久久精品国产再热青青青 | 最近日本免费观看高清视频| 一区二区在线观看成人午夜| 91精品国产老熟女在线| 日韩中文字幕精品人妻| 伊人久久精品久久亚洲一区| 97视频精品全国免费观看| 在线精品国产成人综合| 年日韩激情国产自偷亚洲| 色老头亚洲成人免费影院| 欧美乱码卡一卡二卡四卡免费| 广西| 国产成人亚洲日韩欧美| 色欲狠狠躁天天躁无码中文字幕| 丰满人妻AV无码一区二区三区| 99精品视频在线观看免费蜜桃| 国产一区二区三区AV在线无码观看| 欧洲美熟女乱av在免费| 口爆少妇在线视频免费观看| 激情综合网一区二区三区| 午夜福利看片在线观看| 色悠悠国产精品免费在线| 日韩乱码人妻无码中文字幕视频| 好男人社区在线www| 人妻一区二区三区三区| 一本加勒比hezyo无码专区| 亚洲一区二区三区18禁| 国产精品亚洲二区在线播放| 美女黄18以下禁止观看| 中文字幕理伦午夜福利片| 枣庄市|