作爲一名電子信息工程專業的學生,我們學校是在專業選修開設了數據結構課,但是大家都沒有選擇這一門課,由於一個偶然的機會,在一個技術交流羣裏有大牛推薦了這個數據結構課,只要1塊錢還是9.9塊錢我不記得了,反正屬於薅羊毛性質,既然買了就拿來督促一下自己,也提升一下自己的代碼思想。
複雜度
複雜度是衡量代碼運行效率的重要因素,它包括:
時間複雜度(與代碼的結構設計相關)
空間複雜度(與數據結構的選擇相關)
複雜度是一個關於輸入數據量 n 的函數。假設你的代碼複雜度是 f(n),那麼就用個大寫字母 O 和括號,把 f(n) 括起來就可以了,即 O(f(n))。
複雜度計算原則
- 複雜度與具體的常係數無關,例如 O(n) 和 O(2n) 表示的是同樣的複雜度,即O(2n) 等於 O(n+n),也等於 O(n) +
O(n) - 多項式級的複雜度相加的時候,選擇高者作爲結果,例如 O(n²)+O(n) 和 O(n²) 表示的是同樣的複雜度
- O(1) 也是表示一個特殊複雜度,與輸入數據量 n 無關
經驗性結論:
- 一個順序結構的代碼,時間複雜度是 O(1)
- 二分查找,或者更通用地說是採用分而治之的二分策略,時間複雜度都是 O(log n)
- 一個簡單的 for 循環,時間複雜度是 O(n)
- 兩個順序執行的 for 循環,時間複雜度是 O(n)+O(n)=O(2n),其實也是 O(n) 兩個嵌套的 for 循環,時間複雜度是
O(n²)
犧牲空間複雜度來降低時間複雜度
代碼效率的瓶頸可能發生在時間或者空間兩個方面。如果是缺少計算空間,花錢買服務器就可以了。這是個花錢就能解決的問題。相反,如果是缺少計算時間,只能投入寶貴的人生去跑程序。即使你有再多的錢、再多的服務器,也是毫無用處。相比於空間複雜度,時間複雜度的降低就顯得更加重要了
降低複雜度的方法
- 第一步,暴力解法。在沒有任何時間、空間約束下,完成代碼任務的開發
- 第二步,無效操作處理。將代碼中的無效計算、無效存儲剔除,降低時間或空間複雜度
- 第三步,時空轉換。設計合理數據結構,完成時間複雜度向空間複雜度的轉移