稀疏表

稀疏表

在许多应用中,表似乎是最自然的一种选择,但有时出于对空间的考虑,就有可能放弃这种选择。当只用表的一小部分时尤其如此,这种类型的表称为稀疏表(sparse table),因为表中只是稀疏地放置了一些数据,它的大部分单元都是空的。此时可以用链表代替表。

举个例子,大学里有几千名学生和几百门课,每名同学可能选修不同的课并有相应的成绩,如何表示呢?最简单的方法是建立一个二维数组,分别表示学号和课程号,值为成绩,但这样做的空间代价较大,有没有更好的方法呢?这里可以用稀疏表来表示。

实现思路

具体实现时可以归结为一个稀疏矩阵如何在计算机中表示,这里用十字链表法,即维护一个行数组和列数组,行数组中的值为每个列链表的头指针,列数组中的值为每个行链表的头指针,这样数据大小就从M*N被压缩为M+N+每个具体节点大小,在MN非常大时,减少了非常大的空间消耗。而通过十字链表的表示方法,查找的时间复杂度虽有所增加,但相对于减少的巨大空间消耗仍非常有意义。

具体实现参考代码splist.cpp, 通过这种方式,平衡了时间复杂性与空间复杂性,即通过增加少量的时间复杂性减少了巨大的空间复杂性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章