我們經常涉及到的時間複雜度,通常有:o(1),o(n),o(lgn),o(nlogn),o(n^2),這裡面o代表的是演算法執行的時間與變數n的數學關係。
例如我們簡單的寫乙個段相加求和的**:
int sum(int a ,int b)
我們說這個方法的時間複雜度為o(1),換句話說,執行這段**一次的時間就是所需的時間。這裡就是函式的變數為常數1,也就是1次。當然還有2次,3次,像這樣能有具體,有限界的數我們都歸為時間複雜度為o(1)。
所以說,o描述的是演算法的執行時間和輸入資料之間的關係。
我們接著看段**:
int sum( int array)
這是一段遍歷陣列求和的**,陣列的長度這裡未知,我們假設為n,那麼這段**執行次數就為n次,執行完這段**所需要的時間和執行次數n成線性關係。
先是int sum = 0,初始化sum數值為0,假設時間為a。之後遍歷陣列,假設每次遍歷求和花的時間都為b,n次也就花費時間b * n。最後返回sum值時間為c。
那麼,總的時間 :t = a + b * n +c。
這就是執行完這段**所需要的時間和執行次數n成的線性關係。我們捨去a、b和c這些常量,把所花費的時間和變數n的關係就表示成o。即,o(n)。
為什麼不用線性關係,而是捨去常數用時間複雜度?
因為雖然我們常數時間具體代表執行了哪幾段**的時間,但我們不知道其具體花費的時間是多少,在每個不同環境上都會有不同的時間。像上面遍歷陣列求和的**中,a、b和c,知道它們分別代表這初始化sum,sum加操作和返回sum值得時間,但具體時間很難定義。這對於我們衡量一段程式**時間沒有多大的意義,所以通常我們衡量一段程式**用時間複雜度計算。
所以,檢視乙個演算法的時間複雜度將常數捨去看t和n的關係。
t = a=》 o(1)
t = a + b * n +c=》 o(n)
t = a + b * n *n+c =》 o(n^2)
考慮最壞的情況
有人會說時間複雜度大就越慢,其實不是這樣的,例如:
t = a + b * n +c =》 o(n)
t = a + b * n *n+c =》 o(n^2)
如果說上面的o(n)項的常量都很大,具體成立線性關係t = 1000 + 2000 * n +3000 。而o(n^2)項的t = 1 + 2 * n * n+3 ,當我們輸入的n比較小時,很明顯是o(n)項的時間會比較多。但通常我們寫程式**時通常多會考慮最壞的情況,在這裡也就是上面的n接近於無窮大,這時後者肯定花更多的時間,常數這些都可以不考慮。所以,時間複雜度小可以說乙個程式演算法好而不能說它快。
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...