主要研究問題(核心):時間與空間複雜度
使用大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)
資料結構系列 初識演算法 一
簡單來說 演算法 就是描述解決問題的方法。能更有效的處理資料,提高資料運算效率。資料的運算是定義在資料的邏輯結構上,但運算的具體實現要在儲存結構上進行。比如 1 2 3 n 平常隨便乙個for迴圈就可以解決這個問題,但是如果n 1000 10000 100000 等,必然要改變變數型別,否則會溢位。...
初識演算法 資料結構
需求驅動 what why how 所有的學習從需求開始,學習任何知識要想事半功倍,一定要先搞清楚它存在的意義和價值 目錄 1 什麼是演算法?2 演算法好壞的評判標準 2.1 時間複雜度 流程決定 2.2 額外空間複雜度 流程決定 2.3 常數項時間 實現細節決定 what 總而言之 演算法就是解決...
資料結構與演算法初識
目錄首先明確的一點就是電腦科學不僅僅是對計算機的研究,雖然計算機在科學發展的過程中發揮了重大的作用,但是它只是乙個工具,乙個沒有靈魂的工具而已。所謂的電腦科學實際上是對問題 解決問題以及解決問題的 過程中產生產生的解決方案的研究。例如給定乙個問題,計算機科學家的目標是開發乙個演算法來處理該問題,最終...