時間複雜度和空間複雜度[數據結構]

參考:本文爲小甲魚教學視頻的學習筆記。

 

1、爲什麼要學習時間複雜度和空間複雜度?你說一個算法好另外一個算法不好,有什麼判斷依據?哪個算法效率高?怎麼判斷?那麼就要學習時間和空間複雜度了。

思考:學習每一個知識之前都應該要考慮一下爲什麼要學習,學了有什麼用處,什麼場景下去用。


2、算法的效率高一般是指算法的執行時間,度量一個算法的執行時間有2種方式:

  • 事後統計法:需要編寫測試程序,萬一不好花費大量的時間精力,賠了娘子又折兵(並且測試環境不同差別不是一般的大)
  • 事前統計法:程序編寫前,使用統計方法對算法進行估算

思考:百度搜索事前避孕藥和事後避孕藥,會有更深刻的理解


3、一個高級語言編寫的程序在計算機上運行時所消耗的時間取決於下列因素:

  • 算法採用的策略,方案(方法思路)
  • 編譯產生的代碼質量(編譯器的優劣,編譯語言的優劣)
  • 問題的輸入規模(輸入量的多少,需要一個循環)
  • 機器執行指令的速度(硬件環境)

4、我們研究算法的複雜度,側重的是研究算法隨着輸入規模擴大增長量的一個抽象,而不是精確地定位需要執行多少次。因爲如果這樣的話,我們就又不得不考慮編譯器優化的問題,然後就沒然後了。

思考:因爲外部因素的影響很大,很難精確定位執行次數,那就對增長量抽象出來進行對比未嘗不是一個好的方案。


5、如何對增長量進行抽象:忽略程序所用的語言、忽略程序跑在什麼樣的機器上、不計哪些循環索引的增長和循環終止條件、變量聲明、打印結果。我們只關心它所實現的算法。

思考:分析程序的運行時間,最重要的是把程序看成獨立於編程語言的算法或者一系列的步驟。


6、我們在分析一個算法的運行時間時:重要的是把基本操作的數量和輸入模式關聯起來。


思考:分析隨着輸入量的增加,操作數量的增長情況用以判斷算法效率高低。


7、函數的漸進增長:對於給定的兩個函數f(n)和g(n),如果存在一個整數N,使得對於所有的n>Nf(n)總是比g(n)大,那麼,我們說f(n)的增長漸進快於g(n)。與最高次項線程的常熟並不重要,也可以忽略,常數也可以忽略。判斷一個算法的好不好,只通過少量的數據是不能夠判斷的,以免以偏概全。

思考:判斷算法效率是,函數中的常熟和其他次要項常常可以忽略,而更應該關注主項(也就是最高項)的階數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章