1. 程式人生 > >20150908資料結構(C語言版)演算法時間複雜度問題

20150908資料結構(C語言版)演算法時間複雜度問題

1,
演算法複雜度是在《資料結構》這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學複習起來無從下手,下面我們就這個問題給各位考生進行分析。
首先了解一下幾個概念。一個是時間複雜度,一個是漸近時間複雜度。前者是某個演算法的時間耗費,它是該演算法所求解問題規模n的函式,而後者是指當問題規模趨向無窮大時,該演算法時間複雜度的數量級。
當我們評價一個演算法的時間效能時,主要標準就是演算法的漸近時間複雜度,因此,在演算法分析時,往往對兩者不予區分,經常是將漸近時間複雜度T(n)=O(f(n))簡稱為時間複雜度,其中的f(n)一般是演算法中頻度最大的語句頻度。
此外,演算法中語句的頻度不僅與問題規模有關,還與輸入例項中各元素的取值相關。但是我們總是考慮在最壞的情況下的時間複雜度。以保證演算法的執行時間不會比它更長。
常見的時間複雜度,按數量級遞增排列依次為:常數階O(1)、對數階O(log2n)、線性階O(n)、線性對數階O(nlog2n)、平方階O(n^2)、立方階O(n^3)、k次方階O(n^k)、指數階O(2^n)。
下面我們通過例子加以說明,讓大家碰到問題時知道如何去解決。
1、設三個函式f,g,h分別為 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn
請判斷下列關係是否成立:
(1) f(n)=O(g(n))
(2) g(n)=O(f(n))
(3) h(n)=O(n^1.5)
(4) h(n)=O(nlgn)
這 裡我們複習一下漸近時間複雜度的表示法T(n)=O(f(n)),這裡的”O”是數學符號,它的嚴格定義是”若T(n)和f(n)是定義在正整數集合上的 兩個函式,則T(n)=O(f(n))表示存在正的常數C和n0 ,使得當n≥n0時都滿足0≤T(n)≤C?f(n)。”用容易理解的話說就是這兩個函式當整型自變數n趨向於無窮大時,兩者的比值是一個不等於0的常 數。這麼一來,就好計算了吧。
◆ (1)成立。題中由於兩個函式的最高次項都是n^3,因此當n→∞時,兩個函式的比值是一個常數,所以這個關係式是成立的。
◆ (2)成立。與上同理。
◆ (3)成立。與上同理。
◆ (4)不成立。由於當n→∞時n^1.5比nlgn遞增的快,所以h(n)與nlgn的比值不是常數,故不成立。
2、設n為正整數,利用大”O”記號,將下列程式段的執行時間表示為n的函式。

(1) i=1; k=0 
while(i<n)
{ k=k+10*i;i++;
} 
解答:T(n)=n-1T(n)=O(n), 這個函式是按線性階遞增的。
(2) x=n; // n>1 
while (x>=(y+1)*(y+1))
y++;
解答:T(n)=n1/2T(n)=O(n1/2), 最壞的情況是y=0,那麼迴圈的次數是n1/2次,這是一個按平方根階遞增的函式。
(3) x=91; y=100; 
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
解答: T(n)=O(1), 這個程式看起來有點嚇人,總共迴圈運行了1000次,但是我們看到n沒有? 沒。這段程式的執行是和n無關的,就算它再迴圈一萬年,我們也不管他,只是一個常數階的函式。

一個經驗規則
有如下複雜度關係
c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!
其中c是一個常量,如果一個演算法的複雜度為c 、 log2N 、n 、 n*log2N ,那麼這個演算法時間效率比較高 ,如果是 2^n , 3^n ,n!,那麼稍微大一些的n就會令這個演算法不能動了,居於中間的幾個則差強人意。

2,
學習演算法的同學,如果不知道計算一個演算法的時間複雜度該如何計算,其實是一件很丟臉的事情。最近選修了高階演算法這門課,由於時間緊張,原本就想混過去算了,但是不料考試的時候有40%的題目是計算時間複雜度的,乾脆就好好的總結一下。
概念我也不講了,大家都清楚。關鍵講講怎麼計算比較實際一點。
求解演算法的時間複雜度的具體步驟是:
  ⑴ 找出演算法中的基本語句;
  演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
  ⑵ 計算基本語句的執行次數的數量級;
  只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
  ⑶ 用大Ο記號表示演算法的時間效能。
  將基本語句執行次數的數量級放入大Ο記號中。
  如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加。例如:
  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問題。
這隻能基本的計算時間複雜度,具體的執行還會與硬體有關。

相關推薦

20150908資料結構C語言演算法時間複雜問題

1, 演算法複雜度是在《資料結構》這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學複習起來無從下手,下面我們就這個問題給各位考生進行分析。 首先了解一下幾個概念。一個是時間複雜度,一個是漸

資料結構C語言第三 基礎實驗二

1、編寫函式slnklist delx(linklist head, datatype x),刪除不帶頭結點單鏈表head中第一個值為x 的結點。 並構造測試用例進行測試。 2、假設線性表(a1,a2,a3,…an)採用不帶頭結點的單鏈表儲存, 請設計演算法函式linklist reverse1

資料結構C語言第三基礎實驗一

1、基於sequlist.h中定義的順序表,編寫演算法函式reverse(sequence_list *L),實現順序表的就地倒置。 2、編寫一個演算法函式void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3), 將順

資料結構C語言讀書筆記1(基本概念和術語)

資料: 所有輸入到計算機中,並被計算機程式處理的符號的總稱。 資料元素: 資料的基本單位,在計算機程式中經常被當做一個整體進行考慮和處理 資料物件: 性質相同的資料元素的集合,是資料的一個子集。 資料結構: 相互之間存在一種或多種特定關係的資料元素的集合。這種資料元素之間

資料結構c語言中線性表的單鏈表儲存結構

本文轉自:https://blog.csdn.net/prlhnxx/article/details/79174782 /* run this program using the console pauser or add your own getch, system("pause") or i

關於嚴蔚敏老師《資料結構C語言》書中程式碼的誤解

清華大學嚴蔚敏老師的《資料結構(C語言版)》以其嚴謹被奉為經典,我是從其Pascal版一路追著買到C語言版,一直覺得這本書理論功力深厚,是不可多得的資料結構教材。但其編寫過程中為避免太過拘泥於具體語言細節,使用了ADT描述,具體演算法中使用了偽碼描述,對於新手直接把程式碼原樣照抄是沒法直接在電腦

C語言實現線性表歸併_含原始碼和執行結果_資料結構C語言

採用動態分配順序儲存結構實現 採用單鏈表結構實現 1.採用動態分配實現 #include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREM

資料結構C++語言附習題解析》電子書下載 -網盤 高清PDF格式

       作者:鄧俊輝 出版日期:2013年9月1日 出版社:清華出版社 頁數:514 ISBN:7-302-33064-6 檔案格式:PDF 檔案大小:24.00 MB   &n

資料結構C語言》電子書下載 -網盤 高清PDF格式

作者:嚴蔚敏,吳偉民 出版日期:2007-3-1 出版社:清華出版社 頁數:334 ISBN:9787302147510 檔案格式:PDF 檔案大小:28.95 MB 站長推薦 本書的第1章綜述資料、資料結構和抽象資料型別等基本概念;第2章至第7章從抽象資料

XTU資料結構C語言

表示式中的小括號可能出現不匹配的情況,使用者以字串的方式輸入一個表示式,請用棧這種結構對錶達式中小括號的匹配情況進行檢測,輸出檢測結果(匹配還是不匹配)。 #include<stdio.h> #include<stdlib.h> #include<mallo

資料結構C語言

基本概念及術語 資料結構基本概念 1.資料 所有能輸入到計算機中並被程式處理的符號集合。 2.資料元素 資料的基本單位,在計算機程式中通常被作為一個整體考慮和處理。 3.資料項 資料不可分割的最小單位,相當於記錄的”域”或者欄位。 4.資料物件

資料結構C語言-遞迴學習筆記

遞迴,介紹瞭解決某一類問題的思維方式。在一個函式定義中出現了對自己本身的呼叫,稱為直接遞迴。一個函式p的定義中包含了對函式q的呼叫,而q的實現過程中又呼叫了p,即函式呼叫形成了一個環狀呼叫鏈,這種方式稱之為間接遞迴。 一個最簡單遞迴程式設計的例項。 例子1 編寫一個遞迴函式

資料結構C語言實現:判斷兩棵二叉樹是否相等,bug求解

判斷兩棵二叉樹是否相等。 遇到了bug,求大神幫忙!!! C語言原始碼: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define OK 1 #define

數據結構C語言

info bsp cpp work spa clu 順序 9.png error 首先,學會用Vistual C++創建一個順序表,以及對順序表的基本操作。 (1)新建一個工程 Win30Application (2)新建SeqList.h (3)新建SeqList.

資料結構——有序連結串列合併C語言

有序連結串列合併 兩個有序的連結串列,要求將其合併為一個連結串列,並且該連結串列保持有序!! 這裡所講的是連結串列升序! 這裡我們的實驗資料,以及思路如圖所示!! 實驗資料: 連結串列1:1, 3, 5, 7 連結串列2:1, 2, 4 ,5

資料結構題集C語言》電子書下載 -網盤 高清PDF格式

     作者:嚴蔚敏,吳偉民,米寧 出版日期:1999-2-1 出版社:清華出版社 頁數:234 ISBN:9787302033141 檔案格式:PDF 檔案大小:18.13 MB     本

浙江中醫藥大學-《資料結構C語言-第一章-第二章概念與程式碼

ZCMU-Data Structure(C language) Part 1 Exordium 1、Data:能夠輸入到計算機中並被計算機程式處理的符號的總稱。 2、Data Element:資料的基本單位,資料元素用以完整的描述一個物件。 3、Data Item:組成資料

浙江中醫藥大學-《資料結構C語言-棧、佇列、串、陣列

ZCMU-Data Structure (C language) Part 1 Stack and Queue 1、棧和佇列也是線性表,特殊性在於棧和佇列的基本操作是線性表操作的子集,是操作受限的線性

資料結構C語言——棧的應用舉例

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ // 用到的庫檔案 #include <stdio.h> /

資料結構C語言——迴圈佇列――――佇列的順序儲存結構

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ // 用到的庫檔案 #include <stdio.h> /