一、 演算法的時間複雜度定義
一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度(o是數量級的符號 ),簡稱時間複雜度。
1、根據定義,可以歸納出基本的計算步驟
(1.)計算出基本操作的最壞情況執行次數t(n)
(2)計算出t(n)的數量級 (計算數量級只需要保留 最高次冪,並省略係數)
用f(n)=t(n)來表示函式
(3)用大o來表示時間複雜度 ,用o(省略係數的最高次冪)表示
常見時間複雜度:
o(1) < o(logn) < (n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n)
例子:
//hash的計算公式
static final int hash(object key)
//hash獲取 陣列位置
tab[i = (n - 1) & hash
hashmap獲取鍊錶的位置的t(n)=2 迴圈的時間複雜度為o(1)
public static void main(string args) ;
int i,j;
for(i=0;inumbers[j+1]) }}
system.out.println("從小到大排序後的結果是:");
for(i=0;i氣泡排序的複雜度, t(n)= n^2 +n^2 +n^2,根據上面括號裡的同數量級,我們可以確定 n^2為t(n)的同數量級
則有f(n)= n^2,然後根據t(n)/f(n)求極限可得到常數c
則該演算法的 時間複雜度:t(n)=o(n^2)
//在陣列a(有序的並且不含重複元素)中查詢x,用二分查詢
//low表示陣列a的左端點,high表示右端點
//找到返回元素在陣列中的下標,找不到返回-1
public static int binary_search(int a,int low,int high,int value)else if (a[mid]二分法的計算方式不斷取陣列中點,判斷需要值與中點的比值,選擇合適的那一半。最壞的情況就是取到陣列的邊界值。此時
2^t(n)=n t(n)=log2^n f(n)=log2^n ,迴圈的時間複雜度為o(logn)
二、 演算法的空間複雜度定義
演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法的空間複雜度的計算公式記作:s(n)=o(f(n)),其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式,也是一種「漸進表示法」,這些所需要的記憶體空間通常分為「固定空間記憶體」(包括基本程式**、常數、變數等)和「變動空間記憶體」(隨程式執行時而改變大小的使用空間)
計算方式:
遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。
之前寫計算時間複雜度的時候,對遞迴的二分法,做了書寫。每一次遞迴都對所有變數進行了一次賦值,由我們對時間複雜度的分析,當我們計算到n需要log2^n 次計算,所以同樣進行log2n次賦值,所以空間複雜度為log2n
在 public static int binary_search(int a,int n,int x)else if (a[mid]這個是關於迴圈實現二分法,但因為 基本步驟裡面資料變數值建立一次,所以空間複雜度為o(1)。
時間複雜度和空間複雜度計算
時間複雜度 首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。常見的時間複雜度有 常數階o 1 對數階o log2 n 線性階o n 線性對數階o n log2...
時間複雜度和空間複雜度的計算
時間複雜度 1.一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t n o f n 分析 隨著模組n的增大,演算法執行的時間的增長率和 f n 的增長率成正比,所以 f n 越小,演算法的時間複雜度越低,演算法的效率越高。2.在計算時間複雜度的時候...
時間複雜度和空間複雜度的計算
時間複雜度 執行乙個演算法,執行的次數和問題規模之間的函式關係,用o 表示。o 1 常數項,和問題的規模無關。時間複雜度計算規則 1.只保留最高端項 2.不要係數 空間複雜度 執行乙個演算法,需要額外的輔助空間和問題規模之間的函式關係,用o 表示。簡單來說,時間複雜度指的是執行次數,空間複雜度指的是...