三 如何写成高性能的代码:巧用稀疏矩阵节省内存占用


三 如何写成高性能的代码:巧用稀疏矩阵节省内存占用

稀疏矩阵的概念

一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列 。矩阵里的元素可以是数字、符号及其他的类型的元素 。
【三 如何写成高性能的代码:巧用稀疏矩阵节省内存占用】一般来说,在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵 。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度,下面的矩阵就是一个典型的稀疏矩阵 。
三 如何写成高性能的代码:巧用稀疏矩阵节省内存占用

我们日常使用的电子表格也是一个典型的稀疏矩阵场景,电子表格(SpreadJS, Excel , Google Sheet等等),整体看起来像一个table表格 。
其中列名称依次为A, B, C … …,行名称依次为1, 2, 3 … …
举例一个比较极端的场景,在A1ZZ2000单元格分别赋值 , 这样我们就需要一个2000行,26*26 26=702列的矩阵来表示它 , 这个矩阵是一个明显的稀疏矩阵 。

稀疏矩阵的存储方式及优化

直接存储为二维矩阵
直接使用二维矩阵会简单直接地存储整个电子表格,这样你不必每次都创建或删除一段内存 。
但这是一种非常暴力的存储值的方法,这种方式下会消耗大量内容来存储毫无内容的单元格 。
简单来看一下它的复杂度: