演算法導論學習總結 基礎篇 一

2021-06-21 07:45:39 字數 2775 閱讀 5596

一、基礎知識(概念)總結:

1.漸進記號:

(1).大o記號: 大o記號給出函式的漸進上界。定義:o(g(n))= ps:θ記號是乙個比o記號更強的概念。按集合論的寫法,有 θ(g(n)) 包含於 o(g(n))。

(2).大ω記號:正如o記號提供了乙個函式的漸進上界,ω記號提供了漸進下界。定義:ω(g(n)) =

(3).大θ記號:

大θ記號給出函式的漸進緊確界。定義θ(g(n)) = ps:非漸進緊確的定義就是邊界不包含等於號。

(5).小

小2.np完全問題:

np完全或np完備(np-complete,縮寫為 np-c 或 npc),是計算複雜度理論中,決定性問題的等級之一。npc 問題,是np(非決定性多項式時間)中最難的決定性問題。因此np完備問題應該是最不可能被化簡為p(多項式時間可決定)的決定性問題的集合。許多人推測若任何npc問題得到多項式時間的解法,那此解法就可應用在所有np問題上。

(1)雖然迄今為止不曾找到對乙個np完全問題的有效演算法,但是也沒有人能證明np完全問題確實不存在有效演算法。換句話說,對於np完全問題,是否存在有效演算法是未知的。

(2)np完全問題集具有乙個非凡的性質:如果任何乙個np完全問題存在有效演算法,那麼np完全問題都存在有效演算法。

(3)有幾個np完全問題類似於(但有不完全同於)一些有著已知有效演算法的問題。

3.幾個排序演算法效率回顧:

(1)穩定排序:

插入排序:

插入排序演算法偽**:

for j = 2 to a.length-1

key = a[j]

i = j - 1

while i > 0 and a[i] > key

a[i+1] = a[i]

i = i - 1

a[i + 1] = key

簡述:最好情況下,序列已經是有序排列的了,這種情況下,需要進行比較操作需(n-1)次即可。最壞情況下,序列是降序排列的,那麼此時需要進行比較共有 n(n-1)/2次。所以最差時間複雜度為 o(nn),最優時間複雜度為 o(n),平均時間複雜度為 o(nn)。最差空間複雜度為 o(n),需要輔助空間度為 o(1)

氣泡排序:

氣泡排序演算法偽**:

for i=1 to a.length-1

for j = i-1 to a.length-2

if(a[j] > a[j+1])

swap(a[j],a[j+1])

簡述:氣泡排序在最好情況下(序列已經有序)和最壞情況下的時間負責度都是o(n*n),所以看插入排序在序列相對有序的情況下,效能會優於氣泡排序。

桶排序:

桶排序演算法偽**:

for i = 0 to a.length-1

//將鍊錶中的元素按照function指定的規則放入桶中

put a[i] to bucket[function(a[i])]

for j = 0 to buctkets.length-1

//插入排序對每個桶進行排序

insertsort(bucket[j])

//將各個桶中的元素join在一起

join(bucket[j])

簡述:桶排序的平均時間複雜度為線性的o(n+c),其中c=n(logn - logm) n是待排序的數列的長度,m是桶的個數。ps:桶的數量m越大,其效率就越高,最好的時間複雜度達到o(n)。桶排序的空間複雜度為o(n+m)。

計數排序(counting sort):

counting-sort(a,b,k)

let c[0..k] be a new array

//初始化陣列

for i = 0 to k

c[i] = 0

//將a[j]出現的次數記錄在c[a[j]]的位置

for j = 1 to a.length

c[a[j]] = c[a[j]] + 1

//將相鄰兩項相加,儲存在當前項,這個主要用來處理重複值

for i = 1 to k

c[i] = c[i] + c[i-1]

//遍歷原來的資料,將其排序

for j = a.length downto 1

b[c[a[j]] = a[j]

c[a[j]] = c[a[j]]-1

簡述:這個偽**看起來比較難理解,(詳細解釋可以參考演算法導論第三版p109)。計數排序不是乙個比較的排序演算法,其最差、最優、平均時間複雜度均為 o(n+k),最差空間複雜度為o(n+k)。計數排序效率優於任何比較排序演算法,因為其不是比較排序演算法,所以也就突破了排序演算法ω(nlgn)的限制。

ps:演算法通俗的理解就是:例如有10個年齡不同的人,統計出有8個人的年齡比a小,那麼a的年齡就排在第9位。

4.最大子陣列:在乙個資料中,相鄰的幾個元素的和最大的子資料組稱為元陣列的最大子陣列。

5.矩陣乘法的定義:若a=a(ij)和b=b(ij)是nn的方陣,則對i,j=1,2,...,n,定義乘積 c=ab中元素c(ij)為:

矩陣乘法運算偽**:

n = a.rows

let c be a new n*n matrix

for i = 1 to n

for j = 1 to n

c(ij) = 0

for k = 1 to n

c(ij) = c(ij)+a(ik)*b(kj)

return c

演算法導論學習筆記之演算法基礎篇

一 插入排序 插入排序屬於原址排序,演算法在陣列a中重排元素,演算法思想與玩撲克牌時依次將抓到的牌放到手中合適的位置一致,當輸入完成時,手中的牌即已完成排序。插入排序 a for j 2.a.length setp 1 a 下標從 1 開始計數 key a j i j 1 while i 0 a i...

演算法導論學習(一)

插入排序演算法 ex 8 9 21 6 1 1.1 9 21 6 8 2.1 6 21 9 8 3.1 6 8 9 21 4.1 6 89 21 5.1 6 89 21 歸併排序演算法 ex 8 9 21 6 1 1.8 9 21 6 1 2.8 9 21 6 1 3.8 9 21 1 6 4.8 ...

演算法導論 一 演算法基礎

迴圈不變式主要用來幫助我們理解程式的正確性。迴圈不變式的三條性質 初始化 迴圈的第一次迭代之前,它為真。保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。終止 再迴圈終止時,可驗證演算法的正確性。偽 的重要性在於它可以簡潔地表達出演算法的本質 縮排代表塊結構 採用縮排代表塊結構可以大大提...