通俗一點就是:解決某乙個問題所需要的時間,一般稱為時間複雜度。採用大o符號表示。
常見的時間複雜度量級:
我們在分析時間複雜度的時候,一般會保留執行時間的最高次項並忽略該項的係數,比如:
執行時間
忽略項忽略項
t(n)=n+1
忽略常數項
t(n)~n
t(n)=n+n^2
忽略低階項
t(n)~n^2
t(n)=3n
忽略最高端的係數
t(n)~n
按照下面的公式保留最大項即可。
o (1
)logn)n)
nlog
n)n2)n3
)2n)n!
)nn)o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n)
o(1)
logn)n)
nlog
n)n2)n3
)2n)n!
)nn)計算時間複雜度的方法:
(1)、得出執行時間的函式;
(2)、對函式進行簡化,只保留最高端項;
(3)、如果最高端項存在且不是1,則忽略這個項的係數
請大家看一下,下面的**會執行多久?
void
swaptwoints
(int
&a,int
&b)(1)、此函式沒有迴圈,僅僅會從頭到位執行一遍即可。即總共執行3條語句。
(2)、如果再加一條語句則會執行4條語句。但是我們再計算時間複雜度的時候,僅僅關心最高次項。
(3)、上述函式的最高次項是常數,3條語句也好,4條語句也罷,是在程式設計之初確定好的,不會隨著變數的增加而增加。
因此我們一般稱上述函式的時間複雜度為o(1)。
int sum (
int n)
return ret;
}(1)、上述函式存在迴圈,for迴圈裡面的**會執行 n 遍。
(2)、因此,它消耗的時間是隨著 n 的變化而變化的
因此我們一般稱上述函式的時間複雜度為o(n)。
void test (
int n )
}}(1)、上述函式存在雙重n迴圈。
(2)、即把 o(n) 的**再巢狀迴圈一遍。
因此我們一般稱上述函式的時間複雜度為o(n^2)。
但是存在雙重迴圈的函式的時間複雜度,不一定是o(n^2),比如:某一重迴圈不是n,而是常數,如下面的**:
void test (
int n )
}}即上述**的第二重迴圈是30,不是n,因此時間複雜度是o(n)。
void
sum(
int n)
}(1)、每迴圈一次,sum就給自身乘以2,乘了多少次就跳出迴圈了呢(大於等於n)?不知道,就設為x吧,那麼2^x=n,解出x=logn
(2)、說明隨著n的增大,最消耗時間的內層語句是呈對數變化的。
因此我們一般稱上述函式的時間複雜度為o(logn)。
void hello ()}
}(1)、將時間複雜度為o(logn)的**迴圈n遍的話;
(2)、那麼它的時間複雜度就是 n * o(logn)
因此我們一般稱上述函式的時間複雜度為o(nlogn)。
空間複雜度是指執行完乙個程式所需記憶體的大小。
即:除了原始序列大小的記憶體,在演算法過程中用到的額外的儲存空間,稱為空間複雜度。
計算在函式中使用的額外空間的大小即可。
對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的。
為了保證執行效率比較高,在記憶體充足的情況下,會採用空間換取時間的方法。
資料結構(2) 演算法和演算法分析
資料結構與演算法之間存在著本質聯絡。演算法的定義及特性 演算法是為了解決某類為而規定的乙個有限長的操作序列。乙個演算法必須滿足一下五個重要特性。演算法的時間複雜度 一般情況下,演算法中基本語句重複執行的次數是問題規模n的某個函式f n 演算法的時間量度記作t n o f n 它表示雖問題規模n的增大...
演算法(2) 資料結構
資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成 簡單來說,資料結構就是設計資料以何種方式組織度儲存在計算機中 比如 列表 集合和字典等都是一種資料結構 程式 資料結構 演算法 資料結構的分類 資料結構按照邏輯結構可分為線性結構 樹結構和圖結構 線性結構 資料...
資料結構和演算法 2 基礎查詢演算法
有兩種對列表內資料進行查詢的方法 順序查詢和二叉查詢。當資料項在列表內隨機排列的時候可以使用順序查詢,而當資料項在列表內有序排列的時候則會用到二叉查詢。順序查詢 二叉查詢 using system using system.collections.generic using system.linq ...