大学两年,陆陆续续学了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代码如下: