演算法競賽時間複雜度及空間複雜度

2022-05-31 15:21:09 字數 1358 閱讀 6727

眾所周知

,在演算法競賽以及有關電腦科學的諸多學科中,時間複雜度和空間複雜度是評判乙個演算法/程式的重要標準。一般使用o( )來表示。

同一問題可用不同演算法解決,而乙個演算法的質量優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s(n)=o(f(n))。比如直接插入排序的時間複雜度是o(n^2),空間複雜度是o(1) 。而一般的遞迴演算法就要有o(n)的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。

是不是感覺很晦澀呢?

先來說說時間複雜度

根據大佬們的說法oi官方評測機的主頻是4.7ghz,也就是說一秒鐘內能完成10^9程度的運算。而且在演算法競賽裡面往往將執行時間卡在一秒鐘,這就意味著我們需要結合題目中的資料範圍選擇盡可能優秀的演算法和資料結構等等以便可以獲得全部分(當然暴力拿部分分也是要優化的)

事實上,乙個程式的時間複雜度是基於你輸入的n,對它進行重複操作的次數。大o表示法隨著輸入的值變化,程式執行所需要的時間與輸入值的變化關係。一般我們在計算時間複雜度的時候,可以先找找程式的基本操作,例如:for迴圈是從1~n的迴圈,所以每次進行一次for,複雜度+n。但是當for迴圈套for迴圈的時候,複雜度就會以指數增長,一般是一重for,n的指數就加1。這種複雜度我們一般稱之為線性。

還有一些演算法如最典型的二分,因為二分每次操作都可以把目標的元素砍掉一半,比如n=1024時,我們只要找10次就可以了,因為2^10=1024。那你又會說了,如果元素再大,次數還會這麼少嗎?您看呀,如果n=2048。那不就是2^11嗎?不難發現,元素的個數雖然翻倍,但是我們只是多加了一次操作,所以o(logn)的對數演算法不失為一種很高效的演算法。

其他的一些複雜度如o(1)我們一般稱之為常數複雜度。例如乙個陣列a[5]=我們要查詢陣列的第乙個元素1,因為它已經存好了元素,我們的查詢只需要1次操作。例如st表查詢rmq就是o(1)的時間複雜度。因為這種演算法就像乙個小常數一樣,不會受到任何東西的影響,我們把它稱之為常數複雜度。

最後還有線性對數複雜度 o(n*logn),在高效的排序中較為常見,如快速排序,歸併排序,堆排序。

按數量級遞增排列,常見的時間複雜度有:

常數階o(1),對數階o(log2n),線性階o(n),線性對數階o(nlog2n),平方階o(n^2),立方階o(n^3)k次方階o(n^k),指數階o(2^n)以及o(n!)

再來說說空間複雜度

遞迴深度n*每次遞迴所要的輔助空間, 如果每次遞迴所需的輔助空間是常數,則遞迴的空間複雜度是 o(n).

時間複雜度及空間複雜度

一.時間複雜度 時間複雜度實際就是乙個函式,該函式計算的是執行基本操作的次 數,而不是程式執行時間。1.在實際中通常關注的是演算法的最壞運 況。乙個演算法的最壞情況的執行時間是在任意輸入下的執行時間上界。一般情況下使用o漸進表示法來計算演算法的時間複雜度。2.書寫方式 例1 void test in...

時間複雜度及空間複雜度

程式的時間複雜度指的是程式在執行過程中的運算次數,並為最壞情況下的運算次數 程式的空間複雜度指的是程式在執行過程中需要系統為其變數輔助開闢記憶體的多少 斐波那契序列用遞迴實現 include int fib int n int main 圖示為 從圖中可以看出斐波那契遞迴演算法中求解f n 必須先計...

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...