算法的时间复杂度表示法(大O表示法)
大 O 復雜度表示法
算法的執行效率,粗略地講,就是算法代碼執行的時間。但是,如何在不運行代碼的情況下,用“肉眼”得到一 段代碼的執行時間呢?
for a in range(0, 1001):for b in range(0, 1001): for c in range(0, 1001): if a**2 + b**2 == c**2 and a+b+c == 1000:print("a, b, c: %d, %d, %d" % (a, b, c))通過這段代碼執行時間的推導過程,我們可以得到一個非常重要的規律,那就是,所有代碼的執行時間 T(n) 與每 行代碼的執行次數 n 成正比。
其中,T(n)表示代碼執行的時間;n 表示數據規模的大小;f(n) 表示每行代碼執行的次數總 和。因為這是一個公式,所以用 f(n) 來表示。公式中的 O,表示代碼的執行時間 T(n) 與 f(n) 表達式成正比。
T(n) = O(n^3*2) 這就是大 O 時間復雜度表示法,大 O 時間復雜度實際上并不具體表示代碼真正的執行時 間,而是表示代碼執行時間隨數據規模增長的變化趨勢,所以,也叫作漸進時間復雜度(asymptotic time complexity),簡稱時間復雜度。 當n很大時,你可以把它想象成 10000、100000。而公式中的低階、常量、系數三部分并不左右增長趨勢,所以 都可以忽略。我們只需要記錄一個最大量級就可以了
時間復雜度分析
大 O 這種復雜度表示方法只是表示一種變化趨勢。我們通常會忽略掉公式中的常量、低階、系數,只需要記錄一 個最大階的量級就可以了。所以,我們在分析一個算法、一段代碼的時間復雜度的時候,也只關注循環執行次數 最多的那一段代碼就可以了。這段核心代碼執行次數的 n 的量級,就是整段要分析代碼的時間復雜度。
def cal(n): sum = 0 i = 1for i in rang(n+1): sum += i i+=1 return sum其中第 2、3 行代碼都是常量級的執行時間,與 n 的大小無關,所以對于復雜度并沒有影響。循環執行次數最多 的是第 4、5 行代碼,所以這塊代碼要重點分析。前面我們也講過,這兩行代碼被執行了 n 次,所以總的時間復 雜度就是 O(n)。
綜合這三段代碼的時間復雜度,我們取其中最大的量級。所以,整段代碼的時間復雜度就為 O(n2)。也就是說: 總的時間復雜度就等于量級最大的那段代碼的時間復雜度
最壞時間復雜度
分析算法時,存在幾種可能的考慮:
- 算法完成工作最少需要多少基本操作,即最優時間復雜度
- 算法完成工作最多需要多少基本操作,即最壞時間復雜度
- 算法完成工作平均需要多少基本操作,即平均時間復雜度
對于最優時間復雜度,其價值不大,因為它沒有提供什么有用信息,其反映的只是最樂觀最理想的情況,沒有參考價值。
對于最壞時間復雜度,提供了一種保證,表明算法在此種程度的基本操作中一定能完成工作。
對于平均時間復雜度,是對算法的一個全面評價,因此它完整全面的反映了這個算法的性質。但另一方面,這種衡量并沒有保證,不是每個計算都能在這個基本操作內完成。而且,對于平均情況的計算,也會因為應用算法的 實例分布可能并不均勻而難以計算。 因此,我們主要關注算法的最壞情況,亦即最壞時間復雜度。
常見時間復雜度
常見的復雜度并不多,從低階到高階有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)。
| 12 | O(1) | 常數階 |
| 2n + 3 | O(n) | 線性階 |
| 3n^2 + 3n + 1 | O(n^2) | 平方階 |
| log2n + 20 | O(logn) | 對數階 |
| 2n+3nlog2n+19 | O(nlogn) | nlogn階 |
| 2^n | O(2^n) | 指數階 |
總結
以上是生活随笔為你收集整理的算法的时间复杂度表示法(大O表示法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZYNQ上无DDR加载应用
- 下一篇: matlab非线性优化求解,用MATLA