第一章 基础问题(课堂笔记)

一、调度问题

样例

给定 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\)

贪心策略求解的两种思路

  1. 从 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\) 成立。

  • 从而得出方案:将任务按时间从小到大排序即可得到最优排列。
  1. 先有一个猜想,然后证明假设已经找到一个最优解,将这个最优解按照猜想进行调整后,得到的结果不会变差,即说明该猜想正确
  • 先猜想出“可能按任务时间从小到大排序能得到最优解”

  • 假设已有一个最优解,其中有两个任务 \(a,b\),其中 \(t_a>t_b,i_a<i_b\)

  • 交换这两个任务的位置,答案反而会变小,说明我们的猜想正确。

算法的正确性

通过该例子,了解了思考一个问题的两种普遍适用的思路,以及如何保证思路的正确性。

二、排序问题

1、选择排序

  • 策略:
    \(n-1\) 轮操作,第 \(i\) 轮操作的任务,是从待排数据中选出最小值,与位置 \(i(1\le i\le n)\) 的数字进行位置交换。
    image

2、冒泡排序

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

image

3、插入排序

算法的效率

posted @ 2026-03-03 14:39  飞花阁  阅读(1)  评论(0)    收藏  举报
//雪花飘落效果