Appearance
题目
若采用三元组表存储结构存储稀疏矩阵 M,则除三元组外,下列数据中还需要保存的是( )。
I. M 的行数
II. M 中包含非零元素的行数
III. M 的列数
IV. M 中包含非零元素的列数
错因
B
把"列数"当成"非零元素的列数"——可能联想到了三元组里每个元素已经记了所在行列号,所以以为只要再把"出现过的列编号集合"存下来即可。但这样无法恢复原矩阵的形状:如果矩阵的最右几列全是 0,三元组里根本不会出现这些列号,恢复时就分不清是 5 列还是 10 列。题目要的是"M 的列数"——矩阵真实的列数,而不是非零列的集合。
C
把"非零行数 + 非零列数"当成可以唯一恢复矩阵的描述。这样存储丢失了"全 0 行/全 0 列"——例如 的矩阵只有 (1,1) 一个非零元素,按 II + IV 算只是"1 行 1 列",重建出来变成 矩阵,原本的 行 列零元素全被丢掉。
D
四个都存看似"保险",但 II 和 IV(非零的行/列数)根本没必要存——它们既不是恢复原矩阵所必需的,也不是三元组操作(加法、转置)所需的输入。多存只会增加冗余、增加更新时的同步成本。三元组的设计原则就是"用尽量少的辅助信息",I + III 已经够了。
总解析
思路:三元组表的目的是"把原矩阵稀疏地存下来,并且能完整恢复"。所以辅助信息必须满足两条:
- 能确定矩阵形状(行数、列数)—— 决定 0 元素分布的边界;
- 能确定有多少个非零元素(即三元组的个数,可由数组长度推出,无需额外存)。
逐项判断:
- I(M 的行数):必须存。否则矩阵末尾若有全 0 行,三元组里没有任何信息能反推。
- II(非零元素的行数):不需要。它对恢复矩阵无用。
- III(M 的列数):必须存。同 I,理由对称。
- IV(非零元素的列数):不需要。同 II。
更直接的对比:标准的三元组顺序表通常用一个结构 {rows, cols, nums, data[]},其中 rows = M 的行数、cols = M 的列数、nums = 非零元素个数(数组长度)、data 是三元组数组——只有 I 和 III 是"额外要存的"。
最终答案是 A(仅 I 和 III)。
章节调整说明:原骨架把这题归在"线性表",按章节代码表(§2)稀疏矩阵属于"栈、队列与数组"章 ds-stack,已修正。