知识点2:多项式时间
時間復雜度通俗的理解:
時間復雜度并不是表示一個程序解決問題需要花多少時間,而是當問題規(guī)模擴大后,程序需要的時間長度增長得有多快。也就是說,對于高速處理數(shù)據(jù)的計算機來說,處理某一個特定數(shù)據(jù)的效率不能衡量一個程序的好壞,而應該看當這個數(shù)據(jù)的規(guī)模變大到數(shù)百倍后,程序運行時間是否還是一樣,或者也跟著慢了數(shù)百倍,或者變慢了數(shù)萬倍。不管數(shù)據(jù)有多大,程序處理花的時間始終是那么多的,我們就說這個程序很好,具有O(1)的時間復雜度,也稱常數(shù)級復雜度;數(shù)據(jù)規(guī)模變得有多大,花的時間也跟著變得有多長,這個程序的時間復雜度就是O(n),比如找n個數(shù)中的最大值;而像冒泡排序、插入排序等,數(shù)據(jù)擴大2倍,時間變慢4倍的,屬于O(n2)的復雜度。還有一些窮舉類的算法,所需時間長度成幾何階數(shù)上漲,這就是O(an)的指數(shù)級復雜度,甚至O(n!)的階乘級復雜度。不會存在O(2n2)的復雜度,因為前面的那個“2”是系數(shù),根本不會影響到整個程序的時間增長。同樣地,O (n3+n2)的復雜度也就是O(n3)的復雜度。因此,我們會說,一個O(0.01n3)的程序的效率比O(100*n2)的效率低,盡管在n很小的時候,前者優(yōu)于后者,但后者時間隨數(shù)據(jù)規(guī)模增長得慢,最終O(n3)的復雜度將遠遠超過O(n2)。我們也說,O(n100)的復雜度小于O(1.01n)的復雜度。
多項式的理解:
對于變量n,5n2+2n+1這種就叫做多項式。前面再加上n3甚至一路增加到nm,只要m是個常量,就都是多項式。因為這樣的式子合并同類項什么的簡化到最后還是會有好幾個含n的項,所以叫做多項式。然后再說問題大小n。其實字面理解就對了…也就是說,我們要解決一個問題,這個問題里面有n個“東西”要處理,這個問題的大小就是n。比方說,我們要把5、7、9這三個數(shù)字排序,問題大小就是3。我們要把全世界人類里面的男的找出來,問題大小就是全世界人口數(shù)。然后是多項式倍數(shù)。這個倍數(shù)是指,對于一個變量n,有這樣一個倍數(shù),它的值是n的一個多項式。比方說,我們假設n=5,那么n2+10=52+10=35,這個35就是n的一個多項式倍數(shù)。因為對于n有無限多種多項式組合,所以它也就有無窮多個多項式倍數(shù)。多項式倍數(shù)之所以特殊,主要是由于其值隨n增大而加速增大的特性。如果是常數(shù)時間的話,意思就是無論n是什么值運算所花時間都一樣。線性時間則是說多大n就花多少時間。多項式時間則意味著隨著n增大,n每增加1所花的時間增長越來越多。對于n2-3這樣一個多項式時間來說,n=2的時候可能只要花1的時間,甚至低于線性時間,但n=4的時候可能就要花13的時間了,可以想象再大一些這個數(shù)值會變得巨大。但是它又不及指數(shù)時間增長快(mn),且mn不能寫成多項式形式,所以它又和多項式時間有區(qū)別。而且,這個增長變速的特性是不受參數(shù)限制的。也就是說,無論你把m*n2的m這個常量改成多么微小的一個值,總有一個n讓這個多項式的值大于n,也就是說到這一刻多項式時間的算法耗時高于了線性時間的算法,之后耗時差距一定會越來越大。這一特性是多項式本身的性質(zhì)決定的。類似,指數(shù)級時間也是如此,無論你將n的一個多項式中的所有常量設置到多大,總有一個n的指數(shù)值大于多項式值。所以我們說指數(shù)時間大于多項式時間,我們說多項式時間大于線性時間,我們還說線性時間大于常數(shù)時間,一定要注意這些大于并不是對于所有n的所有情況成立的,只是在說隨著n增加前者一定超過后者。
總結(jié):
一種是O(1),O(log(n)),O(na)等,我們把它叫做多項式級的復雜度,因為它的規(guī)模n出現(xiàn)在底數(shù)的位置;另一種是O(an)和O(n!)型復雜度,它是非多項式級的,其復雜度計算機往往不能承受。當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復雜度,非多項式級的復雜度需要的時間太多,往往會超時,除非是數(shù)據(jù)規(guī)模非常小。
總結(jié)
以上是生活随笔為你收集整理的知识点2:多项式时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS实现动态进度条
- 下一篇: 佳博打印机android版本代码优化