Skip to content

2016年 408 数据结构 第 4 题

数据结构2016年选择题2分

题目

有一个 100 阶的三对角矩阵 ,其元素 按行优先依次压缩存入下标从 0 开始的一维数组 中。元素 在数组 中的下标是( )。

错因

A

当成第 30 行的第一个非零元算了。第 30 行有三个非零元 ,下标依次是 86、87、88。选 A 的人算对了"第 30 行从下标 86 开始",但忘了 在本行排第二(位置 1,0-indexed),把行内位置当成 0 了。

C

正好把 错认成本行的第三个非零元 。本行三个元素从左到右是 ,行内位置 0、1、2;选 C 相当于把"主对角线 i = j"和"上副对角线 i = j-1"搞反了。

D

可能用了"下标从 1 开始"的公式 还要再 +1,或多算了一行的偏移。最常见的算法:忘了第 1 行只有 2 个非零元、第 2~99 行才是 3 个,把所有行都按 3 个算,总数变成 ,再加行内位置 2 = 89。本质是边界行的元素数没单独处理。

总解析

三对角矩阵的非零元分布:只有满足 的元素非零,即主对角线和它上下各一条副对角线上的元素。

每行的非零元个数

  • 第 1 行:,共 2 个
  • 第 2 ~ 99 行:,共 3 个
  • 第 100 行:,共 2 个

按行优先压缩到下标从 0 开始的数组

行()之前共存了多少个元素?

行内三个元素的行内位置(从 0 编号)是 0、1、2,对应 。所以行内位置

的下标):

代入

手算验证:第 30 行之前一共存了 个元素(占 )。

868788
元素

最终答案是 B(87)

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数