Appearance
题目
有一个 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 行之前一共存了 个元素(占 到 )。
| 86 | 87 | 88 | |
|---|---|---|---|
| 元素 |
。
最终答案是 B(87)。