数据机构分类

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

  如果再细分,可以把非线性结构分为 图 和 树,多维数组(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();
        }
    }
}

打印结果

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

原文地址:https://www.cnblogs.com/fjd-1004/p/11027215.html

时间: 2024-10-15 10:30:01

数据机构分类的相关文章

命题作文:Dimension Tree区间查找与IP数据包分类

这个题目有点大,而且我要严格控制字数,不能像<命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程>那样扯得那么开了.事实上,这篇作文是上 一篇作文中关于区间查找小节的扩展. 1.IP数据包分类 根据IP数据包协议头的若干字段,也叫匹配域,将数据包划分到某个类别,这就是IP数据包分类的核心. 事实上,IP路由查找的过程就是IP数据包分类的一个特例,一个极其简单的特例,此时的匹配域就是目标IP地址,而类别就是路由项或者说更简单一点,下一 跳.此时考虑一下源地址Policy routi

数据回归分类预测的基本算法及python实现

数据回归分类预测的基本算法及python实现 关于数据的回归和分类以及分析预测.讨论分析几种比较基础的算法,也可以算作是比较简单的机器学习算法. 一.        KNN算法 邻近算法,可以用来做回归分析也可以用来做分类分析.主要思想是采取K个最为邻近的自变量来求取其应变量的平均值,从而做一个回归或者是分类.一般来说,K取值越大,output的var会更小,但bias相应会变大.反之,则可能会造成过拟合.因此,合理的选取K的值是KNN算法当中一个很重要的步骤. Advantages First

数据机构基本概念

一 数据机构类型: 集合 ,线性结构,树形结构,图状机构 二 逻辑关系:线性结构 和 非线性结构 线性结构 1.线性表 2.栈 3.队列 4.数组 ,广义表 5.字符串 非线性结构 1.树,二叉树 2.图 三 数据存储结构 顺序存储结构(向量,一维数组) 非顺序存储结构(链接表) 四 数据类型(Data Type) 原子类型 (如 int, char, float等) 机构类型(线性表, 数组, 树等) 五 抽象数据类型(Abstruse Data Type) 抽象线性数据结构是指一个数字模型以

数据的分类-JavaScript数据类型

JavaScript数据类型 1.数据类型是什么? 我们接触的绝大多数程序语言来说,把数据都进行了分类,包括数字.字符.逻辑真假:int,long,string,boolean....等等:我们都知道计算机对数据处理时是采用二进制的方式.将数据加载到内存中,并且通过CPU调度进行计算得到最终结果,那么,难道内存存储数据时会记录所以数据的类型吗?我认为答案是否定的,内存中的数据应该会根据所占内存的大小来进行区分和计算的,两种不同类型数据的计算,对于CPU来说只是调度了两个所占内存大小不一的数据来进

caffe使用自己的数据做分类

这里只举一个例子: Alexnet网络训练自己数据的过程 用AlexNet跑自己的数据 参考1:http://blog.csdn.net/gybheroin/article/details/54095399 参考2:http://www.cnblogs.com/alexcai/p/5469436.html 1,准备数据: 在caffe根目录下data文件夹新建一个文件夹,名字自己起一个就行了,我起的名字是food,在food文件夹下新建两个文件夹,分别存放train和val数据, 在train文

使用sklearn简单粗暴对iris数据做分类

注:1.每一个模型都没有做数据处理 2.调用方式都是一样的»»»  引入model → fit数据 → predict,后面只记录导入模型语句. 导入数据: from sklearn import datasets iris = datasets.load_iris() print "The iris' target names: ",iris.target_names x = iris.data y = iris.target 线性回归: from sklearn import li

深入理解JVM:JVM执行时数据区域分类

JVM在运行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途和创建.销毁时间.有些区域随着虚拟机的启动而存在.有些区域则依赖用户线程的启动和结束而建立和销毁.依据<Java虚拟机规范1.7>规定,Java虚拟机所管理的内存分为下面几个区域: 程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区.运行时常量池.直接内存 程序计数器 是一块较小的内存空间.他能够看作是当前线程所运行的字节码的行号指示器. 在虚拟机的概念模型里,字节码解释器工作时就是

学数据机构干什么?

我们为什么还要学习数据结构呢?学习什么链表,插入删除数据,看代码,觉得很复杂.这是干什么用的呢?C或C++里不就已经可以插入数据,存储数据么?建个数组,运用指针不就可以很方便么?还要费这劳什子自己写一大串代码就是为了建个链表能存两个数据? 回答一: 链表的好处在于不用使用连续的内存,而是利用内存中分散的存储单元存储数据:而且链表的长度是可以任意增删的,但数组一旦申请就不能改变,这根本不能满足数据的动态存储:再加上数组的删除和插入元素会使大片的数据进行移动,这就增加了运算量: 数据结构的思想还是很

深入理解JVM:JVM运行时数据区域分类

JVM在执行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途和创建.销毁时间.有些区域随着虚拟机的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范1.7>规定,Java虚拟机所管理的内存分为以下几个区域: 程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区.运行时常量池.直接内存 程序计数器 是一块较小的内存空间,他可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过