1. 程式人生 > >競賽部第一次培訓總結

競賽部第一次培訓總結

競賽部第一次培訓總結

一、時間複雜度

電腦科學中,演算法的時間複雜度是一個函式,它定性描述了該演算法的執行時間。時間複雜度常用大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)
    }