主存逻辑上是一维线性结构吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主存逻辑上是一维线性结构吗相关的知识,希望对你有一定的参考价值。

参考技术A

你好像把数据的逻辑结构与存储结构搞混淆了。

数据的逻辑结构包括线性结构、树、图、集合这四种,在线性结构里面又有线性表、栈、队列等等。

而数据的存储结构只有两种:顺序存储结构和链式存储结构,这两种存储结构,前面一个是利用数据元素在存储器中的相对位置表示其逻辑结构,另外一个是用指针来表示其逻辑关系。

结论:

线性结构的数据在存储结构方面,既可能是顺序存储,也可能是链式存储。

线性表是线性结构,也是顺序存储结构。

数据机构分类

数据结构 大体上分为了 线性结构和非线性结构

  如果再细分,可以把非线性结构分为 树,多维数组(2维以上),再加上集合(一般不研究)

线性结构

  1.数据元素之间存在一对一的关系

  2.数据存储有两种方式,顺序存储(一维数组)链式存储(链表),

    其中顺序存储的叫做线性表,存储的元素物理上是连续的,链式存储的叫做链表,物理上不一定连续

  3.常见的线性结构

      数组,链表,栈,队列

数组

  稀疏数组:当一个数组里面大部分的值都一样的时候,可以使用稀疏数组(列永远是3)

  只记录不同值所在的行,列,以及值(存到一个更小的数组中),以及原数组的大小和不同值的个数

  比如五子棋

技术图片

 

左边是正常数组 右边是稀疏数组,右边的意思是

上边的红框存储原数组的大小和有不同的值的个数,下边的红框表示第0行第2列有一个值为1的数据 同理 第0行第3列有一个值为2的数据........

这样存储的容量小于左边的

二维转稀疏

  获得当前不同值的个数(遍历)n

  创建稀疏数组 int [n+1] [3]

  保存数据,第一行一定是二维数组的行,列,n

稀疏转二维

  先读取第一行,获得n行,m列值 创建二维数组 int [n] [m]

   去读后边的数据

public class MainTest 
    public static void main(String[] args) 
            //直接赋值
            int[][] arr1=0,0,0,0,0,1,0,4,0,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
            //创建一个对象
           /* int[][] arr2=new int[5][5];
            arr2[1][0]=1;
            arr2[1][2]=4;
            arr2[1][4]=51;*/
           //打印arr1
        System.out.println("二维数组:");
            for(int[] row:arr1) 
                for (int i : row) 
                    System.out.print(i);
                    System.out.print(" ");
                
                System.out.println();
            
        //遍历arr1二维数组
            int count=0;
            for(int i=0;i<arr1.length;i++)
                for(int j=0;j<arr1[i].length;j++)
                    if(arr1[i][j]!=0)
                        count++;
                
            
            //创建稀疏数组 行为个数+1
            int[][] arrmix=new int[count+1][3];
            arrmix[0][0]=5;
            arrmix[0][1]=5;
            arrmix[0][2]=count;

            //把二维数组的值存入
         //稀疏数组的行 第0行已经存过数据了,从第一行开始
        int n=1;
        for(int i=0;i<arr1.length;i++)
            for(int j=0;j<arr1[i].length;j++)
                    if(arr1[i][j]!=0) 
                        arrmix[n][0] = i;
                        arrmix[n][1] = j;
                        arrmix[n][2] = arr1[i][j];
                        n++;
                    
                
            
        //打印稀疏数组
        System.out.println("稀疏数组:");
        /*System.out.println(arrmix[0][0]);
        System.out.println(arrmix[0][1]);
        System.out.println(arrmix[0][2]);*/
        for(int[] row:arrmix) 
            for (int i : row) 
                System.out.print(i);
                System.out.print(" ");
            
            System.out.println();
        

        //恢复为二维数组
        int[][] arr2=new int[arrmix[0][0]][arrmix[0][1]];
        for(int i=1;i<count+1;i++)
            arr2[arrmix[i][0]][arrmix[i][1]]=arrmix[i][2];
        
        System.out.println("打印恢复后的");
        for(int[] row:arr2)
            for(int i:row)
                System.out.print(i);
                System.out.print(" ");
            
            System.out.println();
        
    

 

 

打印结果

技术图片

 

 ------------------------------------------未完待续,继续补充---------------------------------------------------------------

 

以上是关于主存逻辑上是一维线性结构吗的主要内容,如果未能解决你的问题,请参考以下文章

JS,实现一维数组JSON树结构的转换

数据机构分类

线性表

数据机构基本概念

第二章之线性表栈队列和线性表

逻辑结构都有哪些