天天看點

算法時間複雜度_算法第一步之時間複雜度

算法時間複雜度_算法第一步之時間複雜度

前言

算法的效率主要取決于時間複雜度和空間複雜度,我們一步一步來搞懂算法時間複雜度。

定義

在計算機科學中,算法的時間複雜度(Time complexity)是一個函數,它定性描述該算法的運作時間。這是一個代表算法輸入值的字元串的長度的函數。時間複雜度常用大O符号表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。——維基百科

有點沒搞懂?我們來用

C++

簡單舉例來說明。

執行個體

include<iostream>
using namespace std;
int main()
{
  int n = 10;
  for (int k = 0; k < n; k++) {
    cout<<"Hello World"<<endl;
  }
  return 0;
}
           

機關運作時間

為了計算時間複雜度,我們通常會估計算法的操作單元數量,每個單元運作的時間都是相同的。——維基百科

這段代碼包括了5條語句,分别是

int n = 10

int k = 0

k < n

k++

cout<<"Hello World"

前面已經講了,時間複雜度是描述程式運作時間的,那我們就約定指派語句

int n = 10

每執行一次消耗的時間為

1

個機關時間。由于判斷語句

n < k

總共要進行

n+1

次,是以消耗時間為

n+1

。同理可以得出:

算法時間複雜度_算法第一步之時間複雜度

在程式運作完後,總時間

T = 3*n+3

時間複雜度是一個函數

算法的時間複雜度(Time complexity)是一個函數,它定性描述該算法的運作時間。這是一個代表算法輸入值的字元串的長度的函數。——維基百科

由于

T = 3*n+3

,是以T(n)可以看作是關于

n

的一個函數。

n

可以認為是輸入的字元數量,即自變量。

時間複雜度常用大O符号表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。——維基百科

但大多數程式的算法可沒有那麼簡單,是以就要對函數進行簡化。,這裡涉及到一點極限思想。當輸入值(可認為是輸入的字元數量)是無窮的時候,我們

隻需要定性的描述,不考慮函數的較低階項和最高項系數

,是以函數就變為

T(n)=n

。我們用大

O

來表示這種關系,即

O(n)

常見時間複雜度

時間複雜度可以用函數 T(n) 的自然特性加以分類,比如有着

T(n) = O(n)

的算法被稱作“線性時間算法”

算法時間複雜度_算法第一步之時間複雜度

複雜度比較: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)

時間複雜度的計算

暫未更新...

聲明

文章首發于 算法(1)之時間複雜度

本文參考了 維基百科-時間複雜度

繼續閱讀