什么是復雜度?
算法的復雜度是粗略衡量一個算法執(zhí)行效率的方法岛琼,分為時間復雜度和空間復雜度掖看。
時間復雜度:估算程序指令的執(zhí)行次數(shù)(時間)
空間復雜度:估算所需占用的存儲空間
大O表示法
一般用大O表示法來描述復雜度芹枷,他表示的是數(shù)據(jù)規(guī)模n對應的復雜度
所有代碼的執(zhí)行時間 T(n) 與每行代碼的執(zhí)行次數(shù) f(n) 成正比弟孟。
T(n) = O(f(n))
T(n)表示代碼執(zhí)行的時間;n 表示數(shù)據(jù)規(guī)模的大醒钦作媚;f(n) 表示每行代碼執(zhí)行的次數(shù)總和。因為這是一個公式帅刊,所以用 f(n) 來表示纸泡。公式中的 O,表示代碼的執(zhí)行時間 T(n) 與 f(n) 表達式成正比赖瞒。
大 O 時間復雜度實際上并不具體表示代碼真正的執(zhí)行時間女揭,而是表示代碼執(zhí)行時間隨數(shù)據(jù)規(guī)模增長的變化趨勢,所以栏饮,也叫作漸進時間復雜度吧兔,簡稱時間復雜度。
用大O復雜度表示法袍嬉,通常我們會忽略常數(shù)境蔼、系數(shù)、低階
常見的復雜度量級:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2?)<O(n!)
舉個栗子:
假如每一行代碼執(zhí)行時間都是一樣的unit_time伺通,這段代碼執(zhí)行時間為(2n+2)*unit_time箍土,所以時間復雜度為O(n)。
多個數(shù)據(jù)規(guī)模的例子:
這個例子里復雜度依賴兩個數(shù)據(jù)規(guī)模泵殴,所以時間復雜度為O(m+n)
空間復雜度:
表示算法的存儲空間與數(shù)據(jù)規(guī)模之間的增長關(guān)系涮帘。
常見的空間復雜度就是 O(1)拼苍、O(n)笑诅、O(n2 )
申請了一個大小為 n 的 int 類型數(shù)組调缨,同時申請了一個空間存儲變量 i,但是它是常量階的吆你,跟數(shù)據(jù)規(guī)模 n 沒有關(guān)系弦叶,所以我們可以忽略,所以整段代碼的空間復雜度就是 O(n)妇多。
算法的優(yōu)化方向:
1.用盡量少的存儲空間
2.用盡量少的執(zhí)行步驟(執(zhí)行時間)
根據(jù)情況伤哺,可以用空間換時間,用時間換空間
leetcode斐波那契數(shù)列:
https://leetcode-cn.com/problems/fibonacci-number/