從0到1學演算法 大O表示法

2022-08-29 08:48:06 字數 1811 閱讀 5666

一般我們在選擇演算法時,都是想要選擇效率最高的演算法。那演算法的效率,用什麼表示?沒錯!就是用大o表示法。

ps: 大o表示法中,log即為log2,後面不再說明。

下面以簡單查詢和二分查詢,在含有n個元素的有序列表中查詢其中乙個元素為例,下表總結了我們發現的情況。

使用簡單查詢時,最多需要猜測次數與列表長度相同,這被稱為線性時間,大o表示法為o(n)。

二分查詢則不同,最多需要猜測次數為logn(n為列表長度),這被稱為對數時間(log時間),大o表示法為o(logn)。

基本概念

大o表示法指出了演算法的速度有多快。

可能你會好奇,它的單位是多少?秒?沒有單位,它並非指的是時間,而是從增量的角度衡量。

列表中查詢元素,簡單查詢、二分查詢的增速如下圖。

對於簡單查詢,100個元素時為100毫秒,簡單推算出10000個元素為10秒;

對於二分查詢,100個元素時為7毫秒,簡單推算出10000個元素為700毫秒。

ps:簡單推算 10000個元素時的執行時間= 執行時間(100個元素時)* 100

簡單查詢的推算是對的,因為的增速是n,而二分查詢的推算是錯的,它的增速為logn,這便不能理所當然簡單推算了。

很顯然,我們只要知道演算法的增速,便能知道它在n個元素中執行的執行時間了,大o表示法就是用來表示演算法增速的。

專業描述:大o表示法表示運算元的增速,指出了演算法執行時間的增速。

常見的大o執行時間(從快到慢)

大o表示法的不同維度

時間複雜度

上述的大o表示法都是用來表示時間複雜度,而且通常指的是最壞情況下的時間複雜度。

通常有以下3種時間複雜度:

以簡單查詢為例子,在n個元素的列表中查詢目標元素

大o表示法,會省略係數、低階、常量,所以平均情況時間複雜度是o(n)

空間複雜度

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度,反映的是乙個趨勢。

空間複雜度比較常用的有:o(1)、o(n)、o(n²),我們下面來看看:

空間複雜度 o(1)

如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化,即此演算法空間複雜度為乙個常量,可表示為 o(1)。

例子:

int i = 1;

int j = 2;

++i;

j++;

int m = i + j;

i、j、m 所分配的空間都不隨著處理資料量變化,因此它的空間複雜度 o(1)。

空間複雜度 o(n)

int m = new int[n]

for(i=1; i<=n; ++i)

第一行new了乙個長度為n的陣列m,占用大小為n,後面雖然有迴圈,但沒有再分配新的空間,因此,這段**的空間複雜度主要看第一行即可,即o(n)。

ps

演算法學習 大O表示法

上一節我們使用了兩種不同的方式來獲得兩個數的最大公約數,那麼如何判斷我們應該使用哪一種方式呢?這裡就涉及到了演算法的時間複雜度 空間複雜度 穩定性等幾個方面的因素,這次我們要討論的大o表示法就是用來表示時間複雜度。大o表示法法讓你能夠比較運算元,它指出了演算法執行時間的增速 演算法 在開始學習之前請...

如何評估演算法效能 大O表示法

一 請問如何評估乙個演算法的效能?什麼是大o表示法?答 評估演算法效能,主要評估問題的輸入規模n與元素訪問次數f n 的次數。大o符號,忽略非主體部分,如常數項 低階項。o g n g n 表示漸進上界。二 請說出以下程式的時間複雜度?for int i 1 i n i o n 線性複雜度 for ...

資料結構與演算法(2 從Reverse到大O表示法)

接上面的問題,如何從實現乙個陣列的翻轉,其實很簡單 1 定義乙個頭,乙個尾 2 判斷條件 頭是否大於尾 3 交換元素值 4 頭,尾更向中間靠攏 如下 關鍵 public static void reversearray int arr 演算法的執行時間等於它所有基本操作執行時間之和,而一條基本操作的...