數據結構與算法學習(1)——代碼效率優化

作爲一名電子信息工程專業的學生,我們學校是在專業選修開設了數據結構課,但是大家都沒有選擇這一門課,由於一個偶然的機會,在一個技術交流羣裏有大牛推薦了這個數據結構課,只要1塊錢還是9.9塊錢我不記得了,反正屬於薅羊毛性質,既然買了就拿來督促一下自己,也提升一下自己的代碼思想。

複雜度

複雜度是衡量代碼運行效率的重要因素,它包括:
時間複雜度(與代碼的結構設計相關)
空間複雜度(與數據結構的選擇相關)

複雜度是一個關於輸入數據量 n 的函數。假設你的代碼複雜度是 f(n),那麼就用個大寫字母 O 和括號,把 f(n) 括起來就可以了,即 O(f(n))

複雜度計算原則

  1. 複雜度與具體的常係數無關,例如 O(n) 和 O(2n) 表示的是同樣的複雜度,即O(2n) 等於 O(n+n),也等於 O(n) +
    O(n)
  2. 多項式級的複雜度相加的時候,選擇高者作爲結果,例如 O(n²)+O(n) 和 O(n²) 表示的是同樣的複雜度
  3. O(1) 也是表示一個特殊複雜度,與輸入數據量 n 無關

經驗性結論:

  1. 一個順序結構的代碼,時間複雜度是 O(1)
  2. 二分查找,或者更通用地說是採用分而治之的二分策略,時間複雜度都是 O(log n)
  3. 一個簡單的 for 循環,時間複雜度是 O(n)
  4. 兩個順序執行的 for 循環,時間複雜度是 O(n)+O(n)=O(2n),其實也是 O(n) 兩個嵌套的 for 循環,時間複雜度是
    O(n²)

犧牲空間複雜度來降低時間複雜度

代碼效率的瓶頸可能發生在時間或者空間兩個方面。如果是缺少計算空間,花錢買服務器就可以了。這是個花錢就能解決的問題。相反,如果是缺少計算時間,只能投入寶貴的人生去跑程序。即使你有再多的錢、再多的服務器,也是毫無用處。相比於空間複雜度,時間複雜度的降低就顯得更加重要了

降低複雜度的方法

  1. 第一步,暴力解法。在沒有任何時間、空間約束下,完成代碼任務的開發
  2. 第二步,無效操作處理。將代碼中的無效計算、無效存儲剔除,降低時間或空間複雜度
  3. 第三步,時空轉換。設計合理數據結構,完成時間複雜度向空間複雜度的轉移
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章