1. 程式人生 > 遊戲攻略 >《米德加德部落》新手入門攻略 遊戲系統介紹

《米德加德部落》新手入門攻略 遊戲系統介紹

時間複雜度是衡量演算法好壞的一個重要指標。 衡量程式碼好壞,包括兩個非常重要的指標: 1、執行時間; 2、佔用空間; 由於執行環境和輸入規模的影響,程式碼的絕對執行時間是無法評估的,但我們卻可以預估程式碼基本操作執行次數。 基本操作次數 場景一:一條長10寸的麵包,每3天吃掉1寸,那麼吃掉整個麵包需要幾天? 答案是3 * 10 = 30天。如果麵包的長度是N寸呢?此時吃掉整個麵包,需要3 * n = 3n。如果用一個函式來表達這個相對時間,可以記作T(n) = 3n。 執行次數是線性的。 場景二:一條長16寸的麵包,每5天吃掉剩餘麵包剩餘長度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸…….那麼把麵包吃得只剩1寸,需要多少天? 這個問題翻譯一下,就是數字16不斷地除以2,除第幾次以後的結果等於1?這裡涉及到數字當中對數,以2為底,16的對數,可以簡寫log16。因此,把麵包吃得只剩1寸,需要5 * log16 = 5 * 4 = 20天。如果麵包的長度是N寸呢?需要5 * logn = 5logn,記作T(n) = 5logn。 執行次數是對數的。 場景三:一條長10寸的麵包和一個雞腿,每2天吃掉一個雞腿。那麼吃掉整個雞腿需要多少天呢? 答案自然是2天。因為吃說吃掉雞腿,和10寸的麵包沒有關係。如果麵包的長度是N寸呢?無論麵包有多長,吃掉雞腿的時間仍然是2天,記作T(n) = 2。 執行次數是常量的。 場景四:一條10寸的麵包,吃掉第一個1寸需要1天時間,吃掉第二個1寸需要2天時間,吃掉第三個1寸需要3天時間……每多吃一寸,所花的時間也多1天,那麼吃掉整個麵包需要多少天呢? 答案是從1累加到10的總和,也就是55天。如果麵包的長度是N呢?此時吃掉整個麵包,需要1+2+3+….+n-1+n = (1+2)*n/2 = 0.5n^2 + 0.5n,記作T(n) = 0.5n^2 + 0.5n。 執行次數是一個多項式 漸進時間複雜度 有了基本操作的執行次數函式T(n),是否就可以分析和比較一段程式碼的執行時間了呢?還是有一定困難的。 比如演算法A的相對時間是T(n) = 100n,演算法B的相對時間是T(n) = 5n^2,這兩個到底誰執行時間更長一些?這就要看n的取值了。 所以,這個時候有了漸進時間複雜度的概念,官方的定義如下: 若存在函式f(n),使得當n趨近於無窮大時,T(n) / f(n)的極限值為不等於0的常數,則稱f(n)是T(n)的同數量級函式。 記作T(n) = O(f(n)),稱O(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。 漸進時間複雜度用大寫O來表示,所以也被稱為大O表示法。 如何推匯出時間複雜度呢?有如下幾個原則: 1、如果執行時間是常數量級,用常數1表示; 2、只保留時間函式中的最高階項; 3、如果最高階項存在,則省去最高階項前面的係數; 場景一:T(n) = 3n,最高階項為3n,省去係數3,轉化的時間複雜度為:T(n) = O(n)。 場景二:T(n) = 5logn,最高階項為5logn,省去係數5,轉化為時間複雜度為:T(n) = O(logn)。 場景三:T(n) = 2,只有常數量級,轉化為時間複雜度為:T(n) = O(1)。 場景四:T(n) = 0.5n^2 + 0.5n,最高階項為0.5n^2,省去係數0.5,轉化為時間複雜度為:T(n) = O(n^2)。 這四種時間複雜度究竟誰用時更長,誰更省時間呢?稍微思考一下就可以得出結論: O(1)< O(logn)< O(n) < O(n^2) 現在計算機硬體效能越來越強,為什麼還重視時間複雜度呢? 我們來舉個例子: 1、演算法A的相對時間規模是T(n) = 100n,時間複雜度是O(n); 2、演算法B的相對時間規模是T(n) = 5n^2,時間複雜度是O(n^2); 演算法A執行在家裡的老舊電腦上,演算法B執行在某臺超級計算機上,執行速度是老舊電腦的100倍。 那麼,隨著輸入規模n的增長,兩種演算法誰執行更快呢? 從表格中可以看出,當n的值很小的時候,演算法A的執行用時要遠大於演算法B;當n的值達到1000左右,演算法A和演算法B的執行時間已經很接近;當n的值越來越大,達到十萬、百萬時,演算法A的優勢開始顯現,演算法B則越累越慢,差距越來越明顯。