算法複雜度
算法複雜度分為時間複雜度和空間複雜度。其作用:時間複雜度是指執行算法所需要的計算工作量;而空間複雜度是指執行這個算法所需要的内存空間。(算法的複雜性體現在運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,因此複雜度分為時間和空間複雜度)。
基本介紹
如何衡量一個算法的好壞?時間複雜度+空間複雜度
其作用:時間複雜度是度量算法執行的時間長短;而空間複雜度是度量算法所需存儲空間的大小。
時間頻度
一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,隻需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。并且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
計算方法
1.一般情況下,算法的基本操作重複執行的次數是模塊n的某一個函數f(n),因此,算法的時間複雜度記做:T(n)=O(f(n))
分析:随着模塊n的增大,算法執行的時間的增長率和f(n)的增長率成正比,所以f(n)越小,算法的時間複雜度越低,算法的效率越高。
2.在計算時間複雜度的時候,先找出算法的基本操作,然後根據相應的各語句确定它的執行次數,再找出T(n)的同數量級(它的同數量級有以下:1,Log2n,n,nLog2n,n的平方,n的三次方,2的n次方,n!),找出後,f(n)=該數量級,若T(n)/f(n)求極限可得到一常數c,則時間複雜度T(n)=O(f(n))
基本分類
按數量級遞增排列,常見的時間複雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2n)。随着問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。
空間複雜度
一個程序的空間複雜度是指運行完一個程序所需内存的大小。利用程序的空間複雜度,可以對程序的運行所需要的内存多少有個預先估計。一個程序執行時除了需要存儲空間和存儲本身所使用的指令、常數、變量和輸入數據外,還需要一些對數據進行操作的工作單元和存儲一些為現實計算所需信息的輔助空間。程序執行時所需存儲空間包括以下兩部分。
(1)固定部分。這部分空間的大小與輸入/輸出的數據的個數多少、數值無關。主要包括指令空間(即代碼空間)、數據空間(常量、簡單變量)等所占的空間。這部分屬于靜态空間。
(2)可變空間,這部分空間的主要包括動态分配的空間,以及遞歸棧所需的空間等。這部分的空間大小與算法有關。
一個算法所需的存儲空間用f(n)表示。
S(n)=O(f(n))
其中n為問題的規模,S(n)表示空間複雜度。
漸近記号
1、Theta記号
2、大O記号
3、Omega記号
4、小o記号
性質
一個算法所耗費的時間=算法中每條語句的執行時間之和
每條語句的執行時間=語句的執行次數(即頻度(FrequencyCount))×語句執行一次所需時間
算法轉換為程序後,每條語句執行一次所需的時間取決于機器的指令性能、速度以及編譯所産生的代碼質量等難以确定的因素。
若要獨立于機器的軟、硬件系統來分析算法的時間耗費,則設每條語句執行一次所需的時間均是單位時間,一個算法的時間耗費就是該算法中所有語句的頻度之和。