1. 程式人生 > >資料結構與演算法的分析 —— 漸進複雜度(三個記號)

資料結構與演算法的分析 —— 漸進複雜度(三個記號)

對於某些問題,一些演算法更適合於用小規模的輸入,而另一些則相反。幸運的是,在評價演算法執行效率時,我們往往可以忽略掉其處理小規模問題時的能力差異,轉而關注其在處理大規模資料時的表現。道理是顯見的,處理大規模的問題時,效率的些許差異都將對實際執行效率產生巨大的影響。這種著眼長遠,更為關注時間複雜度的總體變化趨勢和增長速度的策略和方法,即所謂的漸進分析(asymptomatic analysis)。

1. 大 O 記號

出於保守的估計,我們首先關注 T(n) 的漸進上界,為此引入大 O 記號。具體地,若存在正的常數 c 和函式 f(n),使得對任何 n>>2 都有:

T(n)
cf(n)

則可認為在 n 足夠大之後,f(n) 給出了 T(n) 增長速度的一個漸進上界,此時,記之為:
T(n)=O(f(n))
由這一定義,可匯出大 O 記號的以下性質:
  • (1)對於任一常數 c>0,有 O(f(n))=O(cf(n))

    c>c,則cf(n)cf(n)

  • (2)對於任意常數 a>b>0,有 O(na+nb)=O(na)

    na+nb2na

2. 大 Ω 記號

為了對演算法的時間複雜度最好情況做出估計,需要藉助另一個記號,如果存在正的常數 c 和函式 g(n),使得對於任何 n>>2 都有:

T(n)
cg(n)

就可以認為,在 n 足夠大之後,g(n) 給出了 T(n) 的一個漸進下界。此時我們記之為:

T(n)=Ω(g(n))

與大 O 記號恰好相反,大 Ω 是對演算法執行效率的樂觀估計,對於規模為 n 的任意輸入,演算法的執行時間都不低於 Ω(g(n))

3. 大 Θ 記號

藉助大 O 記號,大 Ω 記號,可以對演算法的時間複雜度做出定量的界定,亦即,從漸進的趨勢看,T(n) 介於 Ω(g(n))O(f(n)) 之間。若恰巧出現 g(n)=f(n) 的情況,則可以使用另一個記號表示,如果存在正的常數 c1<c2和函式 h(n),使得對於任何 n>>

2,都有,

c1h(n)T(n)c2h(n)

就可以認為在 n 足夠大之後,h(n) 給出了 T(n) 的一個確界,我們記之為:

T(n)=Θ(h(n))

相關推薦

資料結構演算法分析 —— 漸進複雜記號

對於某些問題,一些演算法更適合於用小規模的輸入,而另一些則相反。幸運的是,在評價演算法執行效率時,我們往往可以忽略掉其處理小規模問題時的能力差異,轉而關注其在處理大規模資料時的表現。道理是顯見的,處理大規模的問題時,效率的些許差異都將對實際執行效率產生巨大的影響

資料結構演算法篇 之複雜分析

一直以來都想把資料結構和演算法學好,可是老是學到一半就放棄了,哈哈這次買了一個課程王爭老師學習 這次要用部落格把這個過程記錄下來 第一步先來普及一下資料結構的概念。。。。。。 資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集

資料結構演算法】之複雜分析---第一篇

一、首先明確兩個問題: 1、為什麼需要對演算法進行復雜度分析? 實際上一個演算法執行所耗費的時間和空間是無法從理論上準確算出來的,必須在計算機上實際執行才知道,但是我們不可能對每個演算法都先在計算機上執行一遍,再決定採用其中效率最高的那個。所以我們就需要從理論上分析出每種

資料結構演算法:時間複雜大O表示法

1、概念: 我們知道,時間複雜度和“大O表示法”是我們經常會碰到的概念,它們是用來衡量演算法優劣的度量,那具體怎麼算的呢?來看一下 2、引例 在丟擲概念之前,咱先來個例子: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 為自然數),如何求出所有a、b

資料結構演算法分析c語言描述Mark Allen--佇列ADT連結串列實現

佇列ADT連結串列實現 使用連結串列儲存 操作集合 入隊 出隊 初始化 返回隊前元素 列印 #include <stdio.h> #includ

資料結構演算法分析c語言描述Mark Allen--迴圈佇列ADT陣列實現

迴圈佇列ADT陣列實現 使用陣列儲存 操作集合 入隊 出隊 清空 初始化 返回隊前元素 列印 重點注意! 對於一個迴圈佇列 front == rear時候佇列

資料結構演算法分析c語言描述Mark Allen--線性錶鏈表方法實現

線性表--連結串列實現 標頭檔案 #define ElementType int #define INF INT_MAX #ifndef _List_H struct Node; typedef struct Node *PtrToNode; typedef PtrToN

資料結構演算法分析c語言描述Mark Allen--多項式ADT陣列實現

多項式ADT陣列實現 使用陣列進行儲存 操作集合 乘法 加法 標頭檔案 //cpp head file PloynomialADTarray.h #define MaxDegree 1000 typedef struct Pol { int C

資料結構演算法分析c語言描述Mark Allen--多項式ADT連結串列實現

多項式ADT連結串列實現 使用連結串列結構儲存 操作集合 多項式加法 多項式乘法 多項式的顯示 標頭檔案 //標頭檔案 typedef struct Node *PtrToNode; struct Node { int Cofficient

資料結構演算法分析c語言描述Mark Allen--棧ADT陣列實現

棧ADT陣列實現 使用陣列儲存 操作集合 入棧push 出棧pop 清空 初始化 返回棧頂元素 得到一個隨機棧 列印整個棧 #include <stdio.h> #include <stdlib.h> #include <

資料結構演算法分析c語言描述Mark Allen--棧ADT連結串列實現

棧ADT連結串列實現 使用連結串列儲存 操作集合 入棧push 出棧pop 清空 初始化 返回棧頂元素 列印整個棧 #include <stdio.h> #include <time.h> #include <stdli

資料結構演算法分析》學習筆記-第章-表、棧和佇列

[toc] *** ## Fork me on Github 我自己實現了一個雙向迴圈連結串列,釋出在Github上。 叫**QuickList**,包含完整的連結串列模組原始碼和測試用例。==遵循GPL V2.0協議==。 大家可以去github上獲取,如果覺得好用請幫我點個star,謝謝啦嘿嘿~ [Qu

資料結構演算法JavaScript描述讀書筆記js實現樹

js定義二叉查詢樹 //建立建構函式建立節點 function Node(data){ this.data = data; this.left = null; this.right = null; } function tree(){ this.root = nu

資料結構演算法——從零開始學習棧和佇列

系列文章 第一章:基礎知識 第二章:線性表 第三章:棧和佇列   第一節:棧(Stack) 是限制在表一端進行插入和刪除操作的線性表。允許進行插入、刪除操作的這一端稱為棧頂(Top),另一個固定端稱為棧底。例如棧中有三個元素,近棧的順序是a1、a2、a3,當

資料結構演算法25-散列表查詢雜湊表

散列表查詢(雜湊表) 我們只需要能過某個函式f,使得儲存位置=f(關鍵字) 那樣我們可以通過查詢關鍵字不需要比較就可獲得需要的記錄的儲存位置。這就是一種新的儲存技術-----雜湊技術。 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立一個確定的對應關係f,使得每個關鍵字key對應一個儲存位

資料結構演算法:紅黑樹Red Black Tree

一、簡介 紅黑樹(Red Black Tree)是一棵二叉查詢樹,在每個節點增加一個屬性表示節點顏色,值為紅色(Red)或者黑色(Black)。紅黑樹也是“平衡”樹中的一種,通過對任何一條從根到葉子的路徑上各個節點的顏色來進行約束,確保沒有一條路徑會比其他

資料結構演算法——線性錶鏈式儲存單迴圈連結串列

今天總結迴圈單鏈表 什麼是單迴圈連結串列? 單鏈表終端結點的指標域是指向空的,如果將其指向頭結點,這樣就形成了一個環,那麼這種首尾相接的環就夠成了單迴圈連結串列. 單鏈表中我們都是用頭指標來表示的,但是在單迴圈連結串列裡,用尾指標(指向最後一個節點)。為什麼要這樣,因為如果

考研資料結構演算法之堆疊的使用利用堆疊匹配括號

    具體實現方法如下: int main(void) {     SqStack S;     InitStack(S);     char str[255];     scanf("%s",str);     int i = 0;     while( str[i]

資料結構演算法分析:Java語言描述(第2版)》電子書下載 -網盤 高清版PDF格式

     作者:韋斯 (Mark Allen Weiss) 馮舜璽 (譯) 出版日期:2009年1月1日 出版社:機械工業出版社 頁數:400頁 ISBN:9787111231837 檔案格式:PDF 檔案大小:15.95 MB

資料結構演算法分析-C語言描述 3.4 交集

題目:給定兩個已排序的表L1和L2,只使用基本的表操作編寫計算L1∩L2的過程 /* 3.4 交集 思路:由於是已排序,遍歷L的同時,將L的資料和P的資料進行比較, 如果相同則輸出,並因為是交集,不需要相同,所以P = P->next; 如果不相同,則L = L->nex