演算法分析基本概念

2021-10-03 22:56:32 字數 3305 閱讀 7885

乙個演算法的要求有四個:有輸入、有輸出、有限性、確定性。

有乙個很著名的公式是程式=資料結構+演算法。由該式子能看出演算法和程式的關係,演算法是一段有限序列能夠解決乙個問題,是解決問題的方法。程式是乙個實在的東西,能夠解決乙個問題。演算法和程式相比,演算法強調的是方法,所以演算法不拘泥於各種程式語言,沒有嚴格的語法要求,在本課程中演算法使用偽**來表示(偽**的使用格式在本文文末)。

衡量演算法好壞的兩個標準是演算法使用的時間和占用的空間,但隨著科技不斷進步,硬體裝置的儲存空間不斷增大,空間比重相對較小。但在一些嵌入式裝置中占用的空間卻是第一要考慮的因素,但本課程中只是考慮使用的時間,所以對於空間不加贅述。

在演算法中使用時間的主要是基本操作,並且在本課程中基本操作主要包括兩種:比較操作和賦值操作。以比較和賦值的次數多少作為衡量演算法好壞的標準。其中在大量複雜演算法中包含兩類簡單演算法:查詢和排序。這兩種演算法在上學期的資料結構課程中都已經學習過部分,但當時並未強調所用時間。查詢排序資料主要的儲存方式是陣列,在這兩類演算法中資料排列的方式對於演算法的好壞起著一定的決定作用,下面就以幾個具體的例子來進行說明。

二分搜尋也叫折半查詢,是要求資料有序的前提下,每次減少一半的查詢數量。

資料的比較次數範圍是:1~log(n)向下取整加一

合併有序表是指定兩個標記,將標記中較小或較大的數字存在臨時的輔助空間中,達到最終排序的目的。假設兩段資料長度分別為n1 和n2,並且n1是較小的部分.

資料的比較次數是:n1~n1+n2-1

n1是當前一段資料的最大值小於後一段資料的最小值的情況。例如:n1(1,2,3),n2(4,5,6,7)。n1+n2-1是當兩段資料中的元素交叉大小的時候。例如:n1(1,3,5,7),n2(2,4,6,8)。

資料的賦值次數是:2(n1+n2)

選擇排序是從第一位開始,選擇後面資料中最小的那個資料,與當前的資料進行位置交換。

資料的比較次數是:n-1~n(n-1)/2

n-1是資料已經是想要的順序,每一步比較一次即可.n(n-1)/2是當資料逆序有序時後的情況,這種情況下每兩個資料都要比較一次.

資料的賦值次數是:0~3(n-1)

賦值次數的最好最壞情況分別對應於比價的最好最壞情況,已經有序無須做任何交換,逆序需要交換(n-1)次,並且每兩個資料交換就要進行三次賦值操作

插入排序是從第二個起,尋找該元素在前面元素中正確的位置,並將該元素插入進去。同時每次比較要將被比較元素向後移位

資料的比較次數是:n-1~n(n-1)/2

n-1是資料已經有序,每次直接向後移位。(n-1)n/2是逆序有序,每個元素都要與之前的所有元素進行比較。

資料的賦值次數:資料的比較次數加上n-1

資料的賦值包括比較元素的最終賦值以及過程中被比較元素依次向後移位,總體上看,比較次數在加n-1即為賦值次數

將相鄰的2的i次方個元素每次合併為一段元素,並對這段元素使用歸併排序使之有序。最後使整體有序。

資料比較次數:n*log(n)/2~nlog(n)-n+1

最好情況對應於merge過程中的最好情況,即第乙個序列的最大值小於第二個序列的最小值,最壞情況對應於merge過程中兩序列交叉的最壞情況。總體來說比較分為logn層

賦值次數:2nlogn次

前文指出,衡量演算法的依據就是演算法執行的時間,專業名詞叫「時間複雜度」。求解時間複雜度是一項困難的工作,因為在演算法中隨著輸入序列的變化分為最好情況和最壞情況。所以沒有確切的公式去計算具體的值。於是採用漸近線的思想,類似於一種貼近,把時間複雜度用框架框起來。使用如下符號作為框架中的各個標準:

1) 大o符號

大o符號意思就是時間複雜度的上界,類似於最壞情況,該演算法的時間複雜度永遠小於大o,舉例:㏒n = o(n)

2) 大ω符號

大ω符號意思是時間複雜度的下界,類似於最好情況,該演算法的時間複雜度永遠大於大ω,舉例n = ω(㏒n)

3) θ符號

若乙個演算法的大o符號,大ω符號中的函式是同乙個函式,則用θ來表示,同時可以用θ來表示時間複雜度。

對於大o符號和大ω符號,常表示之間的階數相差不大。上界和下界的表示是相對的,也可用小寫來進行表示,小寫一般代表階數相對較大,距離㏒n = o(n2), n㏒n = 小ω(㏒n)

對於空間複雜度研究的不多,但需要牢記,計算空間複雜度的時候不算輸入資料所占有的空間,只計算演算法過程中,使用的臨時變數或者輔助陣列所佔的空間。

最優演算法:

最優演算法不是指某乙個演算法,而是某一類演算法。判斷的方式就是使用時間複雜度的方法,若演算法的下界為a(n),若證明上界也為a(n)的函式,則可以說明該演算法是最優演算法。

以上的過程在本書中,出現的題目多為證明題。證明乙個演算法小於某個上界或者小於某個下界或上界下界相等。一定要牢記三種標準的定義,來進行證明。

這是一類計算題,分三大種主要的方法。都是尋找比較核心的操作,計算操作的執行次數作為判斷時間複雜度的標準。該類題的計算方法大多列出連加式,再通過數學方法進行計算。

1)計算迭代次數:尋找到各階迴圈中的基本操作,以他迴圈的次數作為最終的結果。

2) 計算基本運算的頻度:前文提出了迭代的次數與輸入資料的順序有關係,當迭代次數不穩定的時候,可以選擇計算基本運算的頻度來作為衡量時間的標準。以merge演算法為例,當不了解輸入陣列a和輸入陣列b之間的關係時,可以選擇以賦值操作的頻度作為標準。為2n。

3) 使用遞推關係:在某一類基本操作確定後,發現基本操作含有遞迴地定義,那麼使用數學方法,找到f(n)和n之間的關係

最壞情況分析和平均情況分析:

在時間複雜度的分析中,分析最好情況是沒有太多意義的,因為最好的情況不是總發生,不具有代表性。而最壞情況是演算法的上界,可以通過分析最壞情況確定最後的界限,並在此之前採取相應的措施。但有的時候最壞情況不是足夠客觀,使用平均情況可以有效的減少最後的結果,但平均情況有特殊的要求:必須了解到各個運算在演算法中輸入的各種概率,所以平均情況分析相對複雜。

平攤分析:

因為最壞情況分析比較好計算,在大多數情況下使用最壞情況,但如果最壞情況佔輸入的比例非常小的時候,全按照最壞情況分析所得出的時間複雜度將會高出乙個階,於是為了平衡之間的關係,給出更合理的時間複雜度,會使用平攤分析的方法。平攤分析的具體情況可見部落格:link

以上是第一章的主要內容,在開頭首先介紹的是演算法分析的方法。在後面的章節中會介紹具體的演算法,作為基礎應掌握牢固。

要有文字說明的輸入和輸出

每行語句前要有數字表示行數,輸入輸出除外

賦值統一用箭頭表示

對於while要用end while(單列一行),for要用end for(單列一行)來進行表示

在進行if操作是,在then後面寫if內的操作

演算法的基本概念 演算法分析

一 演算法 algorithms 是為了求解問題而給出的有限的指令序列,每條指令表示乙個或多個操作。解決問題的步驟 程式 是演算法的一種實現,計算機按照程式逐步執行演算法,實現對問題的求解。1.演算法的性質 有窮性 乙個演算法必須能在執行有窮步之後結束,且每一步都可在有窮時間內完成 確定性 演算法中...

演算法的基本概念 演算法分析 2021 3 5

一 演算法 algorithms 是為了求解問題而給出的有限的指令序列,每條指令表示乙個或多個操作。解決問題的步驟 程式 是演算法的一種實現,計算機按照程式逐步執行演算法,實現對問題的求解。1.演算法的性質 有窮性 乙個演算法必須能在執行有窮步之後結束,且每一步都可在有窮時間內完成 確定性 演算法中...

演算法基本概念

所謂演算法,就是解決問題的一種方法或乙個過程。具體來講,演算法是由若干指令組成的有窮序列。演算法概念並不是計算機學科獨有的概念,生活到到處可見演算法的應用。演算法要滿足4條性質 1.輸入 2.輸出 3.確定性 4.有限性 複雜性 時間複雜度 t 演算法所求解問題規模n的 函式 漸進時間複雜度 o 當...