+ 数据结构笔记 +
+ + +++ + +参考书籍:数据结构与算法分析(C语言描述) 原书第二版
+
第1章 引论
递归的四条基本法则
+-
+
- 基准情形:不用递归就能求解 +
- 不断推进:递归调用必须能够朝着产生基本情形的方向推进 +
- 设计法则:假设所有的递归调用都能运行 +
- 合成效益法则(compound interest rule):在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作 +
第2章 算法分析
++计算任何事情不要超过一次
+
最大子序列和
算法1
1 | int MaxSubsequenceSum(const int A[], int N) { |
复杂度为O(N*3)
算法2
1 | int MaxSubSequenceSum(const int A[], int N) { |
复杂度为O(N*2)
算法3
分析知最大子序列和可能在三处出现,或者整个出现在输入数据的左半部,或者整个出现在右半部,或者跨越输入数据的中部从而占据左右两半部分。前两种情况可以递归求解,第三种情况的最大和可以通过求出前半部分的最大和(包括前半部分的最后一个元素)以及后半部分的最大和(包括后半部分的第一个元素)而得到。
+递归调用的一般形式是通过传递输入的数组以及左(Left)边界和右(Right)边界,它们界定了数组待处理的部分。单行驱动程序通过传递数组以及边界 0 和 N-1 以启动该过程。
+1 | static int MaxSubSum(const int A[], int Left, int Right) { |
复杂度为O(N)
算法4
1 | int MaxSubsequenceSum(const int A[], int N) { |
在任意时刻,算法都能对它已经读入的数据给出子序列问题的正确答案,具有这种特性的算法叫做联机算法(on-line algorithm)。仅需要常量空间并以线性时间运行的联机算法几乎是完美的算法。
+ +