1、資料結構是 資料的儲存結構。
2、演算法是對資料的操作。
資料結構和演算法總是在一起的,兩者缺一不可。
那麼我們為什麼要使用資料結構和演算法呢?
總的來說就是 :更快、更省。
更快速的處理資料,更省空間的儲存資料!
那麼怎麼知道資料是否「更快、更省」呢?
這裡就要說到複雜度了。
可能會有人說,我何必這麼麻煩啊呢?
直接**跑一跑 ,不就能立馬知道**的耗時了麼?
這個其實也是一種方式,但是 無法準確估量。
原因有兩個:
1、非常受計算機硬體的效能影響。
例如i3 和i9處理器,分別跑,時間肯定不一樣。
2、跟資料的量也有很大關係。
想一想處理10000條資料和處理100萬條資料,耗時能一樣麼?
所以我們需要一種不受客觀條件所影響的方法來粗略的計算效率問題,那就是資料結構的複雜度
資料結構的複雜度一般分為
1、時間複雜度
2、空間複雜度。
一般我們都使用大o複雜度表示法。
我們先看一下這端**的複雜度。
因為我們只能粗略的估計複雜度,那麼我們假設 每一段**的執行時間都是一樣的,都是乙個utime時間,那麼int sum(int n)
return sum;
}
第二行**執行需要1個utime,接下來3行4行 是乙個for迴圈,我們可以看出一共會被執行2n個utime時間,第6行
會被執行1個utime時間,那麼一共會被執行2(n+1)個utime時間。
t(n)=o(2(n+1))
t(n)代表**執行時間。
我們可以看出**的執行時間跟n的大小成正比。
接著看下面的**
依舊假設每一行**執行時間是utime,那麼第2行 執行時間1個utime,第3行為n個utime,第4行 n² 個 utime,int sum(int n)
}}
第5行 n²個 utime,那麼一共為 (2n²+n+1) 個 utime。
t(n)=o(2n²+n+1) ;
通過這兩段**可以推斷出,**執行時間t(n)跟**的執行次數n的大小成正比。
t(n)=o(f(n))
t(n) 表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和。
o表示**的執行時間 t(n) 與 f(n) 表示式成正比。
第乙個例子: t(n)=o(2(n+1)) ;
第二個例子:t(n)=o(2n²+n+1) ;
都是大 o 時間複雜度表示法。
大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,
所以,也叫作漸進時間複雜度(asymptotic time complexity),簡稱時間複雜度。
由於大 o 表示的是乙個趨勢,所以當n很大的時候,我們可以忽略對增長趨勢影響很小的部分,例如第乙個例子中的常量1 ,
使用大o表示法的話就是
t(n)=o(n)
第二個例子 去掉 n ,去掉1,去掉常量2 ,因為這些在n足夠大的時候,對增長趨勢的影響很是微小,學過微積分的童鞋應該很容易理解。
t(n)=o(n²)
如何分析大o表示發,閱讀王爭老師的《資料結構與演算法之美》中老師總結了三個方法
1、只關注執行次數最多的**。
例如:第乙個例子,只需要關注迴圈次數n的**
2、複雜度等於量級最大的那段**的複雜度。
例如 :第二個例子,我們只需要關注 執行次數 n²的**。
3、巢狀**的複雜度等於巢狀**內外複雜度的乘積。
看下面的例子:
cal中巢狀了sum函式,cal**的最大執行次數是n,sum同樣也是n,會導致sum中第9行的**,執行n²次。int cal(int n)
} int sum(int n)
return sum;
}
常見的時間複雜度例項
常量階 o(1)
對數階 o(logn)
線性階 o(n)
線性對數階 o(nlogn)
平方、次方階等等 o(n²) 數值可以為2、 3、 k等等。
指數階o(2n)
階乘o(n!)
o(1)常量級的比較簡單,不再贅述。
說一下o(logn)的情況
看一下下面的例子
這段**的複雜度是多少呢?i=1;
while (i <= n)
假設:n=10時,10×1=10;那麼10的x次方等於n,x等於lgn ,如果n足夠大,那麼不管是以10為底,還是以2、以5為底,卻別都不大,所以大o表示為o(logn);n=100時,10×10×1=100;
n=1000時,10×10×10×1=1000;
我們常見的空間複雜度就是 o(1)、o(n)、o(n² ),像 o(logn)、o(nlogn) 這樣的對數階複雜度平時都基本用不到
同量級複雜度 情況下 o(logn)接下來看一下空間複雜度
時間複雜度的全稱是漸進時間複雜度,表示演算法的執行時間與資料規模之間的增長關係。
與之相似,空間複雜度全稱就是漸進空間複雜度(asymptotic space complexity),表示演算法的儲存空間與資料規模之間的增長關係
看如下**
int a = new int[n];
for (int i=0; i 時間複雜度 o(n),空間複雜度分析一下,我們可以看到**第一行申請了乙個長度為n的陣列,其他的行的**基本都沒有占用多少空間,
所以我們認為這段的空間複雜度也是o(n)
其他的空間複雜度與時間複雜度分析類似,不再贅述,其實現在我們基本關注的時間複雜度更多一點,由於儲存空間目前來說相對很便宜,有時候我們還會
做出用空間換時間的舉措。
資料結構之複雜度分析
目錄 1 為什麼需要複雜度分析?2 大o複雜度表示法 3 時間複雜度 3.1 只關注迴圈執行次數最多的一段 3.2 總的複雜度等於量級最大的那段 的複雜度 加法法則 3.3 巢狀 的複雜度等於巢狀內外 複雜度的乘積 乘法法則 3.4 時間複雜度 4 空間複雜度 5 時間複雜度擴充套件 網上一直有乙個...
資料結構時間複雜度分析
由於疫情原因,沒辦法去學校,資料結構也是看了很多遍,但知識點還是很容易忘,所以就用部落格的方式來記錄。對於一般演算法的時間複雜度,一般直接找到它的迴圈的次數即可,例 if a b else 對 a b 情況,最外層執行n 1次,內層執行最大執行次數為n 1 當i 0 時,所以o n n 對 a b ...
資料結構 複雜度分析(上)
1.資料結構和演算法本身解決的是 快 和 省 的問題,即如何讓 執行得更快,如何讓 更省儲存空間。執行效率是演算法乙個非常重要的考量指標。2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演...