算法
主要研究問題(核心):時間與空間複雜度
使用大O記號(這個爲最壞的情況,是算法的上界,忽略常數係數)
時間:基本操作次數(會變指令條數)
空間:佔用內存字節數
區別:空間可以再利用
時間空間可以互換(Hash表)
常見時間複雜度分析方法:
1.輸入輸出——確定算法的下界
2.數循環次數——循環次數相乘,通過最內層循環優化
3.均攤分析——平均預估,多個操作,一起算時間複雜度
常見複雜度:
O(1) (不管執行多少次)
基本運算,+,-,*,/,%,尋址
O(logn)(分治類,一般以2爲底)
二分查找
O(n1/2)
枚舉約數
O(n)
線性查找
O(n2)
樸素最近點對、冒泡、選擇排序
O(n3)
Floyd最短路
普通矩陣乘法
O(nlogn)
歸併排序
快速排序的期望(均攤)複雜度
基於比較排序的算法下界
O(2n)
枚舉全部的子集
O(n!)
枚舉全排列
總結:
優秀 O(1) < O(logn) < O(n1/2) < O(n) < O(nlogn)
可能可以優化 O(n2) < O(n3) < O(2n) < O(n!) (n到底是多大!!一秒一億條指令)
條件:
- 有窮性(在有限的時間內結束)
- 確定性(數值是確定的)
- 可行性(算法可以是一段描述,也可以是一段代碼,每一行都可行的)
- 有輸入與輸出
應用:
機器學習、數據挖掘、自然語言處理、密碼學、計算機圖形學等
常用算法:
- 窮舉(萬能算法)
- 分而治之(減而治之 )
二分查找——減而治之
歸併排序——分而治之 - 貪心法
最小生成樹
單源最短路 - 動態規劃
揹包
士兵路徑
介紹三個算法:
- 暴力枚舉 O(n3)
- 優化枚舉 O(n2)
- 貪心法 O(n)