一、基礎知識(概念)總結:
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 ...
演算法導論 一 演算法基礎
迴圈不變式主要用來幫助我們理解程式的正確性。迴圈不變式的三條性質 初始化 迴圈的第一次迭代之前,它為真。保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。終止 再迴圈終止時,可驗證演算法的正確性。偽 的重要性在於它可以簡潔地表達出演算法的本質 縮排代表塊結構 採用縮排代表塊結構可以大大提...