當我們從時間和空間方面分析任何演算法的複雜性時,我們永遠不能以確切的數字去定義執行演算法所需的時間和空間,因此我們需要用一些標準符號來表達,也被稱為漸近符號。
當我們在分析任何乙個演算法時,我們通常會用乙個公式來表示執行該演算法所需的時間或者計算機編譯執行所需的時間,記憶體訪問次數,比較次數,占用記憶體的臨時變數等,該公式通常包含一些不重要的細節來告訴我們演算法執行的時間。
我們來舉乙個例子,如果某些演算法的時間複雜度為t(n)=(n ^2 + 3n + 4),這是乙個二次方程。對於較^大的值n,對於n^2來說,3n+4這部分變得無關緊要。
對於n=1000,n^2=1000000,3n+4=3004,可見3n+4是可忽略不計的。
對外,當我們對比倆演算法的時間複雜度時,高階項的常數係數也被忽略。
對於任何大於200的n值,乙個需要200n^2的演算法將比其他需要n^3時間的演算法更快。由於我們只關心函式增長的漸近行為,常數因子也可以忽略。
『漸近』一詞意味著無限接近乙個曲線或者乙個值(在某種限制下)
我們來舉乙個例子
如果我們有兩個演算法,下面的表示式表示他們執行所需要的時間,那麼:
表示式1:(20n^ 2 + 3n – 4)
表示式2:(n ^3 + 100n – 2)
現在,根據漸近符號,我們應該觀察函式如何隨著n(輸入)的值的增長而增長,這完全取決於表示式1的n^2和表示式2的n^3。因此,我們可以說,執行時間由表示式2表示的演算法將比另乙個演算法增長更快,只需要分析最高項即可,類似於3n-4或者100n-2這種項可以直接忽略。
這裡面的核心思想是拋棄不太重要的部分,使其更易於管理。
我們要做的是,第一部,分析演算法找到表達其時間的公式。。然後分析該公式怎麼隨著n的增長而增長。
我們通常使用三種型別的漸近符號來表示任意演算法的增長。
big theta (θ)
big oh(o)
big omega (ω)
big theta 通常表示演算法的實際執行時間所在的平均值的或者範圍的時間複雜度。
例如,如果對於某些演算法,時間複雜度由表示式3n^2+5n表示,並且我們使用big theta表示法來表示此。則時間複雜度將為θ(n ^2)(忽略常數係數並移除不重要的部門即5n.這裡
這裡,在上面的例子中θ(n ^2)的複雜性意味著任何輸入的平均時間都將保持在其間,並且在k1,k2是兩個常數的情況下,通過緊密的結合表示式來表示演算法的增長k1n^2 ,k2n^2
這種表示法被稱為演算法的上界,或者演算法的最壞情況,
它通常告訴我們某個函式永遠不會超過輸入值的指定時間n
那麼問題來了,當我們有θ這種表達方式的時候,為什麼還需要o來表示,下面我們將以乙個小例子來介紹一下
在最壞的一種情況下,我們要,從陣列的第乙個元素,搜尋到尾部找到我們需要的元素,這時候就導致了時間複雜度為n,(n為元素的數量)
也可能發現這樣的情況,我們正在搜尋的元素是陣列的第乙個元素,這時候時間複雜度為1
現在這種情況下,用big-θ表示線性搜尋的時間複雜度為θ(n),這是一種表示平均時間複雜度的方法。很顯然,在這裡是不合適的,這時候我們用o(n)來表示,這意味這時間複雜度永遠不會超過o(n),定義了漸近上線,也就是它可以小於或者等於n,這才是正確的表示。
在大多數情況下,你都會看到用big-o來表示演算法的複雜度,只因為它更有意義。
其來表示任何演算法的下限,或者最佳情況。
這始終表示任何演算法對所有輸入值所需的最短時間,因此是任何演算法的最佳情況。
簡單來說,當我們以big-ω的形式表示任何演算法的時間複雜度時,我們的意思是演算法將至少花費這麼多時間來完成它的執行。
資料結構與演算法二
資料結構作為一門學科主要研究資料的各種邏輯結構和儲存結構,以及對資料的各種操作。因此,主要有三個方面的內容 資料的邏輯結構 資料的物理儲存結構 對資料的操作 或演算法 通常,演算法的設計取決於資料的邏輯結構,演算法的實現取決於資料的物理儲存結構。邏輯結構 是指資料物件中資料元素之間的相互關係。其實這...
資料結構與演算法(二)
函式的漸近增長 給定兩個函式 f n 和 g n 如果存在乙個整數n,使得對於所有的n n,f n 總是比g n 大,那麼我們說f n 的增長漸近快於g n 如圖 演算法時間複雜度的定義 在進行時間演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t ...
資料結構與演算法 二
佇列是一種特殊的線性表 線性結構 特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。佇列按照邏輯資料結構可以分為順序佇列和迴圈佇列....