多项式时间算法
????時間復雜度并不是表示一個程序解決問題需要花多少時間,而是當問題規模擴大后,程序需要的時間隨規模增長得有多快。
????也就是說,對于高速處理數據的計算機來說,處理某一個特定數據的效率不能衡量一個程序的好壞。當這個數據的規模變大到數百倍后,程序運行時間是否相差不大,或者也跟著慢了數百倍,或者變慢了數萬倍。
????1、不管數據有多大,程序處理花的時間始終是那么多的,我們就說這個程序很好,具有O(111)的時間復雜度,也稱常數級復雜度;
????2、數據規模變得有多大,花的時間也跟著變得有多長,這個程序的時間復雜度就是O(nnn),比如找n個數中的最大值;
????3、像冒泡排序、插入排序等,數據擴大2倍,時間變慢4倍的,屬于O(n2n^2n2)的復雜度。
????4、窮舉類的算法,所需時間長度成幾何階數上漲,這就是O(ana^nan)的指數級復雜度,甚至O((n!n!n!))的階乘級復雜度。
????不會存在O((2n22n^22n2))的復雜度,因為數字“2”是系數,不會影響到整個程序的時間增長。同樣地,O (n3+n2n^3+n^2n3+n2)的復雜度也就是O(n3n^3n3)的復雜度。因此,我們會說,一個O(0.01n30.01n^30.01n3)的程序的效率比O(100n2100n^2100n2)的效率低,盡管在n很小的時候,前者優于后者,但后者時間隨數據規模增長得慢,最終O(n^3)的復雜度將遠遠超過O(n2n^2n2)。我們也說,O(n100n^{100}n100)的復雜度小于O(1.01n1.01^n1.01n)的復雜度。
????總結:容易看出,前面的幾類復雜度被分為兩種級別,其中后者的復雜度無論如何都遠遠大于前者:一種是O(111),O(log(n)log(n)log(n)),O(nan^ana)等,我們把它叫做多項式級的復雜度,因為它的規模n出現在底數的位置;另一種是O(ana^nan)和O(n!n!n!)型復雜度,它是非多項式級的,其復雜度計算機往往不能承受。當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復雜度,非多項式級的復雜度需要的時間太多,往往會超時,除非是數據規模非常小。
總結
- 上一篇: ACCP软件工程师认证有用吗?
- 下一篇: web3.js 中文文档 入门