時間複雜度和兩種基礎排序

2021-08-15 20:37:34 字數 1778 閱讀 6959

乙個操作如果和資料量沒有關係,每次都是固定時間內完成的操作,叫做常數操作。

它是常數運算元量的指標,常用o表示。

計算方法:

在常數運算元量的表示式中,只要高階項,不要低階項,也不要係數,剩下的部分如果記為f(n),你們時間複雜度為f(n)*o(1),即o(f(n));

評價乙個演算法流程的好壞,最先看的指標是時間複雜度,然後分析不同資料樣本下的實際執行時間,也就是常數項時間。

e.g1.

兩層for迴圈,第一層迴圈對常數操作n次,第二層迴圈對常數操作m次,常數操作量為o(n*m),時間複雜度為o(n*m),因為m和n都是未知數,是要在實際情況下才可以確定的數值所以不能化簡。

e.g2.

對常數第一次進行操作n次,第二層進行n-1次操作,第三次進行n-2次操作…第n次進行一次操作,則常熟操作量為:o((n^2 + n)/2),遵循計算方法,取高階不取低階並且忽略係數的原則,時間複雜度為o(n^2)。

e.g3

如下有三種演算法解決了同乙個問題其時間複雜度分別為:

o(m*n)

o(m*logn)

o(m*logm)+o(n+m)

判斷乙個演算法流程的好壞,第一步先從時間複雜度的角度看,由於n一定比logn大,第一種則是最差的演算法;然而第二種和第三種演算法的時間複雜度無法判斷,只有在明確了m和n誰大的情況下才能夠判斷。如果m較大,則第二種更優,如果n較大則第三種更好,時間複雜度o(f(n))可以直接化簡成一階的表示式o(n+m)。

需要額外申請空間的大小的抽象,比如乙個題目,給定了乙個陣列,設計的流程中又多定義了幾個變數,那麼額外空間複雜度就是o(1);如果申請了乙個與原陣列大小相同的陣列,那麼它的額外空間複雜度就是o(n);如果申請了乙個是原陣列大小一半的陣列,那麼它的額外空間複雜度也是o(n),因為忽略係數。

前提:給定乙個無序陣列0~n-1進行排序。

進行多輪比較,每輪比較都是從第乙個位置開始,將相鄰的兩個數進行比較,小的放左邊大的放右邊,每輪比較的結果都是將最大的數放在當前比較的陣列的最後的位置,到下輪比較的時候就不需要再比較那個最大的數,每輪比較都是在找前面還無序的陣列中的最大的數,直到最小的數字置也確定了比較結束。

/*

* 氣泡排序

* 時間複雜度:o(n^2),額外空間複雜度:o(1)

*/public

static

void

sort(int arr) }}

}public

static

void

swap(int arr, int a, int b)

氣泡排序每輪是尋找最大的數,選擇排序則是每輪尋找最小的數,但是每輪比較只進行一次交換。最初指定第乙個位置上的數是最小的數,則取第乙個位置上的數的下標記為最小數的下標minindex,在遍歷這個陣列的時候,只要發現比minindex小的,就將這個數的下標賦給minindex,在遍歷完這個陣列之後將最小的數和第乙個位置上的數進行交換,下一次比較的時候就將最小的minindex設為後面無序陣列部分的第乙個位置,再選出最小的數。。。以此類推比較多輪直到找到最大的數。

/*

* 選擇排序

* 時間複雜度:o(n^2),額外空間複雜度:o(1)

*/public

static

void

sort(int arr)

swap(arr, i, minindex);}}

public

static

void

swap(int arr, int a, int b)

排序演算法 時間複雜度和空間複雜度

常數階o 1 無論 執行了多少行,只要沒有迴圈複雜結構,那麼這個的時間複雜度就是o 1 o 1 時間複雜度 沒有迴圈結構的順序執行,無論執行多少行,時間複雜度均為o 1 public static voido1 對數階o log2n o log2n 時間複雜度 此處 i 以二倍的速度增長,也就是說到...

演算法基礎 時間複雜度和空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間 即暫存器 資源,因此複雜度分為時間和空間複雜度 簡單來說,時間複雜...

數學基礎 時間複雜度和空間複雜度

時間複雜度 是用來衡量當問題規模擴大後,演算法執行的時間增長程度。而不是程式解決問題需要的時間,解決問題所需要的時間取決於計算機效能和問題規模。解決相同規模的問題時,時間複雜度越大,解決問題所需的時間就越長。問題的規模 排序問題,需要排序的資料量即為問題的規模 有的搜尋演算法,解空間的規模為問題的規...