• 数据结构与算法----->数据结构----->数组


    概述:

      1.数组的大小要给定,并且一旦给定之后就不允许再有变化 

      2.数组这种数据结构下数据的插入、查找、删除算法的复杂度

      3. Java中与数组相关的语法知识

        3.1一维数组相关java语法知识 

              创建数组: 

              数组长度: 

              访问数组元素: 

              在java中使用数组的一个简单例子:(P26 

        3.2二维数组相关java语法知识

      4. Java设计出的用于操作数组元素的相关算法(自定义算法) 4

      5. 特殊的数组(有序数组) 4

      6. 有序数组和无序数组的比较 5

      7. 复杂类型的数组(如以Student对象为基本元素的数组) 5

        8. 为什么不用数组表示一切....................................................................................... 5

    详细讲解:

      1.数组的大小要给定,并且一旦给定之后就不允许再有变化

      2.数组这种数据结构下数据的插入、查找、删除算法的复杂度

    数据插入

    允许元素重复的情况下

     

    直接插入就可以,插入到数组尾部(一步完成)

    不允许元素重复的情况下

    要先和数组中已有元素比较,然后再插入

     

    数据查找

    允许元素重复的情况下

     查找出第一个该元素

     

     查找出所有该元素

    不允许元素重复的情况下

     

    数据删除

    不允许元素重复的情况下

     

    查找到该元素------->后面的元素左移

    允许元素重复的情况下

    删除第一个该元素

     

    删除所有该元素

            

      3.Java中与数组相关的语法知识

       3.1java语言中与一维数组相关的语法知识
      • 在java中,将数组看成类对象  
      • 创建数组: 
        • 因为java中数组并不是基本数据类型,java将数组当做对象来看待,所以java中使 用数组一定要使用new来给数组分配内存空间
        • 在使用new给数组分配内存空间的时候,必须要指明数组大小
      • 数组元素的初始化:
          • 不给数组元素赋值的情况下,数组元素为null.

          • 也可以使用如下方法对数组进行初始化:
      • 数组长度:
      • 访问数组元素: 
          •     

      • java中使用数组的一个简单例子:(P26 4
       3.2 java语言中与二维数组相关的语法知识
        • 上面一小节讲的都是一维数组相关的语法知识,包括一维数组的声明、分配内存空间、初始化、索引等等,下面来讲述二维数组相关的语法知识。
        • 其实二维数组和一维数组是基本上是相同的
        • 二维数组的声明:
            • int arrayName[][];
              int[][] arrayName;

                  
        • 为二维数组分配内存空间:
            • 因为java中是将数组看作类对象,所以也要使用new关键字来为数组分配内存空间
            • 为二维数组分配内存空间有两种方法:
                • 方法一,直接为每一维数组分配内存空间

                  •   
                • 方法二,分别为每一维数组分配内存空间 
                  •         
        • 二维数组的初始化:
            • int array2[][]={{1,2},{1,2},{1,1}};//方法二
              arrayName[0][0]=1;//方法三
                  
        • 访问二维数组中的元素(即索引):
            • 二维数组中行下标是从0开始的, 列下标也是从0开始的
            • 行数=arrayName.length   
            • 列数=arrayName[i].length
        • 实际使用实例:
            • /**
               * @author chen
               * @date 20170305
               * @description 本程序讲述java语言中二维数组相关的语法知识
               *1) 二维数组的声明
               *2) 为二维数组分配内存空间
               *3) 二维数组的初始化
               *4) 访问二维数组中的元素
               * */
              package array;
              
              public class TwoDimentionArray {
                  public static void main(String[] args){
                      /**1)二维数组的声明
                       * 
                       */
                      int array1[][];
                      int[][] array2;
                      
                      /**2)为二维数组分配内存空间(共有两种方法)
                       *         方法一,直接为每一维都分配相同长度的内存空间
                       *         方法二,分别为每一维分配内存空间(各维长度可以不同)
                       */
                      //方法一,直接为每一维都分配相同长度的内存空间
                      array1=new int[2][2];
                      //方法二,分别为每一维分配内存空间(各维长度可以不同)
                      array2=new int[2][];
                      array2[0]=new int[3];
                      array2[1]=new int[6];
                      
                      /**
                       * 可以在数组的声明过程中直接为数组分配内存空间*/
                      int[][] array3=new int[2][3];
                      
                      /**3)二维数组的初始化(共有三种方法)
                       *         方法一,
                       *         方法三,使用for循环分别为数组的每个元素赋值
                       * */
                      //方法一,
                      int array5[][]={{1,2,2},{3,1,2}};
                      /*方法三,使用for循环分别为数组的每个元素赋值
                       *         *可以为二维数组的各行分配不同列数
                       *         *二维数组的行数=arrayName.length
                       *         *二维数组第i行的列数=arrayName[i].length,其中i=0,1...
                       */
                      int arrayName[][]=new int[3][];//并不指定列数,为的是下面可以分别为每一行分配列长度
                      for(int i=0;i<arrayName.length;i++){//arrayName.length返回值是二维数组的行数
                          arrayName[i]=new int[i+1];//为二维数组的第i行分配长度为i+1的内存空间
                          for(int j=0;j<arrayName[i].length;j++){//arrayName[i].length返回值是该二维数组的第i行的长度
                              arrayName[i][j]=(i+1)*(j+1);
                              System.out.print(arrayName[i][j]+" ");
                          }
                          System.out.println("");
                      }
                  }
              
              }

              结果:

              1 
              2 4 
              3 6 9 
        •  

          二维数组的遍历
            • /**5)遍历二维数组
                       *        方法一,使用双层for循环来遍历一个二维数组
                       *        方法二,使用for each来遍历一个二维数组
                       * */
                      System.out.println("
              二维数组的遍历");
                      //方法一,使用双层for循环来遍历一个二维数组
                      System.out.println("方法一,使用双层for循环来遍历一个二维数组");
                      int arrayName2[][]={{1,2,3},{1,1,0,6},{1,1}};//现在只是指定了行数并不指定列数,为的是下面可以分别为每一行分配列长度
                      for(int i=0;i<arrayName2.length;i++){//arrayName.length返回值是二维数组的行数
                          for(int j=0;j<arrayName2[i].length;j++){//arrayName[i].length返回值是该二维数组的第i行的长度
                              System.out.print(arrayName2[i][j]+" ");
                          }
                          System.out.println("");
                      }//end for
                      //方法二,使用for each来遍历一个二维数组
                      System.out.println("方法二,使用for each来遍历一个二维数组");
                      int arrayName3[][]={{1,2,3},{1,1,0,6},{1,1}};
                      for(int tmp[]:arrayName3){//使用tmp:int[]存储二维数组中的一行
                          for(int element:tmp){//使用element:int存储tmp:int[]中的一个元素
                              if(element==tmp.length){//判断元素是不是该行的最后一个元素
                                  System.out.print(element);
                              }else{
                                  System.out.print(element+"、");
                              }
                          }
                          System.out.println("");//换行
                      }

              运行结果:

              二维数组的遍历
              方法一,使用双层for循环来遍历一个二维数组
              1 2 3 
              1 1 0 6 
              1 1 
              方法二,使用for each来遍历一个二维数组
              1、2、3
              1、1、0、61、1、
                      

      4.Java设计出的用于操作数组元素的相关算法(自定义算法)

        P28----LowArray.java

        P31----HighArray.java

      5.特殊的数组(有序数组)

      • 有序数组实现数据插入、查找、删除的算法:

        OrdArray.java     P40

      5.有序数组和无序数组的比较

     

    有序数组

    无序数组

    定义

    数组元素按照从小到大的顺序排列(不允许重复)

    数组元素无序存放

    插入

    查找到元素,后面的元素依次后移

    直接插入(一步即可完成)

    查找特定元素

    二分法查找

    线性查找(特别对于元素非常多的情况下,时间复杂度远大于有序数组中的查找)

    删除元素

    二分法查找,后面的元素前移

    线性查找,后面的元素前移

          由于元素移动的时间复杂度比线性查找的时间复杂度大得多,所以有序、无序数组删除元素的算法运行的都相对很慢。

      6.复杂类型的数组(如以Student对象为基本元素的数组)

          P45-P49

        Person.java

        ClassDataArray.java

        ClassDataApp.javamain函数,测试上述数组相关算法编写得是否正确)  

      5.为什么不用数组表示一切

        1)数组的插入、查找、删除操作的时间复杂度高

             

        2)数组的大小需要在开始时就指定,使用起来非常不方便

             

            

    小结:

        

        算法中:

          数组插入元素后,num++

          数组删除元素后,num- - 不要忘记哦

     

      

    学习的过程中总会得到一些心得体会,认真地将它们记录下来并分享给每一个愿意花费时间去阅读它们的人,然后意外地收获某个读者的评论,从而激发出新的感想,是一件十分令人欢快的事。如果你也在研习这方面的知识,欢迎加入到我们的队伍中来,和我们一起进步吧(^_^)
  • 相关阅读:
    【简单算法】27.验证二叉搜索树
    【简单算法】26. 二叉树的最大深度
    【简单算法】25. 环形链表
    pandas 数据处理
    主成分分析 PCA
    hive 导出数据到本地
    深度学习的优化方法 总结
    ALS算法 (面试准备)
    Bagging和Boosting的区别(面试准备)
    ROC 曲线,以及AUC计算方式
  • 原文地址:https://www.cnblogs.com/lxrm/p/6440049.html
Copyright © 2020-2023  润新知