数据结构与算法分析C语言描述--算法分析

Tips:

1,算法是为求解一个问题需要遵循的,被清楚地指定的简单指令的合集

对于一个问题,重要的一步就是确定该算法将需要多少诸如时间或空间等资源的问题。

2,函数间的相对增长率
数据结构与算法分析C语言描述--算法分析_第1张图片

第一个定义是说T(N)的增长率 小于等于 f(N)的增长率
(这种记法称为大O记法,人们常常不说“…级的”,而是说“大O…”)
第二个定义是说T(N)的增长率 大于等于 g(N)的增长率
第三个定义是说T(N)的增长率 等于 h(N)的增长率
第四个定义是说T(N)的增长率 小于 p(N)的增长率

3,上界和下界
上下界

4,重要结论
数据结构与算法分析C语言描述--算法分析_第2张图片

1 将常数或低阶项放进大O是非常坏的习惯。在需要大O表示的任何分析中,各种简化都是可能发生的。低阶一项一般可以忽略,而常数也可以弃掉。此时,要求的精度是很低的。
2 我们总能够通过计算极限lim f(N)/g(N)来确定两个函数f(N)和g(N)的相对增长率,必要时可以使用洛必达法则。

5,一个简单例子
数据结构与算法分析C语言描述--算法分析_第3张图片

这个例子的分析过于复杂,由于有了大O的结果,存在许多可以采取的捷径并且不影响最后的结果。如:第三行的O(1)语句精确计算它是几个时间单元是愚蠢的,第一行与for循环相比显然是不重要的,也可以省去计算。

6,若干一般法则
数据结构与算法分析C语言描述--算法分析_第4张图片
分析的基本策略是从内部(或最深部分)向外展开,如果有函数调用,那么这些调用要首先分析。对于有的递归,实际上只是被被薄面纱遮住的for循环。

7,另一种递归的运行时间分析
数据结构与算法分析C语言描述--算法分析_第5张图片
该递归程序存在大量多余的工作要做,违反了合成效益法则。在第三行上的第一次调用即Fib(N-1)实际上计算了Fib(N-2),这个信息被抛弃而在第三行的第二次调用时又重新计算了一遍。抛弃的信息量递归地合成起来并导致巨大的运行时间。

8,最大子序列和问题的解
数据结构与算法分析C语言描述--算法分析_第6张图片
算法一穷举式的尝试所有的可能,运行时间为O(N^3)。
我们可以通过撤除一个for循环来避免立方运行时间,不过这不总是可能的,在这种情况下算法中将出现大量不必要的计算。

数据结构与算法分析C语言描述--算法分析_第7张图片
算法二是一种改进的算法,运行时间为O(N^2)。

数据结构与算法分析C语言描述--算法分析_第8张图片
算法三采用了一种“分治(divide-and-conquer)”策略。其想法是把问题分成两个大致相等的子问题,然后递归地对他们求解,这是“分”部分。“治”阶段将两个子问题的解合并到一起并可能再做些少量的附加工作,最后得到整个问题的解,运行时间为O(NlogN)。(该算法的详细分析过程请参见《数据结构与算法分析C语言描述》p19–p21)
一些说明:递归过程调用的一般形式是传递输入的数组以及左(left)边界和右(right)边界,它们界定了数组要被处理的部分。单行驱动程序通过传递数组以及边界0和N-1而启动该过程。

数据结构与算法分析C语言描述--算法分析_第9张图片
算法四的实现起来比递归算法简单而且更为有效,该算法的一个附带优点是,他只对数组进行一次扫描,一旦A[i]被读入并被处理,它就不再需要被记忆。因此,如果数组在磁盘上,它就可以被顺序读入,在主存中不必存储数组的任何部分。不仅如此,在任意时刻,算法都能对它已经读入的数据给出子序列的正确答案(其他算法不具有这个特性)。具有这种特性的算法叫做联机算法(online algorithm)。仅需要常量空间并一些线性时间运行的联机算法几乎是完美的算法。

9,一条对数法则
如果一个算法用常数时间(O(1))将问题的大小削减为其一部分(通常是1/2),那么该算法就是O(logN),另一方面,如果使用常数时间只是把问题减少一个常数(如将问题减少1),那么这种算法就是O(N)的。

10,对分查找
数据结构与算法分析C语言描述--算法分析_第10张图片

11,欧几里得算法
数据结构与算法分析C语言描述--算法分析_第11张图片

12,幂运算
数据结构与算法分析C语言描述--算法分析_第12张图片

参考书目/内容来源:
《数据结构与算法分析–C语言描述》

2018.1.24

你可能感兴趣的:(算法基础)