04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
這段代碼的時間復雜度還是 O(n) 嗎?如果數組中第一個元素正好是要查找的變量 x,那就不需要繼續遍歷剩下的 n-1 個數據了,那時間復雜度就是 O(1)。但如果數組中不存在變量 x,那我們就需要把整個數組都遍歷一遍,時間復雜度就成了 O(n)。所以,不同的情況下,這段代碼的時間復雜度是不一樣的。
最好時間復雜度:
最好情況時間復雜度就是,在最理想的情況下,執行這段代碼的時間復雜度。就像我們剛剛講到的,在最理想的情況下,要查找的變量 x 正好是數組的第一個元素,這個時候對應的時間復雜度就是最好情況時間復雜度。
最壞時間復雜度
最壞情況時間復雜度就是,在最糟糕的情況下,執行這段代碼的時間復雜度。就像剛舉的那個例子,如果數組中沒有要查找的變量 x,我們需要把整個數組都遍歷一遍才行,所以這種最糟糕情況下對應的時間復雜度就是最壞情況時間復雜度。
平均時間復雜度
平均時間復雜度的全稱應該叫加權平均時間復雜度或者期望時間復雜度。平均時間復雜度分析比較復雜,還要涉及概率論的知識
均攤時間復雜度
大部分情況下,我們并不需要區分最好、最壞、平均三種復雜度。平均復雜度只在某些特殊情況下才會用到,而均攤時間復雜度應用的場景比它更加特殊、更加有限。
// array表示一個長度為n的數組// 代碼中的array.length就等于nint[] array = new int[n];int count = 0;void insert(int val) {if (count == array.length) {int sum = 0;for (int i = 0; i < array.length; ++i) {sum = sum + array[i];}array[0] = sum;count = 1;}array[count] = val;++count;}最理想的情況下,數組中有空閑空間,我們只需要將數據插入到數組下標為 count 的位置就可以了,所以最好情況時間復雜度為 O(1)。最壞的情況下,數組中沒有空閑空間了,我們需要先做一次數組的遍歷求和,然后再將數據插入,所以最壞情況時間復雜度為 O(n)。每一次 O(n) 的插入操作,都會跟著 n-1 次 O(1) 的插入操作,所以把耗時多的那次操作均攤到接下來的 n-1 次耗時少的操作上,均攤下來,這一組連續的操作的均攤時間復雜度就是 O(1)。這就是均攤分析的大致思路
對一個數據結構進行一組連續操作中,大部分情況下時間復雜度都很低,只有個別情況下時間復雜度比較高,而且這些操作之間存在前后連貫的時序關系,這個時候,我們就可以將這一組操作放在一塊兒分析,看是否能將較高時間復雜度那次操作的耗時,平攤到其他那些時間復雜度比較低的操作上。而且,在能夠應用均攤時間復雜度分析的場合,一般均攤時間復雜度就等于最好情況時間復雜度。盡管很多數據結構和算法書籍都花了很大力氣來區分平均時間復雜度和均攤時間復雜度,但其實我個人認為,均攤時間復雜度就是一種特殊的平均時間復雜度,我們沒必要花太多精力去區分它們。你最應該掌握的是它的分析方法,攤還分析。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生鲜网超MySQL_天天生鲜项目实战-思
- 下一篇: 天天生鲜(Django4.0版本) +