跳到正文
IGCSE·Tuition
计算机科学 · 课程

用空数据和重复数据检查算法

一个算法可能通过了题目里的例子,却在测试者试的第一份列表上出错。

本页内容
  1. 应该试哪些棘手的情况?
  2. 例题
  3. 要留意的错误
  4. 自我检测
  5. 接下来学什么

选择测试数据本身就是一项技能。普通数据说明算法能运行;空数据、单项数据和重复数据则检验它在边缘情况下是否仍然正确,而大多数错误就藏在边缘。

本课为搜索、排序与文件收尾。它用到验证、核实与测试里的测试用语,以及追踪线性搜索里的追踪表。

应该试哪些棘手的情况?

  • 空: 完全没有项目。
  • 单项: 最小的非空列表。
  • 全部相等: 每个值都一样。
  • 答案有重复: 最大值或目标出现不止一次。
  • 答案在两端: 第一个或最后一个位置。

例题

任务:在有 Count 个项目的数组 Scores 中找出最高分,并说出它出现了几次。第一个版本,带有空数据保护:

IF Count = 0 THEN
   OUTPUT "No data"
ELSE
   Max ← Scores[1]
   Times ← 1
   I ← 2
   WHILE I <= Count
      IF Scores[I] > Max THEN
         Max ← Scores[I]
         Times ← 1
      ELSE
         IF Scores[I] = Max THEN
            Times ← Times + 1
         ENDIF
      ENDIF
      I ← I + 1
   ENDWHILE
   OUTPUT Max, Times
ENDIF

测试:Scores = [8, 5, 8, 3, 8],Count = 5。

IScores[I]MaxTimes
开始81
2581
3882
4382
5883

输出:8, 3。最高分是 8,出现了三次。

测试:空,Count = 0。 保护语句会拦住它并输出 No data。没有这个保护,Scores[1] 就会指向一个不存在的项目。

测试:单项,Scores = [9],Count = 1。 Max = 9,Times = 1。循环从 I = 2 开始,它大于 Count,所以循环体一次也不执行。输出:9, 1。

要留意的错误

一位学生为了“把相等的值也包括进来”,把比较改成 >=:

IF Scores[I] >= Max THEN
   Max ← Scores[I]
   Times ← 1

在 [8, 5, 8, 3, 8] 上,I = 3 时 8 满足 >=,所以 Times 被重置为 1,而不是增加到 2。I = 5 时又重置一次。最终输出是 8, 1,这是错的。

改正方法是:新的最大值仍用 >,再用单独的 = 分支来数重复。这个错误版本只有在重复数据下才会暴露,这就是重复数据测试重要的原因。

自我检测

使用例题里的算法。

1. Scores = [4, 4],Count = 2。输出是什么?

Show answer

开始时 Max = 4,Times = 1。I = 2 时,4 等于 Max,所以 Times 变为 2。输出 4, 2。

2. Scores = [2, 7, 7, 7],Count = 4。输出是什么?

Show answer

开始时 Max = 2。I = 2 时,7 > 2,所以 Max = 7,Times = 1。I = 3 时,Times = 2。I = 4 时,Times = 3。输出 7, 3。

3. 说出三个用来检查“找出列表中最小值”算法的测试用例。

Show answer

例如:一个空列表、一个单项列表,以及最小值出现两次的列表。最小值在最后一个位置的列表也值得一试。

接下来学什么

把整个模块用到综合练习中,并把每一次失误记入错题记录与重测队列。

如果你习惯只测试题目附带的那个例子,我们的老师可以通过一对一线上计算机科学补习帮你养成测试边缘情况的习惯。

常见问题

为什么要测试空列表?

很多算法会在检查第一项是否存在之前就去读取它。遇到空列表,就会读到不存在的东西,或者除以零的计数。测试空数据可以看出算法有没有针对这种情况的保护。

测试数据里的重复值是什么?

就是出现不止一次的值,例如分数列表里有两个 8。重复值检验算法在两项相等时,计数、替换或比较是否正确,而整齐的数据永远不会出现这种情况。

多少个测试用例才够?

每一类情况各有一个就够了:普通数据、最小的情况、空的情况、重复值,以及行为发生变化的边界。每种情况挑一个好的用例,比许多相似的用例更有用。

更新于:

下一步

如果你的算法在例子上能运行,却不确定接下来该试哪些测试用例,一对一的老师可以帮你建立一组小型测试并逐个追踪。

一小时付费试听课,按所安排老师确认的收费,RM80 起。 其他费用、时间安排及后续课程,在试听课后由家长与老师直接确认。

补习由家长或监护人安排。用 WhatsApp 把这页发给他们,他们就可以替你咨询。

是家长或监护人?在这里咨询

已通过我们的服务帮助 9,000+ 名学生