算法
基本概念
什麼是算法?
程序=數據結構+算法git
算法的特性
- 有窮性:一個算法必須總在執行有窮步以後結束,且每一步均可在有窮時間內完成。
注:算法必須是有窮的,二程序能夠是無窮的。github
- 肯定性:算法每一條指令必須有確切的含義,對於相同的輸入只能得出相同的輸出
- 可行性:算法描述的操做均可以經過已經實現的基本運算執行有限次來實現。
- 輸入:一個算法有0個或多個輸入,這些輸入取自某個特定對象的集合。
- 輸出:一個算法有一個或多個輸出,這些輸出是與輸入有着某種特定關係的量。
五個特性,缺一不可算法
「好」算法的特質
- 正確性:算法應能正確地解決求解問題。
- 可讀性:算法應具備良好的可讀性,幫助人們理解。
- 健壯性:輸入非法數據時,算法能適當地作出反應或進行處理,而不會產生莫名其妙的輸出結果。
- 高效率與底存儲量需求:執行速度快,時間複雜度低。不費內存,空間複雜度低。
總結
算法效率的度量
如何評估算法時間開銷?
讓算法先運行,過後統計運行時間?編程
存在的問題?數據結構
- 和機器性能有關,好比:超級計算機VS單片機
- 和編程語言有關,越高級的語言執行效率越低,沒錯,就是越低
- 和編譯程序產生的機器指令質量有關
- 有些算法是不能過後統計的,好比,導彈控制算法。
評價一個算法優劣時,須要排除與算法自己無關的外界因素,可否事先估計?編程語言
算法時間複雜度
事前預估算法時間開銷T(n)與問題規模n的關係(T 表示 time)函數
如何計算T,例子:性能
問題1:是否能夠忽略表達式某些部分?
- 加法規則:多項相加,只保留最高階的項,且係數變爲1
- 乘法規則:多項相乘,都保留
算法時間複雜度階數順序
若是有好幾千行代碼,須要一行一行數?
- 順序執行的代碼只會影響常數項,能夠忽略
- 只須要挑循環中的一個基本操做,分析它的執行次數和n的關係就好
- 若是有多層嵌套循環,只須要關注最深層的循環循環了幾回
小練習
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dQ6nwKRn-1592326001155)(https://tva1.sinaimg.cn/large...]spa
總結
算法的性能問題只有在n很大時纔會暴露出來。.net
算法空間複雜度
原地工做算法
分析空間複雜度時,只需關注與問題規模相關的變量就好(講人話,就是,看程序中的變量就好)
加法法則
函數遞歸調用帶來的內存開銷
在這種狀況下,空間複雜度等於遞歸調用的深度。
遞歸調用的過程當中,每一次開闢的內存空間也能夠不一致,如上例。
總結
源碼
源碼查看地址,點擊 傳送門 吧~
若是你這個系列的文章有幫助到你的話,不妨給點個贊吧!那將給我莫大的動力!
同系列其餘文章目錄