[數據結構]第一章緒論(2)——算法

算法

基本概念

image-20200616214853491

什麼是算法?

程序=數據結構+算法git

image-20200616215006166

算法的特性

  1. 有窮性:一個算法必須總在執行有窮步以後結束,且每一步均可在有窮時間內完成。

    注:算法必須是有窮的,二程序能夠是無窮的。github

    image-20200616215340371

  2. 肯定性:算法每一條指令必須有確切的含義,對於相同的輸入只能得出相同的輸出
  3. 可行性:算法描述的操做均可以經過已經實現的基本運算執行有限次來實現。
  4. 輸入:一個算法有0個或多個輸入,這些輸入取自某個特定對象的集合。
  5. 輸出:一個算法有一個或多個輸出,這些輸出是與輸入有着某種特定關係的量。

    五個特性,缺一不可算法

「好」算法的特質

  1. 正確性:算法應能正確地解決求解問題。
  2. 可讀性:算法應具備良好的可讀性,幫助人們理解。
  3. 健壯性:輸入非法數據時,算法能適當地作出反應或進行處理,而不會產生莫名其妙的輸出結果。
  4. 高效率與底存儲量需求:執行速度快,時間複雜度低。不費內存,空間複雜度低。

總結

image-20200616220536590

算法效率的度量

image-20200616220923527

如何評估算法時間開銷?

讓算法先運行,過後統計運行時間?編程

存在的問題?數據結構

  • 和機器性能有關,好比:超級計算機VS單片機
  • 和編程語言有關,越高級的語言執行效率越低,沒錯,就是越低
  • 和編譯程序產生的機器指令質量有關
  • 有些算法是不能過後統計的,好比,導彈控制算法。

評價一個算法優劣時,須要排除與算法自己無關的外界因素,可否事先估計?編程語言

算法時間複雜度

事前預估算法時間開銷T(n)與問題規模n的關係(T 表示 time)函數

如何計算T,例子:性能

image-20200616234743261

問題1:是否能夠忽略表達式某些部分?

image-20200616235203889

  1. 加法規則:多項相加,只保留最高階的項,且係數變爲1

    image-20200616235558501

  2. 乘法規則:多項相乘,都保留

    image-20200616235856976

算法時間複雜度階數順序

image-20200617000121744

image-20200617000310666

若是有好幾千行代碼,須要一行一行數?

  1. 順序執行的代碼只會影響常數項,能夠忽略
  2. 只須要挑循環中的一個基本操做,分析它的執行次數和n的關係就好
  3. 若是有多層嵌套循環,只須要關注最深層的循環循環了幾回

小練習

image-20200617001603926

image-20200617001659516

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dQ6nwKRn-1592326001155)(https://tva1.sinaimg.cn/large...]spa

總結

image-20200617001826231

算法的性能問題只有在n很大時纔會暴露出來。.net

算法空間複雜度

原地工做算法

image-20200617002424730

分析空間複雜度時,只需關注與問題規模相關的變量就好(講人話,就是,看程序中的變量就好)

image-20200617002625466

加法法則

image-20200617002941853

函數遞歸調用帶來的內存開銷

image-20200617003249255

在這種狀況下,空間複雜度等於遞歸調用的深度。

image-20200617003702543

遞歸調用的過程當中,每一次開闢的內存空間也能夠不一致,如上例。

總結

image-20200617003857723

源碼

源碼查看地址,點擊 傳送門 吧~
若是你這個系列的文章有幫助到你的話,不妨給點個贊吧!那將給我莫大的動力!

同系列其餘文章目錄

相關文章
相關標籤/搜索