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

用追踪表追踪线性搜索

搜索算法在纸上看起来很明显,直到你得说出每个变量在每一步的确切数值。

本页内容
  1. 如何一步步追踪算法?
  2. 例题
  3. 要留意的错误
  4. 自我检测
  5. 接下来学什么

线性搜索从第一项开始查看列表,直到找到目标或没有项可查。考试中通常会给你算法和一些数据,要求你完成追踪表并说出结果。

本课属于搜索、排序与文件,用到重复结构与数组中的循环和数组概念。

如何一步步追踪算法?

追踪表为每个变量设一列,每当数值变化就新增一行。你要扮演计算机:读一行代码,只更新这一行改变的内容,并写下新的数值。

三个习惯让追踪更可靠:

  1. 列出代码中出现的每个变量,包括 Found 这样的标志变量。
  2. 每次都先判断循环条件,再进入循环体。
  3. 把没变的值抄到下一行,让每一行都显示完整状态。

例题

一家虚构商店把六个产品代码存在数组里,位置为 1 到 6。

位置123456
Codes149279315
Found ← FALSE
Index ← 1
WHILE Index <= 6 AND Found = FALSE
   IF Codes[Index] = Target THEN
      Found ← TRUE
   ELSE
      Index ← Index + 1
   ENDIF
ENDWHILE
IF Found = TRUE THEN
   OUTPUT "Found at position ", Index
ELSE
   OUTPUT "Not found"
ENDIF

Target = 27 时的追踪。

步骤IndexCodes[Index]Codes[Index] = Target?Found
开始1FALSE
第 1 轮114否FALSE
第 2 轮29否FALSE
第 3 轮327是TRUE

第 3 轮之后 Found 为 TRUE,条件不成立,循环结束。输出是 Found at position 3,共比较三次。

Target = 8 时的追踪。 没有任何代码等于 8,所以循环在 Index = 1、2、3、4、5、6 时各比较一次,六次都不匹配。第六次之后 Index 变成 7,条件 Index <= 6 不成立,循环结束,Found 仍是 FALSE。输出是 Not found,搜索共比较六次。

要留意的错误

下面这个版本在匹配之后仍然移动下标:

WHILE Index <= 6 AND Found = FALSE
   IF Codes[Index] = Target THEN
      Found ← TRUE
   ENDIF
   Index ← Index + 1
ENDWHILE

Target = 27 时,匹配发生在 Index = 3,可是加一的那行仍会执行,所以循环结束前 Index 变成 4。输出会说位置 4,而 Codes[4] 是 9,不是 27。

改正方法是把 Index ← Index + 1 放进 ELSE 分支,让它只在没有匹配时才执行。追踪时,每一行都问自己:“哪一行改变了这个变量?它有资格执行吗?”

自我检测

使用同样的数组和算法。

1. Target = 31。输出是什么?比较了几次?

显示答案

Index 依次为 1、2、3、4、5。Codes[5] = 31 在第五次比较时匹配。输出:Found at position 5,比较五次。

2. Target = 9。报告哪个位置?为什么位置 4 永远不会被报告?

显示答案

Codes[2] = 9 在第二次比较时匹配,Found 变为 TRUE,循环结束。输出:Found at position 2。位置 4 也是 9,但循环在到达它之前就停止了。

3. Target = 5。比较了几次?对于存在的目标,这是最好还是最坏的情况?

显示答案

5 排在最后,位置 6,所以比较六次。这是目标存在时的最坏情况,因为每一项都被检查了。

接下来学什么

追踪熟练之后,试试解释一轮排序,那里的数值会移动,而不只是被读取。受限伪代码追踪训练器可以逐步运行这样的算法,让你把自己的表和机器的结果对照。

有些学生能读懂代码,却因为追踪表悄悄漏掉一次变化而丢分。这正是我们的老师在一对一线上计算机科学补习中会留意的习惯。

常见问题

什么是线性搜索?

线性搜索从第一项开始,逐项检查列表,直到找到目标或到达末尾。它适用于任何列表,不论是否已排序。耗时随列表长度增加,因为目标不存在时需要检查每一项。

线性搜索会比较多少次?

如果目标在位置 k,搜索会比较 k 次。如果目标不存在,比较次数等于列表的项数。最好的情况是只比较一次,也就是目标排在第一位。

目标出现两次会怎样?

在第一个匹配处停止的搜索只会报告第一个位置,后面的那个永远不会被检查到。如果题目需要所有位置,算法就必须一直走到末尾,并记录每一次匹配。

更新于:

下一步

如果你的追踪表写了几行就和代码对不上,一对一的老师可以和你一起追踪,找出数值开始偏离的那一行。

一小时付费试听课,按所安排老师确认的收费,RM80 起。

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

家长:在这里咨询

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