競賽部第一次培訓總結

一、時間複雜度

計算機科學中,算法的時間複雜度是一個函數,它定性描述了該算法的運行時間。時間複雜度常用大O符號表述,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱爲是漸近的,它考察當輸入值大小趨近無窮時的情況。

定義:如果存在正常數c和m,使得當N >= m時,T(N)<=cf(N),則記爲T(N)=O(f(N))。

二、時間複雜度的一些運算法則

  • 法則1:

    如果T1(N) = O(f(N)), T2(N) = O(g(N)),那麼 (a) T1(N) + T2(N) = max(O(f(N)), O(g(N)))
    (b) T1(N) * T2(N) = O(f(N)) * O(g(N))

  • 法則2:

    對於任意常數k,(logN)^k = O(N) ——》對數增長得非常緩慢!

三、程序運行時間的估算

 int Sum(int N)
    {
    	int i, S = 0, //1
    	for ( i=1;i<=N;i++) //2
    		S += i*i*I; //3
    	return S; //4
    }

聲明不計時間。
主體程序的第1行和第4行各佔一個時間單元。
第2行初始化佔1個時間單元,測試i<=N 共花費N+1個時間單元,自增運算N個時間單元。
第3行每次執行佔用4個時間單元,共4N個。
所以總共是6N + 4,我們說該函數是O(N)

1、一般法則

  1. 法則1——for循環

一次for循環的運行時間至多是該for循環內語句(包括測試)的運行時間乘以迭代次數

  1. 法則2——嵌套for循環

由裏向外分析。總時間爲每個for循環運行時間的乘積

  1. 法則3——順序語句

將各個語句的運行時間求和即可

  1. 法則4——if/else語句

對於程序片段

if(…)
	s1
else
    s2

四、數據結構中的一些概念

“表”定義爲列的集合。與電子表格相似,數據在表中是按行列格式組織排列的。表中的每一列都設計爲存儲某種類型的信息(例如日期、名稱、美元金額或數字)。表上有幾種控制(約束、規則、默認值和自定義用戶數據類型)用於確保數據的有效性。
“表”的實現形式多種多樣,常用的方法有數組、指針。
表有很多種類型,例如順序表、鏈表等等。

這次培訓主要介紹兩種特殊的“表”——“棧”和“隊列”

定義:棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧、入棧(PUSH)或壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素;從一個棧刪除元素又稱作出棧(POP)或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素。

“棧”是計算機中的重要概念。在計算機系統中,棧可以是一個儲存數據的動態內存區域,程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在程序的運行中,棧保存了一個函數調用時所需要的維護信息,這常常稱之爲堆棧幀或者活動記錄。
重要性質:後進先出(LIFO)

在這裏插入圖片描述
棧的工作過程

  1. 隊列

定義:隊列(queue)是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。
隊列的應用非常廣泛,比如在圖的廣度優先遍歷中。隊列作爲一種最基本的數據結構——限制性的線性表,實現方法和其它類型的表沒有兩樣,同樣可以用數組和指針模擬。
當然用線性表也可以實現隊列的所有功能,但正是由於棧和隊列太常用,才單獨抽象成一種數據結構。
重要性質:先進先出(FIFO)

在這裏插入圖片描述
隊列的工作過程

對於很大量的輸入數據,表的線性訪問時間太慢,不宜使用,
還有一種簡單的數據結構,其大部分操作的運行時間平均爲O(logN),
它的名字叫做樹(tree)。

樹是一種數據結構,它是由n(n>=1)個有限結點組成一個具有層次關係的集合。把它叫做“樹”是因爲它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
它具有以下的特點:
每個結點有零個或多個子結點;
沒有父結點的結點稱爲根結點;
每一個非根結點有且只有一個父結點;
除了根結點外,每個子結點可以分爲多個不相交的子樹。
在這裏插入圖片描述

樹也可以這樣定義:樹是由根結點和若干顆子樹構成的。
樹是由一個集合以及在該集合上定義的一種關係構成的。集合中的元素稱爲樹的結點,所定義的關係稱爲父子關係。
父子關係在樹的結點之間建立了一個層次結構。在這種層次結構中有一個結點具有特殊的地位,這個結點稱爲該樹的根結點,或稱爲樹根。
這種性質使得遞歸成爲了對“樹”處理的常用方法。

實例一:二分查找
分析一下這個算法的時間複雜度

在這裏插入圖片描述
二分查找

 {
        int left,right;
        int mid;
        left=start;
        right=end;
        while(left<=right)
               {
                    mid=left+(right-left)/2;//還是溢出問題
                    if(key==Array[mid])  return mid;
                    else if(key<Array[mid]) right=mid-1;
                    else if(key>Array[mid]) left=mid+1;
                }
        return -1;
    }

實例二:對簡單遞歸法實現斐波那契數列的分析

   long int Fib(int N)
    {
    	if(N <= 1)
    		return 1;
    	else
    		return Fib(N - 1) + Fib(N - 2)
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章