時間複雜度與空間複雜度
一般演算法都可以轉化成乙個數學方程,表示的是乙個時間複雜度之和,而我們為了方便表達,會把對於影響比較小的式子省略掉,去掉不會變的常數,只留下乙個對於複雜度影響最大的函式
正文
對於乙個給定的演算法,第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式
、數學歸納法
等。
第二就是分析演算法的時間複雜度,演算法的時間複雜度反應了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很好反應出演算法的優劣
演算法執行時間需要通過依據該演算法編制的程式在計算機上執行所消耗的時間來度量,通常有兩種辦法
就是統計演算法在機器上執行時間
有兩個缺陷:
1. 要想對設計的演算法的執行效能進行評測,必須先依據演算法編制相應的程式並實際執行
2. 所得時間的統計量依賴於計算機的硬體、軟體等環境因素,有時容易掩蓋演算法本身的優勢
最常採用的方法
在編寫程式前,依據統計方法對演算法進行估算。乙個用高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:
1. 演算法採用的策略
2. 編譯產生的**質量
3. 問題的輸入規模
4. 機器執行指令的速度
乙個演算法shi是由控制結構(順序分支迴圈)和原操作(指固有資料型別的操作)構成的,則演算法時間取決於兩者的綜合效果。為了便於比較同乙個問題的不同演算法,通常的做法是,從演算法中選取一種對於所研究的問題(或演算法型別)來說是基本操作的原操作,以該基本操作的重複執行的次數作為演算法的時間量度
時間複雜度
1. 時間頻度
乙個演算法花費的時間與演算法中語句的執行次數成正比例。那個語句執行次數多,花費時間就多。乙個演算法中的語句執行次數稱之為語句頻度或時間頻度,記為t(n)。
2. 時間複雜度
在時間頻度中,n稱為問題的規模,當n 不斷變化時,時間頻度 t(n) 也會不斷變化。
一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用 t(n) 表示,若有某個輔助函式 f(n),使得當 n 趨於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱 f(n )是同數量級函式。 記作t(n) = o(f(n))稱o(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度
注:landau符號(o)的作用在於用簡單的函式來描述複雜函式行為,給出乙個上或下(確)界
在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n2+3n+4與t(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階o(1),對數階o(log2n),線性階o(n), 線性對數階o(nlog2n),平方階o(n2),立方階o(n3),…, k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。
常見的演算法時間複雜度由小到大依次為:ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n2)<ο(n3)<…<ο(2n)<ο(n!)
3. 求演算法的時間複雜度的具體步驟
找出演算法中的基本語句
計算基本語句的執行次數的數量級
用大o記號表示演算法的時間效能
o(1) 表示基本語句的執行次數是乙個常數,一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是 o(1)。其中ο(log2n)、ο(n)、 ο(nlog2n)、ο(n2)和ο(n3)稱為多項式時間,而ο(2n)和ο(n!)稱為指數時間。計算機科學家普遍認為前者(即多項式時間複雜度的演算法)是有效演算法,把這類問題稱為p(polynomial,多項式)類問題,而把後者(即指數時間複雜度的演算法)稱為np(non-deterministic polynomial, 非確定多項式)問題。
4. 簡單程式分析法則
(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要o(1)時間
(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大o下」求和法則」
求和法則:是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2(n)=o(g(n)),則 t1(n)+t2(n)=o(max(f(n), g(n)))
特別地,若t1(m)=o(f(m)), t2(n)=o(g(n)),則 t1(m)+t2(n)=o(f(m) + g(n))
(3).對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要o(1)時間
(4).對於迴圈結構,迴圈語句的執行時間主要體現在多次迭代中執行迴圈體以及檢驗迴圈條件的時間耗費,一般可用大o下」乘法法則」
乘法法則: 是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2(n)=o(g(n)),則 t1*t2=o(f(n)*g(n))
(5).對於複雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則技術整個演算法的時間複雜度
另外還有以下2個運算法則:(1) 若g(n)=o(f(n)),則o(f(n))+ o(g(n))= o(f(n));(2) o(cf(n)) = o(f(n)),其中c是乙個正常數
演算法複雜度簡介
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算...
2 演算法複雜度簡介
時間複雜度和空間複雜度是衡量演算法效率的重要的指標,而現實中對時間複雜度尤為關心,面試經常會問。但是一問到空間複雜度就容易卡殼。其實在演算法設計中,在規定量級空間複雜度去設計演算法是件非常有趣的事。時間複雜度 是指執行演算法所需要的計算工作量。其實就是所耗費的時間,但是用量級形勢將其表示出來 空間複...
演算法時間複雜度和空間複雜度簡介
一 資料結構 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。邏輯結構 是指資料物件中資料元素之間的相互關係,也是我們今後最需要關注和討論的問題。物理結構 是指資料的邏輯結構在計算機中的儲存形式。鏈式儲存結構 是把資料元素存放在任意的儲存單元裡,這組...