演算法與資料結構 時間複雜度

2021-09-08 19:20:32 字數 4294 閱讀 6352

複雜度是衡量乙個演算法效率高低的乙個重要的因素,一般分為時間複雜度和空間複雜度。

空間複雜度,一般在排序等 抽象資料型別的運算和物理實現 有關。本篇主要介紹時間複雜度的一些概念。

我們在ram模型:1)記憶體無限大 2)基本運算o(1)下面考慮接下來的內容。

「準確的說,演算法的複雜性是執行演算法所需要的計算機的資源的量。需要的時間資源的量 稱為時間複雜性,需要的空間資源的量 稱為空間複雜性;這個量應該集中反映演算法的效率,從實際的計算機中抽象出來。」

上句源於教材,更加好理解的是,反映 需求資源的量 或者說 複雜性 的東西,就是複雜度,它應該取決於兩個因素:(1)問題的規模:n (2)演算法的輸入:i。

複雜度能夠反映 當規模n變化的時候,演算法花費時間的變化,或者說,程式語句執行次數的變化。

ps:一般來說,需要估計演算法的效率的時候,提到複雜性就需要考慮複雜度,兩者相互關聯,密不可分。

意義:當n處在乙個非常大的情況下(n趨近與無窮大 或者 n>=n0)的效率問題。

如果用c表示複雜性,那麼演算法的複雜性應該表示為 c(n, i)。根據複雜性分為:時間複雜性和空間複雜性,這個 c(n, i) 可以分為 (1)t(n, i) (2)s(n, i)。

本文主要討論 t(n, i),在教材的p2: 計算機對每乙個元計算 進行統計,然後根據公式來得到 t(n, i)。

缺陷:但是這個 計算機提供的元計算 是非常多的。不可能對規模為n(或者說,規模無窮大)的問題 的每乙個合法的輸入,都進行乙個統計。

那麼怎麼辦嘞?

這裡影響演算法複雜度的主要因素,是輸入。

在上面,由於規模非常大,沒有辦法對 大規模的問題 的 每乙個輸入 進行精確的計算。

那麼我們選用 三種情況下比較有代表性的複雜度 來作為我們考量演算法效率的參考。

以下面的**為例:

cin >> k; // 1 <= k <= 100

for(int i = 0; i < 10; i++)

}

最好情況(也叫做 最優情況):當輸入的k為1的時候,輸出hello語句的次數也就 10*1 次,是所有的輸入k中 -> 輸出hello最少 -> 語句執行最少 -> 時間花的最少

也就是說,由 輸入的k 所主導的時間複雜度,在輸入k=1的情況下,相對複雜度最低。

最壞情況:當輸入的k為100的時候,輸出hello語句的次數達到了 10*100 次。語句執行次數最多,時間花的最多,相對複雜度最高。

平均情況:∑(每種k取值的概率 * 取這種k 情況下的複雜度)。這裡的話,每種k取值的概率為 1/100,算出來的平均情況的複雜度為 10*50.5。

以上三種情況下的時間複雜度從不同的角度(最好最壞平均)反映演算法的效率,實踐證明,可操作性最好且最有價值的是 最壞情況下的時間複雜度。原因:它反映了在問題規模為n的情況下,由輸入決定的 問題複雜度的上限。

詳細的計算在教材的p2.

但是,還是特別麻煩怎麼辦?

定義:t(n)是前面計算演算法複雜度的函式,當n趨向於無窮大的時候,t(n)一般也趨向於無窮大。那麼對於t(n)來說,如果有乙個t(n),在n趨向於無窮大的時候,(t(n) - t(n))/t(n)趨向於0,就說t(n)是t(n)的漸近性態。

這個定義又有點讓人頭疼的意思,大概意思就是說,在n趨向於無窮大的情況下,t(n)和t(n)非常接近,可以近似認為它們相等。

直觀上,t(n)是t(n)去除低階項所留下來的主項。舉個例子:t(n) = 3*n^3 + 2*n^2 + n + 3,那麼當n趨向於無窮大的時候,t(n) = 3*n^3

因此,當n趨向於無窮大的時候,t(n)漸近於t(n),可以用t(n)來代替t(n),作為複雜性的度量。這種替代是對演算法複雜性分析的一種簡化。

複雜性的比較 目的:比較兩個演算法的效率,那麼如果比較的兩個演算法漸近複雜度的階數不一樣的時候,只要確定出來各自的階數,就可以判斷階數小的演算法效率高。

此時不用關心包含在t(n)的常數因子,只需要關心最高端數即可。

引入了四個估計的符號,大o,小o,0中間一橫(θ,西塔),ω,w。

大o的意義是:o(g(n))表示所有以g(n)為上限的函式的集合;當f(n)的複雜度是o(g(n))的時候,在f(n),g(n)不為常數的情況下,它的數學意義是 f(n)屬於o(g(n))。

小o也和大o差不多,但是大o的以g(n)為上限,這個上限g(n)是可以取到的;但是小o取不到。

ω的意義是:ω(g(n))表示所有以g(n)為下限的函式的集合;w和它差不多,但是取不到下限。

另外一種說法:f(n)的複雜度為o(g(n)) 代表 存在乙個常數c,使得當n>n0的時候,f(n) <= c*g(n)

其它的符號可以進行模擬。

(1)θ(西塔):緊確界。相當於"="

(2)o (大歐):上界。相當於"<="

(3)o(小歐):非緊的上界。相當於"<"

(4)ω(大歐公尺伽):下界。相當於">="

(5)ω(小歐公尺伽):非緊的下界。 相當於">"

這五個符號的數學意義,都是集合。

常見問題
(1)類似o(2*n^3),g(n) = 2*n^3是否正確?不正確,不應該包含常數。

(2)當評判複雜度的時候,o和ω不經常出現,因為 f(n) ∈ o(g(n)) 的時候,無非就兩種情況:1)f(n) = θ(g(n)) 2)f(n) = o(g(n))。ω也是一樣的道理。

(3)當o評判的演算法複雜度的上限g(n)的階數越低時,評估越精確;當ω評判的演算法複雜度的下限g(n)的階數越高時,評估越精確。

(4)o(1) 和 o(2) 的關係:等於關係。由o(1)的定義和o(2)的定義(都是集合,o(1)中的元素以1為上限,o(2)中的元素以2為上限),我們很容易認為 o(1)從屬於o(2)。但是,1和2都是常數,而o的數學定義是針對上限為g(n)的函式的。因此我們需要從第二個定義出發,o(1)代表函式f(n)存在乙個常數c1,使得n>n0的時候,f(n) <= c1*1; o(2)代表函式f(n)存在乙個常數c2,使得當n>n0的時候,f(n) <= c2*2。那麼以上兩種情況,我們只需要取c1為2,c2為1即可讓這兩個複雜度所代表的意義相同。

因此,o(1)和o(k)(其中k為常數)所代表的意義相同。

nlogn,n,n^2,n^3,logn,1·····

不一定,有時候演算法複雜度最低,效能高,會有一些其他的額外損耗(比如空間換時間),在實際應用中,我們常常選用一種折中的策略,來選用演算法。

2016/9/9

資料結構與演算法 時間複雜度與空間複雜度

解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...

資料結構與演算法 時間複雜度和空間複雜度

一 階數比較 時間複雜度判斷理論 o 1 o log2 n o n o n log2 n o n 2 o n k o 2 n 二 計算方法 用常數1代替執行時間中的所有加法常數 修改後的執行次數中只保留最高端項 去除最高端項的係數 三 常見的求時間複雜度例子 1 常數階 int a 1 int b ...

資料結構,演算法,時間複雜度

什麼是資料結構 data structure 中文維基百科 維基百科中文版 在電腦科學中 是計算機中儲存 組織資料的方式。資料結構意味著介面或封裝 乙個資料結構可被視為兩個函式之間的介面,或者是由資料型別聯合組成的儲存內容的訪問方法封裝。不同種類的資料結構適合不同種類的應用,部分資料結構甚至是為了解...