zoukankan      html  css  js  c++  java
  • 特殊矩阵的压缩存储


    /*
    * 压缩存储:把矩阵中值相同的在物理上只存储一次,0不存储
    * 实现原理:将非线性的矩阵转为线性(按行优先和按列优先两种存储方式)存在内存中
    * 逻辑结构是:矩阵(是非线性的,因为他的数据下标是不连续的)
    * 物理结构是:顺序结构(一维数组)
    * 所以想要在逻辑结构上访问物理结构上存储的数据,要建立从逻辑结构到物理结构的映射函数
    * 就是建立矩阵中的行号和列号,与一维数组中下标的映射函数
    * 建立方法:按行优先和按列优先两种办法
    * --因为是把矩阵中的元素放进一维数组(相当于把矩阵中元素按一定顺序放入一维数组中),所以,我们要找的关系是原来
    * 矩阵中的元素位置和矩阵中元素存储的线性位置是有函数关系的,我们通过这个关系,在逻辑上操作物理结构,"仿佛"物理上存储的就是原本的矩阵
    * 建立过程:
    * 1.先看矩阵是否为1,1下标开始的(默认是1,1),aij(i,j列元素)
    * 2.确定物理存储方式是按行优先还是按列优先 还要确定数组下标是否从0开始,默认0开始
    * 3.通过物理存储方式和i,j,建立aij元素在矩阵中的(线性位置函数)
    * 确定方法:以按行优先存储和n*n对称矩阵为例 对称矩阵只存储对角线和下三角区的元素
    * 找到矩阵中aij元素前面有多少个元素就可以确定aij的位置了
    * aij在矩阵中的线性位置=先找前i-1行有多少元素+iaij前面的元素
    * 1=<i<=n,1=<j<=n
    * 1 : 1 (每行要存储的元素个数)
    * 2 : 2
    * 3 : 3
    * . .
    * . .
    * . .
    * i-1 : i-1
    * i : j 因为j1开始,所以,当前位置为j
    * aij在对称矩阵中的线性位置为: (i-1)*i/2+j
    * (注意第一个元素是1位置,此时要看一维数组中元素的位置是0还是1,
    * 0的话 (i-1)*i/2+j-1aij在一维数组中的位置下标,
    * 1的话 (i-1)*i/2+jaij在一维数组中的位置下标)
    * 设一维数组下标为K(0-n(n+1)/2-1) 一共保存 1+2+3...+n=n(n+1)/2个元素到一维数组中
    * 元素aij在一维数组中的位置为(因为一维数组默认从0开始,
    * 所以矩阵中元素线性位置要-1(因为)):K=1+2+3...+i-1+j-1=(i-1)*i/2+j-1
    * 注意:物理存储方法和特殊矩阵的压缩存储方式都影响,逻辑和物理结构上映射函数的建立
  • 相关阅读:
    android 四大组件
    apk 反编译
    通过 PC 远程控制 Android 的应用 -- 可以将手机屏幕投射显示到电脑上
    vmware 装 puppy
    vmware 装 puppy
    js prototype 添加属性对象
    js 百度云搜索框
    js 秒杀
    秒杀的性能和超卖
    [JOI2012春季合宿]Rotate (链表)
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/14526789.html
Copyright © 2011-2022 走看看