第二章 演算法 (資料結構筆記)

2021-08-03 16:58:05 字數 3584 閱讀 6140

我自己寫的累加演算法(1-100)

int i,count=0;

for(i=0;i

<=100;i++)

cout0;}

高斯的累加演算法

int n=100,count=0;

count=(n*(n+1))/2;

cout<演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。

演算法定義中提到了指令,指令能被人或機器等計算裝置執行。它可以是計算機指令,也可以是我們平時的語言文字。

為了解決某個或某類問題,需要把指令表示成一定的操作序列,操作序列包括一組操作,每乙個操作都完成特定的功能,這就是演算法了。

演算法具有五個基本特性:輸入,輸出,有窮性,確定性和可行性。

1.輸入和輸出: 演算法具有零個或多個輸入,至少有乙個或讀個輸出

2.有窮性: 指演算法在執行有限的步驟之後,自動結束而不會無限迴圈,並且 每乙個步驟在可接受的時間內完成。

當然這裡的有窮性並不是純數學意義,而是在實際應用當中合理的,可以接受的「有邊界」,如果乙個演算法的執行時間是二十年,從數學意義上講自然是有窮的,但是演算法的意義也就不大了。

3.確定性:演算法的每個步驟都有確定的意義,不會出現二義性

4.可行性: 演算法的每一步驟都必須是可行的,也就是說,每一步驟都能通過執行有限次完成。

可行性意味著演算法可以轉換成程式上機執行,並得到正確的結果。

綜合來說,好的演算法應該具有正確性,可讀性,健壯性低儲存量的特徵。

1.正確性:演算法的正確性是指演算法至少應具有輸入,輸出和無歧義性,能正確反映問題的需求,能夠得到問題的正確答案。

但是演算法的「正確」通常在用法上有很大區別,大體分為以下四個層次:

a.演算法程式沒有語法錯誤。

b. 演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果。

c.演算法程式對於非法的輸入資料能夠得出滿足規格要求的結果。(一般情況下以此作為好演算法的判斷標準)

d.演算法程式 對於精心選擇的甚至刁難的測試資料都有滿足要求的輸出結果。(難驗證)

還有,好的演算法容易理解

2.可讀性:演算法設計的另一目的是為了便於閱讀,理解和交流。

可讀性高的演算法有利於理解和交流,晦澀難懂的演算法往往隱含錯誤,不易被發現,並且難以除錯和修改。

4.時間效率高和儲存量低:時間效率指演算法的執行時間,對於同乙個問題,執行時間短的演算法效率高;儲存量需求指的是演算法在執行過程中需要的最大儲存空間,主要指演算法執行時所占用的記憶體或外部硬碟儲存空間。好的演算法應該盡量滿足時間效率高和儲存量低的需求。

利用計算機的計時功能來確定演算法效率的高低。

a.事後統計方法:這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。

這種方法的缺陷有:

1. 必須依據演算法事先編制好程式,這需要大量的時間和精力,如果測得結是乙個糟糕的演算法,那就有些得不償失了。

2. 時間的比較依賴計算機軟體和硬體等環境因素,有時會掩蓋演算法本身的優劣。

3. 演算法的設計資料設計困難,並且程式的執行時間往往還與測試資料的規模有很大關係,效率高的演算法在小的測試資料面前往往得不到體現,

基於這些缺陷,不採納此方法。

b.事前分析估算方法:在計算機程式編制前,依據統計方法對演算法進行估算。

經過分析,我們發現,乙個用高階程式編寫的程式在計算機上執行時所消耗的時間取決於下列因素:

1.演算法採用的策略、方法。

2.編譯產生的**質量。

3.問題的輸入規模。

4.機器執行指令的速度。

第一條是演算法好壞的根本,第二條要由軟體來支援,第四條取決於硬體效能。除了計算機硬體,軟體有關的因素,乙個程式的執行時間,依賴於演算法的好壞和問題的輸入規模。

我們在分析乙個演算法的執行時間時,最重要的 是把基本操作的數量與輸入規模關聯起來,即基本操作的數量必須表示成輸入規模的函式

c.函式的漸進增長

輸入規模 n 在沒有限制的情況下,只要超過乙個數值 n ,這個函式總是大於另乙個函式,我們稱函式是漸進增長的。

其中要注意的有:

1.可以忽略加法常數,如 2n+3,可以只按照 2n 來分析。

2.與最高次項相乘的常數不重要,最高次項指數大的,函式隨著 n 的增長,結果也會變得增長特別快。

所以,判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以省略,而更應關注主項(最高端項)的階數。

判斷演算法優劣時,我們可以對比這幾個演算法的關鍵執行次數函式的漸進增長性,基本就可以分析出,某個演算法,隨著 n 的增大,它會越來越優於某個演算法,或者越來越差域某個演算法。這其實就是事前估算方法的理論依據,通過演算法時間複雜度來估算演算法時間效率。

d.演算法時間複雜度

1.大o階

在進行演算法分析時,語句總的執行次數 t(n) 是關於問題規模 n 的函式,進而分析 t(n)隨 n 的變化情況並確定 t(n) 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記做: t(n) =o(f(n))。它表示隨問題規模 n 的增大,演算法執行時間的增長率和 f(n) 的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度。其中 f(n)是問題規模 n 的某個函式。

這樣用大寫 o 來體現演算法複雜度的記法,我們稱之為大o記法。

一般情況下,隨 n 的增大,t(n) 增長最慢的演算法稱為最優演算法。

2.推導大o階的方法:

a.用常數1取代執行時間中的所有加法常數。

b.在修改後的執行次數函式中,只保留最高端項。

c.如果最高端項存在且不是一,則去除與這個項相乘的常數。

d.如此得到的結果就是大o階。

3.常數階:

與問題的大小(n的多少)無關,執行時間恆定的演算法,我們稱之為具有o(1)的時間複雜度的演算法,又叫常數階。如:

` int n=100,count=0;

count=(n*(n+1))/2;

cout<

《大話資料結構》筆記 第二章 演算法(下)

給定兩個函式 f n 和 g n 如果存在乙個整數 n,使得對於所有的 n n,f n 總大於 g n 那麼我們說 f n 的增長漸近快於 g n 例如,演算法 a 要 2n 3 次操作,而演算法 b 要 3n 1 次。隨著 n 的增大,比較執行次數時,我們可以忽略加法常數。再例如,演算法 c 是 ...

第二章 資料結構 二

知識點 trie樹 並查集,堆的操作 高效地儲存和查詢字串集合的資料結構 const int n 100010 int son n 26 cnt n idx 插入 void insert char str cnt p 以這個點結尾的字元數 查詢 intquery char str return cn...

第二章 資料結構與演算法基礎

資料 描述客觀事物的數值 字元已經能輸入機器且能被處理的各種符號集合。資料元素 資料的基本單位,是資料集合的個體。資料物件 性質相同的資料元素的集合,是資料的子集。資料結構 相互之間存在一種或多種特定關係的資料元素的集合。邏輯結構 資料結構的邏輯層面。按照元素之間的相互關係的特性,分為 集合 線性結...