從零開始的算法導論
大學兩年,陸陸續續學了c語言和java,語法有所掌握,能寫出來點東西,程設也能擼出來千行代碼,不過自己的算法基礎著實很渣,其實想想,自己平常也沒有翻閱過算法書籍,做的也只是老師交代的課題作業而已,平常寫代碼也沒怎麽考慮算法的重要,最近寫東西的時候才發現自己算法方面的空白,寫個排序都要思考很久,著實很渣,今天開始打算擼算法導論這本書,真是應了那句話,欠下的總是要還的,從最基礎的開始,來一遍算法吧
一:算法的定義 algorithm
算法是任何 良定義 的計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。算法就是把輸入轉換成輸出的計算步驟的一個序列。
二:NP完全問題
NP的英文全稱是Non-deterministic Polynomial的問題,即多項式復雜程度的非確定性問題。簡單的寫法是 NP=P?,問題就在這個問號上,到底是NP等於P,還是NP不等於P。
有著以下幾個有趣
1,雖然迄今為止不曾找到對一個NP完全問題的有效算法,但也沒人能證明NP完全問題不存在有效算法,也就是說,對於NP完全問題,是否有有效算法是未知的
2,NP完全問題集具有一個非凡的性質:如果任何一個NP完全問題存在有效算法,那麽所有的NP完全問題都存在有效算法
3,有幾個NP完全問題類似於(但又不完全同於)一些有著已知有效算法的問題
三:算法基礎
插入排序(INSERTION-SORT)
該算法為:
INSERTION-SORT(A)
1 for j = 2 to A.length 2 key = A[j] 3 //Insert A[j] into the sorted sequence A[1..j-1]4 i = j - 1 5 while i > 0 and A[i] > key 6 A{i+1] = A[i] 7 i = i - 1 8 a[i +1] = key
這裏分析問題算法時有一個循環不變式的概念
循環不變式主要用來幫助我們理解算法的正確性,算法導論的原文是這樣的:We state these properties of A[1 ‥ j -1] formally as a loop invariant。
它有三條性質:
1:初始化 循環的第一次叠代之前,它為真
2:保持 如果循環的某次叠代之前它為真,那麽下次叠代之前它仍為真
3:終止 在循環終止之前,不變式為我們提供一個有用的性質,該性質有助於證明算法是正確的
插入排序的C代碼如下:
從零開始的算法導論