一、測試結果很是依賴測試環境java
Core i9
Core i3
在機器A上:a 代碼執行的速度比 b 代碼要快
在機器B上:b 代碼執行的速度比 a 代碼要快算法
二、測試結果受數據規模的影響很大編程
測試數據有序度不同
測試數據規模過小不同
因此、咱們須要一個不用具體的測試數據來測試、就能夠粗略地估算計算法的執行效率的方法
這就是咱們今天要講的時間、空間複雜度分析方法性能
一、如何在不用運行代碼的狀況下用"肉眼" 獲得一段代碼的執行時間呢?測試
讀數據-運算-寫數據
全部代碼的執行時間T(n)與每行代碼的執行次數n成正比spa
代碼的執行時間=O(每行代碼執行的次數總和)
blog
大 O 複雜度表示法,實際並不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據規模增加的變化趨勢排序
漸進時間複雜度,簡稱時間複雜度遞歸
咱們在分析一個算法、一段代碼的時間複雜度的時候,也只關注循環執行次數最多的哪一行代碼就能夠class
總的時間複雜度就等於量級最大的那段代碼的時間複雜度
關鍵在於"熟練"。你只要多看案例,多分析,就能作到"無招勝有招"
int i = 8; int j = 6; int sum = i + j;
O(1) 只是常量級時間複雜度的一種表示方法,並非指只執行了一行代碼。好比這段代碼,即使有3行,它的時間複雜度也是O(1)
通常狀況下,只要算法中不存在循環語句、遞歸語句,即便有成千上萬行的代碼,其時間複雜度也是Ο(1)
i=1; while (i <= n) { i = i * 2; }
i=1; while (i <= n) { i = i * 3; }
若是一段代碼的時間複雜度是 O(logn),咱們循環執行n遍,時間複雜度就是O(nlogn)
O(nlogn)這也是一種很是常見的算法時間複雜度,好比歸併排序、快速排序的時間複雜度就是O(nlogn)
int cal(int m, int n) { int sum_1 = 0; int i = 1; for (; i < m; ++i) { sum_1 = sum_1 + i; } int sum_2 = 0; int j = 1; for (; j < n; ++j) { sum_2 = sum_2 + j; } return sum_1 + sum_2; }
針對這種狀況,原來的加法法則就不正確了,
咱們須要將加法規則改成:T1(m) + T2(n) = O(f(m) + g(n))
可是乘法法則繼續有效:T1(m)*T2(n) = O(f(m) * f(n))。
void print(int n) { int i = 0; int[] a = new int[n]; for (i; i <n; ++i) { a[i] = i * i; } for (i = n-1; i >= 0; --i) { print out a[i] } }
空間複雜度全稱就是漸進式複雜度,表示算法的存儲空間與數據規模之間的增加關係
O(1)、O(n)、O(n2 ),像 像 O(logn)、O(nlogn) 這樣的對數階複雜度平時用不到
複雜度也叫漸進式複雜度,包括時間複雜度和空間複雜度,
用來分析算法執行效率與數據規模之間的增加關係
能夠粗略地表示、越高階複雜度的算法、執行效率越低。常見的複雜度並很少,
從低階到高階有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )
複雜度的分析並不難,關鍵在於多練
一、有人說,咱們項目以前都會進行性能測試,再作代碼的時間複雜度、空間複雜度分析是否是畫蛇添足呢?
二、並且每段代碼都分析一下時間複雜度、空間複雜度,是否是很浪費時間呢?
你怎麼看待這個問題
我不認爲是畫蛇添足,漸進時間,空間複雜度分析爲咱們提供了一個很好的理論分析的方向,而且它是宿主平臺無關的,可以讓咱們對咱們的程序或算法有一個大體的認識,讓咱們知道,好比在最壞的狀況下程序的執行效率如何,同時也爲咱們交流提供了一個不錯的橋樑,咱們能夠說,算法1的時間複雜度是O(n),算法2的時間複雜度是O(logN),這樣咱們馬上就對不一樣的算法有了一個「效率」上的感性認識。固然,漸進式時間,空間複雜度分析只是一個理論模型,只能提供給粗略的估計分析,咱們不能直接判定就以爲O(logN)的算法必定優於O(n), 針對不一樣的宿主環境,不一樣的數據集,不一樣的數據量的大小,在實際應用上面可能真正的性能會不一樣,我的以爲,針對不一樣的實際狀況,進而進行必定的性能基準測試是頗有必要的,好比在統一一批手機上(一樣的硬件,系統等等)進行橫向基準測試,進而選擇適合特定應用場景下的最有算法。綜上所述,漸進式時間,空間複雜度分析與性能基準測試並不衝突,而是相輔相成的,可是一個低階的時間複雜度程序有極大的可能性會優於一個高階的時間複雜度程序,因此在實際編程中,時刻關心理論時間,空間度模型是有助於產出效率高的程序的,同時,由於漸進式時間,空間複雜度分析只是提供一個粗略的分析模型,所以也不會浪費太多時間,重點在於在編程時,要具備這種複雜度分析的思惟