第一章
算法设计应满足以下几条目标:正确性 可使用性 可读性 健壮性 高效率与低存储量需求。
算法具有以下5个重要特征: 有限性 确定性 可行性 输入性 输出性。
算法分析的两个主要方面是分析算法的时间复杂度和 空间复杂度。
渐进符号(O、Ω和Θ):
定义1(大O符号),f(n)=O(g(n))(读作“f(n)是g(n)的大 O”)当且仅当存在正常量c和n0,使当n≥n0时,f(n)≤cg(n),即 g(n)为f(n)的上界。
定义2(大Ω符号),f(n)= Ω(g(n))(读作“f(n)是g(n) 的大Ω”)当且仅当存在正常量c和n0,使当n≥n0时, f(n)≥cg(n),即g(n)为f(n)的下界。
定义3(大Θ符号),f(n)= Θ(g(n))(读作“f(n)是g(n) 的大Θ”)当且仅当存在正常量c1、c2和n0,使当n≥n0时,有 c1g(n)≤f(n)≤c2g(n),即g(n)与f(n)的同阶。
第二章
求解n皇后问题:【问题描述】在n×n的方格棋盘上,放置n个皇后,要求每个皇后 不同行、不同列、不同左右对角线。如下图所示是6皇后问题的一个解。
**
第三章 分治法
T(n)=O(nlog2n)
采用分治法求最大 元素max1和次大元素max2:T(n)=O(n)
求这个序列中 第k(1≤k≤n)小的元素,求给定的两个有序序列的中位数,求出其中最 大连续子序列的和,棋盘覆盖,循环日程安排问题,矩阵乘法问题:用分治来做。
设求解序列a[0..n-1]最大连续子序列和的执行时间 为T(n)=O(nlog2n)
T(n)=O(n)
计算 n 次幂每次递归调用,问题规模从n缩减到n/2,可以推导出T(n)=O(log2n)。
第五章 回溯法
一个复杂问题的解决方案是由若干个小的决策步骤组成的决策序列, 解决一个问题的所有可能的决策序列构成该问题的解空间。
回溯法 = 深度优先搜索 + 剪枝
回溯法可以用递归也可以非递归
对应的算法时间复杂度为O(n ^n)
该算法中每个顶点试探1~m种着色,共n个顶点, 对应解空间树是一棵m叉树(子集树),算法的时间复杂度为O(m n)。
第六章 分支限界
第七章 贪心法
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列 局部最优的选择,即贪心选择来达到。
如果一个问题的最优解包含其子问题的最优解,则称此问题具有 最优子结构性质。 问题的最优子结构性质是该问题可用动态规划算法或贪心法求解 的关键特征。
活动安排问题,用贪心最好。
算法的时间复杂度为O(nlog2n)。
0/1背包问题贪心策略可能无效!需要用动态规划来解
时间复杂 度为O(nlog2n)
第8章 动态规划
分治法各个子问题是独立的,动态规划的子问题是重叠的。
动态规划方法又和贪心法有些相似,在动态规划中,可将一个问 题的解决方案视为一系列决策的结果。
贪心可以用动态规划做,反之不行。