算法设计与分析————期末死亡冲刺
活动安排会场问题
- ①先将活动按照结束时间由早到晚进行排序
- ②安排好的顺序一个一个往后考虑,如果一个活动和前一个活动时间不冲突,就加入方案
分支定界法求解0-1背包
回溯搜索、界限函数加速
画出状态空间树(说明:每个节点包含三个值,当前背包的价值和剩余容量,当前的价值上界)
- ——先预处理出,每件物品 单位重量的价值,并按照单位重量的价值由大到小排序
- ——画根节点:价值上界 = 当前包内总价值+剩余物品最大的 单位重量的价值 × 剩余容量
- ——然后扩展根节点,每次扩展就是选一件物品放入背包
- ——扩展的策略是:深度优先搜索解空间树,若左儿子可行,搜索进入左子树,否则将左子树剪掉;若右子树包含最优解,才搜索右子树,否则将右子树剪掉。
(可能包含最优解:当前节点的价值上界 > 当前最终的最优结果 (深搜保证此时最优解一定存在)) - ——状态空间树中,从根结点到最优解结点路径上的标记排列出来,就是最优解向量
注意:
1.对于一个 ub 不满足要求的点,就不能再往下画了
2.一个节点如果他超重了,也要画出来
3.上面加粗的都是给分点
动态规划求解0-1背包
贪心求解0-1背包(不一定是最优解)
- ①先预处理出,每件物品 单位重量的价值
- ②然后开始装包,单位重量的价值 大的优先放入背包
不是最优解的话需要使用动态规划求出最优解。
算法时间按复杂度分析
n: 输入规模
S(n): 空间复杂度函数
T(n): 时间复杂度函数
C(n): 而是算法基本操作执行的总次数
S: 计算机运行速度(单位时间内执行的指令条数)
综上,有
执行时间 T1 = T(n) / S
输入规模增长m倍后 :执行时间 T2 = T(m × n) / S
故有执行时间增长的倍数: = T2 / T1
计算机速度增长
仍然处理T1的时间,能处理多大的输入规模?
当计算速度增长 m 倍,即 S2 = m × S
有: T1 = T(n2) / S2
得关系式: T(n2) = m × T(n1)
分解关系式得到,输入规模的增长倍数
例题
注意C是错的
算法正确性:是对任意一个合法的输入经过有限步执行之后算法应给出正确的结果。
深度优先使用队列实现
(2)就是字面意思,基本操作执行了多少次,结果用 【C(n)=n的式子】表示
(3)这就涉及一个知识点了
结果就写成【Θ(n^2)】 或 【O(n^2)】 或 【Ω(n^2)】这种形式就行
(1)注意一下伪代码的格式
(2)背答案
(3)分治法求解该问题与蛮力求解法 属于同一时间效率类型。而且蛮力法还不需进行递归调用的相关管理,因此时间性能更好。
重要
重点是(3):效率类型:C(n) = Θ(n)
(4)根据阶乘定义,1~n的每个数都需要相乘,所以算法已是最优。
重要
主要看答题格式:
主要看答题格式:
活动 x1 的开始时间为 t1,(不)小于活动 x2 得结束时间 t2,所以不相容(所以相容,选择加入)
重要
①这种就建立一个等式,把问题要求的和已知的关联在一起。
②就是写伪代码。
动态规划:
画完表,先写出最优值,即,c(m, n) 的值;然后解释如何构造最优解,最后写出最优解
两次乘法,计算的时候别忘记 ×2。