時間複雜度分析 下

2021-09-29 14:04:05 字數 2871 閱讀 3955

// n表示陣列array的長度

int find(int array, int n, int x)

return pos;

}

時間複雜度為:o(n)

優化**:

// n表示陣列array的長度

int find(int array, int n, int x)

} return pos;

}

要查詢的變數 x 可能出現在陣列的任意位置, 所以時間複雜度會有不確定性:有最好最壞情況時間複雜度。當第乙個位置的元素值等於x時,是最好情況時間複雜度,當最後乙個位置的元素值等於x時,是最壞情況時間複雜度

最好情況時間複雜度和最壞情況時間複雜度對應的都是極端情況下的**複雜度,發生的概率其實並不大。為了更好地表示平均情況下的複雜度,需要引入另乙個概念:平均情況時間複雜度

借助剛才查詢變數 x 的例子來給你解釋:

要查詢的變數 x 在陣列中的位置,有 n+1 種情況:在陣列的 0~n-1 位置中和不在陣列中。我們把每種情況下,查詢需要遍歷的元素個數累加起來,然後再除以 n+1,就可以得到需要遍歷的元素個數的平均值,即

我們知道,時間複雜度的大 o 標記法中,可以省略掉係數、低階、常量,所以,咱們把剛剛這個公式簡化之後,得到的平均時間複雜度就是 o(n)。

這個結論雖然是正確的,但是計算過程稍微有點兒問題。究竟是什麼問題呢?我們剛講的這 n+1 種情況,出現的概率並不是一樣的。

我們知道,要查詢的變數 x,要麼在陣列裡,要麼就不在陣列裡。 我們假設在陣列中與不在陣列中的概率都為 1/2。另外,要查詢的資料出現在 0~n-1 這 n 個位置的概率也是一樣的,為 1/n。

所以,根據概率乘法法則,要查詢的資料出現在 0~n-1 中任意位置的概率就是 1/(2n)。因此,前面的推導過程中存在的最大問題就是,沒有將各種情況發生的概率考慮進去。如果我們把每種情況發生的概率也考慮進去,那平均時間複雜度的計算過程就變成了這樣:

這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫加權平均時間複雜度或者期望時間複雜度。

引入概率之後,前面那段**的加權平均值為 (3n+1)/4。用大 o 表示法來表示,去掉係數和常量,這段**的加權平均時間複雜度仍然是 o(n)。

在大多數情況下,我們並不需要區分最好、最壞、平均情況時間複雜度三種情況。很多時候,我們使用乙個複雜度就可以滿足需求了。只有同一塊**在不同的情況下,時間複雜度有量級的差距,我們才會使用這三種複雜度表示法來區分。

均攤時間複雜度,聽起來跟平均時間複雜度有點兒像。

大部分情況下,我們並不需要區分最好、最壞、平均三種複雜度。

平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊、更加有限。

// array表示乙個長度為n的陣列

// **中的array.length就等於n

int array = new int[n];

int count = 0;

void insert(int val)

array[0] = sum;

count = 1;

}array[count] = val;

++count;

}

這段**實現了乙個往陣列中插入資料的功能。當陣列滿了之後,也就是**中的 count == array.length 時,我們用 for 迴圈遍歷陣列求和,並清空陣列( count = 1後array[count] = val會覆蓋掉原來的值),將求和之後的 sum 值放到陣列的第乙個位置,然後再將新的資料插入。

最理想的情況下,陣列中有空閒空間(count = 0, n = 0),我們只需要將資料插入到陣列下標為 count 的位置就可以了,所以最好情況時間複雜度為 o(1)。最壞的情況下,陣列中沒有空閒空間了(++count後count=n時),我們需要先做一次陣列的遍歷求和,然後再將資料插入,所以最壞情況時間複雜度為 o(n)。

那平均時間複雜度是多少呢?

答案是 o(1)。

通過概率論的方法來分析。假設陣列的長度是 n,根據資料插入的位置的不同,我們可以分為 n 種情況,每種情況的時間複雜度是 o(1)。除此之外,還有一種「額外」的情況,就是在陣列沒有空閒空間時插入乙個資料,這個時候的時間複雜度是 o(n)。而且,這 n+1 種情況發生的概率一樣,都是 1/(n+1)。所以,根據加權平均的計算方法,我們求得的平均時間複雜度就是:

今天你準備去老王家拜訪下,可惜老王的愛人叫他去打個醬油,她告訴你說她限時n分鐘?給他去買。

那麼你想著以他家到樓下小賣部來回最多一分鐘,那麼 「最好的情況」就是你只用等他一分鐘。

那麼也有可能遇到突發情況,比如說電梯人多吖,路上摔了一膠,天知道他去幹了什麼,用了n分鐘,沒辦法?,主上有令,n分鐘限時,那這就是「最壞的情況」。

難點,平均時間複雜度 就是他有可能是第1.2.3…n,中的某個分鐘回來,那平均就是1+2+3+…n/n,把 所有可能出現的情況的時間複雜度 相加除以 情況數 。

均攤的話就是把花時間多的分給花時間少的,得到乙個中間值,所以說這就會和平均混淆,個人覺得主要還是概念不同。

假如n是10分鐘,那麼9分鐘分4分鐘到1分鐘那,8分3給2…,那均攤下來就是5分鐘.編不下去了??‍♀️`

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

複雜度分析 時間複雜度分析和空間複雜度分析

其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...

複雜度分析(上)時間複雜度 空間複雜度

為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...