時間複雜度和空間複雜度是用來評價演算法效率高低的2個標準.
**時間複雜度:**就是說執行演算法需要消耗的時間長短,越快越好。(關注基本操作的執行次數)
**空間複雜度:**就是說執行當前演算法需要消耗的儲存空間大小,也是越少越好。
我們一般用「大o符號表示法」來表示時間複雜度
大o表示法:
1.最高次項有係數,則忽略係數
2.如果執行次數為常數次,大o的時間複雜度為o(1)
3.不能依靠簡單的迴圈巢狀,來推斷是時間複雜度,應該具體分析執行的次數.
4.大o表示法一般表示的是演算法最差的執**況.:
常見的時間複雜度量級:
常數階o(1)
線性階o(n)
對數階o(logn)
線性對數階o(nlogn)
平方階o(n²)
立方階o(n³)
k次方階o(n^k)
指數階(2 ^ n)
void
find()
printf
("%d\n"
, count)
;}
等於k在這塊類似於乙個常數; 對於常數而言這塊的時間複雜度是o(1)
因為大o符號表示法並不是用於來真實代表演算法的執行時間的,它是用來表示**執行時間的增長變化趨勢的。
上面的演算法並沒有隨著某個變數的增長而增長,那麼無論這類**有多長,即使有幾萬幾十萬行,都可以用o(1)來表示它的時間複雜度。
for
(int i =
1; i <= n; i++
)
這塊類似於**執行n次因此時間複雜度是o(n)
void fun(int n)
可以看到每次迴圈的時候 i 都會乘2,那麼總共迴圈的次數就是log2n,因此這個**的時間複雜度為o(logn)。
補充:二分查詢是以2倍遞減,每一次都是砍掉一半的運算量 .因為時間複雜度為o(logn)
**空間複雜度 : **變數的個數.(演算法在執行過程中建立的新的變數的個數.)
例1 : 氣泡排序
空間複雜度 : o(1)
例2 : 階乘遞迴
每呼叫一次就建立乙個變數o(n)
總結
評價乙個演算法的效率主要是看它的時間複雜度和空間複雜度情況。在巨大併發量的情況下,小部分時間複雜度或空間複雜度上的優化都能帶來巨大的效能提公升,是非常有必要了解的。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...