如何計算時間復雜度

***************************************************

更多精彩,歡迎進入:http://shop115376623.taobao.com

***************************************************


求解算法的時間復雜度的具體步驟是:

  ⑴ 找出算法中的基本語句;

  算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。

  ⑵ 計算基本語句的執行次數的數量級;

  只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化算法分析,并且使注意力集中在最重要的一點上:增長率。

  ⑶ 用大Ο記號表示算法的時間性能。

  將基本語句執行次數的數量級放入大Ο記號中。

  如果算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果算法中包含并列的循環,則將并列循環的時間復雜度相加。例如:

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

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

  第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο(n2),則整個算法的時間復雜度為Ο(n+n2)=Ο(n2)。

  常見的算法時間復雜度由小到大依次為:

  Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要算法中不存在循環語句,其時間復雜度就是Ο(1)。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)稱為多項式時間,而Ο(2n)和Ο(n!)稱為指數時間。計算機科學家普遍認為前者是有效算法,把這類問題稱為P類問題,而把后者稱為NP問題。

這只能基本的計算時間復雜度,具體的運行還會與硬件有關。

上面的這部分內容是比較可靠的,理解的時候,可以參看著下面的這部分內容。

在計算算法時間復雜度時有以下幾個簡單的程序分析法則:

1.對于一些簡單的輸入輸出語句或賦值語句,近似認為需要O(1)時間

2.對于順序結構,需要依次執行一系列語句所用的時間可采用大O下"求和法則"

求和法則:是指若算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1(n)+T2(n)=O(max(f(n), g(n)))

特別地,若T1(m)=O(f(m)), T2(n)=O(g(n)),則 T1(m)+T2(n)=O(f(m) + g(n))

3.對于選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要O(1)時間

4.對于循環結構,循環語句的運行時間主要體現在多次迭代中執行循環體以及檢驗循環條件的時間耗費,一般可用大O下"乘法法則"

乘法法則: 是指若算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1*T2=O(f(n)*g(n))

5.對于復雜的算法,可以將它分成幾個容易估算的部分,然后利用求和法則和乘法法則技術整個算法的時間復雜度

另外還有以下2個運算法則:

(1) 若g(n)=O(f(n)),則O(f(n))+ O(g(n))= O(f(n))

(2) O(Cf(n)) = O(f(n)),其中C是一個正常數

可以用以上法則對下面程序段進行簡單分析

①for (i=0; i<n; i++)

② for (j=0; j<n; j++)

{

③ c[i][j] = 0;

④ for (k=0; k<n; k++)

⑤ c[i][j]= c[i][j]+ a[i][k]* b[k][j];/ * T5(n) = O(1) */

}

第①條與②③④⑤是循環嵌套T1(n)*T2(n)* (T3(n)+ T4(n)* T5(n))= O(n*n*n)即為整個算法的時間復雜度

O(1)<O(log2n)<O(n)<O(n log2 n)<O(n^2)<O(n^3)<O(2^n)

?

轉自http://blog.sina.com.cn/s/blog_50ce2abb0100vhem.html


表示時間復雜度的階有:

O(1)?:常量時間階??????????O (n):線性時間階

O(n)?:對數時間階????O(nn)?:線性對數時間階

O (nk):?k≥2?,k次方時間階

例1??兩個n階方陣的乘法

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

??????????????????for(j=1; j<=n; ++j)

?????????????????????{???c[i][j]=0 ;

??????????????????????????for(k=1; k<=n; ++k)

?????????????????????????c[i][j]+=a[i][k]*b[k][j] ;?

}

由于是一個三重循環,每個循環從1n,則總次數為:?n×n×n=n3 時間復雜度為T(n)=O(n3)【立方階】

例2??{++x; s=0 ;}

x自增看成是基本操作,則語句頻度為1,即時間復雜度為O(1)?。【常量階】

如果將s=0也看成是基本操作,則語句頻度為2,其時間復雜度仍為O(1),即常量階。

例3???for(i=1; i<=n; ++i)

???????????????{ ++x; s+=x ; }?

語句頻度為:2n,其時間復雜度為:O(n)?,即為【線性階】

例4???for(i=1; i<=n; ++i)

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

???????????????????{ ++x; s+=x ; }

???語句頻度為:n*n*2=2n2?,其時間復雜度為:O(n2)?,即為【平方階】

定理:若A(n)=amnm?+am-1nm-1+…+a1n+a0是一個m次多項式,則A(n)=O(nm)

例5???for(i=2;i<=n;++i)

??????????????for(j=2;j<=i-1;++j)

????????????????????{++x; a[i,j]=x; }

語句頻度為:???1+2+3+…+n-2=(1+n-2) ×(n-2)/2

=(n-1)(n-2)/2 =n2-3n+2

?∴時間復雜度為O(n2),即此算法的時間復雜度為【平方階】

一個算法時間為O(1)的算法,它的基本運算執行的次數是固定的。因此,總的時間由一個常數(即零次多項式)來限界。而一個時間為O(n2)的算法則由一個二次多項式來限界。

以下六種計算算法時間的多項式是最常用的。其關系為:

?????O(1) < O(n) < O(n) < O(nn) < O(n2) < O(n3)

??指數時間的關系為:

????O(2n) < O(n!) < O(nn)

n取得很大時,指數時間算法和多項式時間算法在所需時間上非常懸殊。

1:素數的判斷算法。

void prime( int n)

?

{??

int i=2 ;

while ( (n%i)!=0 && i*1.0< sqrt(n) )??

?????i++ ;

if (i*1.0>sqrt(n) )

??????printf(“&d?是一個素數\n” , n) ;

else

??????printf(“&d?不是一個素數\n” , n) ;

}

嵌套的最深層語句是i++;其頻度由條件( (n% i)!=0 && i*1.0< sqrt(n) )決定,顯然i*1.0< sqrt(n)?,時間復雜度O(n1/2)

或者說是O(sqrt(n))

?

2:冒泡排序法。

Void bubble_sort(int a[]int n)

{??

change=false;

for (i=n-1; change=TURE; i>1 && change; --i)

for (j=0; j<i; ++j)

if (a[j]>a[j+1])

????{?????a[j] ←→a[j+1] ;???change=TURE ; }

}

最好情況:0

最壞情況:1+2+3+?+n-1=n(n-1)/2

平均時間復雜度為:?O(n2)??【平方階】


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458934.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux顯示系統信息軟件下載,linux查看系統信息軟件安裝信息命令學習筆記

查看LINUX安裝版本[rootlocalhost etc]# unameLinux[rootlocalhost etc]# uname -aLinux localhost.localdomain 2.6.32-279.11.1.el6.i686 #1 SMP Tue Oct 16 14:40:53 UTC 2012 i686 i686 i386 GNU/Linux[rootlocalhost etc]# cat /proc/versionLinux version 2.6.32-279.11.…

Bzoj 2662: [BeiJing wc2012]凍結 dijkstra,堆,分層圖,最短路

2662: [BeiJing wc2012]凍結 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 647 Solved: 348[Submit][Status][Discuss]Description “我要成為魔法少女&#xff01;” “那么&#xff0c;以靈魂為代價&#xff0c;你希望得到什么&#xff1f;” “我要將有關魔法和奇…

[轉]opencv學習資料

轉自&#xff1a;http://blog.csdn.net/poem_qianmo/article/details/20537737 1&#xff1a;Mat imread(const string& filename, intflags1 ); eg: Mat image0imread("dota.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//載入最真實的圖像 ge1i…

linux servlet 亂碼問題,Servlet一次亂碼排查后的總結

由來在寫一個小小的表單提交功能的時候&#xff0c;出現了亂碼&#xff0c;很奇怪request上來的參數全部是亂碼&#xff0c;而從數據庫查詢出來的中文顯示到頁面正常&#xff0c;鎖定肯定是request對象那里出了問題。后來經過排查&#xff0c;發現是我封裝的框架中出了問題&…

C/C++回調函數

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 對于很多初學者來說&#xff0c;往往覺得回調函數很神秘&#xff0c;很想知道回調函數…

Linux 命令[2]:mkdir

make directories mkdir -p [目錄名] -p 遞歸創建 [rootlocalhost ~]# mkdir -p test [rootlocalhost ~]# ls anaconda-ks.cfg install.log install.log.syslog test 當然只創建一個目錄 -p 是可以省略的 注&#xff1a;如果創建多級目錄沒有 -p 會報錯 如&#xff1a; [roo…

jQuery動態設置樣式List item

前段時間&#xff0c;Insus.NET有修改一個功能《激活當前視圖菜單高亮呈現》http://www.cnblogs.com/insus/p/5287093.html 今天Insus.NET想改用另外一個方法來實現&#xff0c;使用jQuery。在ASP.NET MVC 環境實現&#xff1a; 代碼&#xff1a; <ul><li><a hr…

linux telnet 權限,允許telnet 通過root用戶進行訪問

允許telnet 通過root用戶進行訪問RHEL6:[rootclovem ~]# yum install telnet-server -y //安裝telnet服務端[rootclovem ~]# cat /etc/xinetd.d/telnet //開啟telnet的托管服務# default: on# description: The telnet server serves telnet sessions; it uses \#unencrypt…

TOUGHRADIUS 項目介紹

2019獨角獸企業重金招聘Python工程師標準>>> TOUGHRADIUS 項目介紹 ToughRADIUS是一個開源的Radius服務軟件&#xff0c;采用于 Apache License 2.0 許可協議發布&#xff0c;從創立之日起&#xff0c;他的宗旨就是服務于中小微ISP&#xff0c;讓運營變得更簡單。 T…

轉:Jmeter 用戶思考時間(User think time),定時器,和代理服務器(proxy server)...

在負載測試中需要考慮的的一個重要要素是思考時間&#xff08;think time&#xff09;&#xff0c; 也就是在兩次成功的訪問請求之間的暫停時間。 有多種情形揮發導致延遲的發生&#xff1a; 用戶需要時間閱讀文字內容&#xff0c;或者填表&#xff0c;或者查找正確的鏈接等。未…

linux sql語句傳參數,Linux/Unixshell參數傳遞到SQL腳本

在數據庫運維的過程中&#xff0c;Shell 腳本在很大程度上為運維提供了極大的便利性。而shell 腳本參數作為變量傳遞給SQL以及SQL腳本也是DB在數據庫運維的過程中&#xff0c;Shell 腳本在很大程度上為運維提供了極大的便利性。而shell 腳本參數作為變量傳遞給SQL以及SQL腳本也…

Myeclipse5.5獲取注冊碼

2019獨角獸企業重金招聘Python工程師標準>>> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MyEclipseGen {private static final String LL "Decompiling this copyrighted software is a vi…

虛函數和純虛函數的區別

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 首先&#xff1a;強調一個概念 定義一個函數為虛函數&#xff0c;不代表函數為不被實…

工作日志WebRoot--編輯頁關于處理兩個關聯的選擇框

案例&#xff1a;點擊編輯&#xff0c;彈出界面后每個欄目都有一個默認的數值&#xff0c;但若其中一個選擇框發生更改&#xff0c;則觸發另一選擇框內的數據發生變動&#xff08;例如組織機構選擇發生變動&#xff0c;則相對應的組織機構的下屬機構也發生變動&#xff09;。 解…

linux下r語言畫圖,linux命令行下使用R語言繪圖實例講解

使用系統&#xff1a;centos 6.4 64bit在R語言中可以使用png()等函數生成圖片&#xff0c;例如&#xff1a; png("aa.png")可以生成圖片。但是如果你是通過shell遠程連接到系統上&#xff0c;可能會碰到如下錯誤&#xff1a;> png("aa.png")錯誤于.Exte…

Windows Mobile Gprs連接與數據傳輸

此模塊分兩部分完成&#xff0c;傳輸數據用socket &#xff0c;要使用socket在ppc上進行數據傳輸&#xff0c;就要誰讓ppc自動連接gprs 。其中套接字和gprs鏈接分別進行說明。 一 &#xff0c;應用程序在進行其它所需的Windows Sockets API調用需要進行一次成功的WSAStartup()調…

C語言變量的類型和存儲位置

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 1. C語言變量主要分為全局變量、靜態全局變量、局部變量、靜態局部變量和寄存器變量。…

nginx+tomcat負載均衡

最近練習nginxtomcat負載均衡。根據一些資料整理了大體思路&#xff0c;最終實現了1個nginx2個tomcat負載均衡。 安裝JDK 1》進入安裝目錄&#xff0c;給所有用戶添加可執行的權限 #chmod x jdk-7u67-linux-i586.rpm //不知這步有沒有必要 2》安裝JDK 輸入命令#rpm –ivh jdk-7…

linux 最強shell,最牛B 的 Linux Shell 命令(一)

引言Shell作為Unix系操作系統當中最有魅力且不可或缺的組件&#xff0c;經過數十載的洗禮不僅沒有被淘汰&#xff0c;而且愈加變得成熟穩健&#xff0c;究其原因&#xff0c;大概因為它是個非常穩固的粘合劑&#xff0c;能夠把大量功能強大的組件任意配搭&#xff0c;總能很好很…

更改Docker默認的images存儲位置

Docker的鏡像以及一些數據都是在/var/lib/docker目錄下&#xff0c;它占用的是Linux的系統分區&#xff0c;也就是下面的/dev/vda1,當有多個鏡像時&#xff0c;/dev/vda1的空間可能不足&#xff0c;我們可以把docker的數據掛載到數據盤&#xff0c;例如&#xff1a;/dev/vdb目錄…