题型分析
Q1: Record Type Declaration for Hash Table (2 分)
题目识别: 要求声明哈希表的记录类型, 包含主表数组和 overflow 数组
标准解法:
- 定义
HashTableRecord类型 - 包含两个数组字段:
HashTable(主表) 和OverflowArray(溢出数组) - 指定数组大小和元素类型 (通常为 INTEGER 或 STRING)
- 声明
OverflowPointer变量追踪 overflow 数组下一个空闲位置
评分标准模式:
MS 示例
M1 正确定义记录类型名和主表数组 (含大小和类型)
A1 声明 overflow 数组和 OverflowPointer (或 NextFreeOverflow) 字段
真题示例:
- 9618/s25/qp/42 Q2(a): 声明
HashTableRecord包含HashTable[0:9]和OverflowArray[1:10]
陷阱:
- 主表大小和 overflow 数组大小混淆
- 数组类型不匹配 (题目要求 INTEGER 却声明为 STRING)
- 忘记声明
OverflowPointer变量
Q2: Hash Function — CalculateHash() Using MOD (2 分)
题目识别: 要求实现 CalculateHash 函数, 使用 MOD 运算将键映射到数组下标
标准解法:
- 函数接收一个键 (KEY) 作为参数
- 返回
KEY MOD TableSize作为哈希值 - 确保返回值在
0到TableSize - 1范围内
评分标准模式:
MS 示例
M1 正确定义函数签名 (接收 KEY, 返回 INTEGER)
A1 正确实现 KEY MOD TableSize 并返回结果
真题示例:
- 9618/s25/qp/42 Q2(b): 实现
CalculateHash(ByVal Key : INTEGER) RETURNS INTEGER
陷阱:
- MOD 运算两边写反 (
TableSize MOD Key) - 忘记
RETURN语句 - 参数类型或返回值类型与题目要求不符
Q3: InsertIntoHash() with Collision Handling (6 分)
题目识别: 要求实现 InsertIntoHash 过程, 处理碰撞时将数据放入 overflow 数组
标准解法:
- 调用
CalculateHash计算哈希值 - 检查主表中该位置是否为空
- 如果为空: 直接放入主表
- 如果不为空 (碰撞): 放入 overflow 数组,
OverflowPointer递增 - 更新相关指针/计数器
评分标准模式:
MS 示例
M1 调用 CalculateHash 计算 Index
A1 检查主表 HashTable[Index] 状态
M1 主表为空时插入主表
A1 主表被占用时将值放入 overflow 数组
A1 正确更新 OverflowPointer (递增)
A1 更新 OverflowCount 或相关统计数据
真题示例:
- 9618/s25/qp/42 Q2(c): 实现
InsertIntoHash过程处理碰撞, 6 marks
陷阱:
- 碰撞时放入了 overflow 但忘记递增
OverflowPointer - 未调用
CalculateHash而是自己算一遍 - 主表和 overflow 数组搞混 (该放主表的放 overflow)
- 使用
<--而非<-赋值
Q4: Create Hash Table from File (5 分)
题目识别: 要求从文件中读取数据并插入哈希表
标准解法:
- 打开文件 (
OpenFile) - 循环读取每条记录
- 对每条记录调用
CalculateHash和InsertIntoHash - 关闭文件
评分标准模式:
MS 示例
M1 正确定义主表和 overflow 数组
A1 打开文件并循环读取数据
M1 对每条记录调用 CalculateHash
A1 调用 InsertIntoHash 插入哈希表
A1 关闭文件, 处理所有记录
真题示例:
- 9618/s25/qp/42 Q2(d): 从文件读取数据填充哈希表, 5 marks
陷阱:
- 文件路径写错或忘记指定文件模式
- 循环结束后忘记关闭文件
- 读取记录时字段类型不匹配
- 未处理文件为空或文件不存在的异常情况
Q5: Print Collision Array (2 分)
题目识别: 要求遍历并输出 overflow 数组中的所有值
标准解法:
- 使用循环遍历 overflow 数组
- 输出每个非空元素的值 (或输出所有元素)
- 使用
OverflowCount或直接遍历固定范围
评分标准模式:
MS 示例
M1 正确定义循环遍历 overflow 数组
A1 输出元素值 (通常结合格式说明)
真题示例:
- 9618/s25/qp/42 Q2(e): 输出 overflow 数组的所有元素, 2 marks
陷阱:
- 遍历了主表而非 overflow 数组
- 忘记限制遍历范围 (遍历整个数组容量而非已使用部分)
- 输出格式与题目要求不符