在处理海量数据时,我把数据经过计算并存在了矩阵中(n×n的二维数组),需要开辟约8000*8000的空间,而且只存成了上三角(数据需要),因此有一半的空间是浪费的(存着无意义的数字0或-1),在开辟空间以及数据持久化时,保存的文件大小出乎我意料之外(为了保留矩阵的结构特征,采用了python下的json输出),达到了近300MB,计算加处理时间久,甚至连打开都耗费时间跟内存
便想着把它压缩在一维数组
并且要满足我的个人需求:根据一维数组的下标可以找回矩阵中的i和j值
例如以下上三角矩阵:(5*5)
1 2 3 4 5
6 7 8 9
10 11 12
13 14
15
存在一维数组后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
**注意这里存储从下标1开始,0用于储存那些下三角无意义的值**
然后我要查找矩阵中第2行,第3列的数据
设矩阵为n×n,下标为 i 和 j ,有公式:
一维数组通项下标 = i * (2*n - i + 1) / 2 + j - i +1
带入n=5,i=2,j=3 得 下标=11
便可取出数据了
经过该处理,数据文件减少一半,然而我的数据后期可以剔除很多,估计会是稀疏上三角矩阵,因此可能会再进行二次压缩
一些题外话,如果该上三角矩阵数据不是很稀疏的话,不建议采用‘稀疏矩阵压缩法
进行再次压缩,因为需要存储下标和值的话(值,i,j),可能需要开辟更多空间