衡量兩個演算法誰好誰壞,我們有兩個指標。
空間複雜度 \(s(n)\),就是 space。時間複雜度 \(t(n)\),也就是 time 的縮寫。
為什麼要把它們寫成是乙個關於 \(n\) 的函式呢?因為這兩個指標其實和我們要處理的資料的規模,是直接相關的。舉個例子說:我如果要你列印十個整數,你的程式可能瞬間就給出結果了。如果我讓你列印十萬個整數呢?你就要多等一會兒了。所以這個程式執行的時間,跟我要你處理的資料是十個還是十萬個是相關的。這個「十」或者「十萬」,就是我們要處理的資料的規模。我們把它叫做 \(n\),是乙個變數的話,那麼我們這個程式所用的時間和空間都跟這個 \(n\) 是有直接關係的。解決乙個問題有很多種不同的方法,你在設計這個方法的時候,一定要把這兩個要素考慮清楚。遞迴如果太長就會爆棧,也就是程式會非正常中斷。
void printn(int n)
return;
}
遞迴地呼叫函式,系統需要把當前這個函式所有的東西和狀態都存起來。如果這個函式接收到的引數 \(n\) 是 100000,那麼在記憶體裡頭就需要 100000 個這樣的函式的記憶體空間。於是我們就知道,它在記憶體裡面占用的空間的數量實際上和 \(n\) 成正比,也就是空間複雜度作為乙個 \(n\) 的函式的話,是乙個常數乘以 \(n\)。
\[s(n) = c \cdot n
\]前一篇提到的秦九韶的方法為什麼要快呢?機器運算加減法的速度比乘除法的速度要快很多,所以我們基本上就是在數函式到底做了多少次乘除法,加減法可以忽略不計。
在分析一般演算法的效率時,我們經常關注下面兩種複雜度
什麼是好的架構!
1.目標 我們希望乙個好的架構能夠 1.1.重用 為了避免重複勞動,為了降低成本,我們希望能夠重用之前的 之前的設計。重用是我們不斷追求的目標之一,但事實上,做到這一點可沒有那麼容易。在現實中,人們已經在架構重用上做了很多的工作,工作的成果稱為框架 framework 比如說windows的視窗機制...
什麼是好的產品?
好的產品談起來維度比較多,從使用者角度和企業角度來說是2個大方向。對使用者來說什麼是好的產品?1 產品確實解決了使用者的某些需求。2 產品可用 好用 易用 設計符合使用者習慣,容錯率高,ui精美。3 能讓使用者看到更好的自己。4 激發使用者的情感共鳴。對企業來說什麼又是好的產品?1 產品的競爭壁壘高...
什麼是好的軟體
1 什麼是好的軟體 從使用者角度 軟體符合指定需求 軟體幾乎沒有缺陷 軟體效能正常 軟體容易上手 操作方便 從開發人員角度 可測試性 可維護性 可讀性 效率 高效管理資源 安全 可預防常見威脅 從老闆角度 軟體按時交付 軟體滿足預算 可復用的開發過程,確保交付質量 2 高質量的軟體產品 做了使用者想...