第一章 基础问题(课堂笔记)
一、调度问题
样例
给定 5 个任务,\(n=5,t_1=9,t_2=2,t_3=5,t_4=3,t_5=1\),请设计一个调度方案,给出排列 \(i_1,i_2,\dots,i_n\)。
贪心策略求解的两种思路
- 从 2 个任务的小规模情况开始研究,发现规律后推广至 \(n\) 个任务
- 先看前两个任务 \(t_1=9,t_2=2\),共有 2 种排列:
\(i_1=1,i_2=2\),总等待时间为:\(9 + (9+2)=20\)
\(i_1=2,i_2=1\),总等待时间为:\(2+(2+9)=13\)显然任务 2 应该排在前面。不难发现,第一个任务的执行时间会分配给后面每一个任务,必须是时间较短的任务才能是总和最小。
当推广到 \(n\) 个任务时,同理,对于任意两个任务 \(a,b\),若 \(t_a<t_b\),则必有 \(i_a<i_b\) 成立。
- 从而得出方案:将任务按时间从小到大排序即可得到最优排列。
- 先有一个猜想,然后证明假设已经找到一个最优解,将这个最优解按照猜想进行调整后,得到的结果不会变差,即说明该猜想正确
先猜想出“可能按任务时间从小到大排序能得到最优解”
假设已有一个最优解,其中有两个任务 \(a,b\),其中 \(t_a>t_b,i_a<i_b\)
交换这两个任务的位置,答案反而会变小,说明我们的猜想正确。
算法的正确性
通过该例子,了解了思考一个问题的两种普遍适用的思路,以及如何保证思路的正确性。
二、排序问题
1、选择排序
- 策略:
共 \(n-1\) 轮操作,第 \(i\) 轮操作的任务,是从待排数据中选出最小值,与位置 \(i(1\le i\le n)\) 的数字进行位置交换。

2、冒泡排序
- 策略:将数列前面看成水面,后面看成水底,共 \(n-1\) 轮操作,第 \(i\) 轮操作的任务,是从水面开始,依次将相邻的2个数进行比较,“轻者上浮,浊者下沉”


浙公网安备 33010602011771号