数组算法进阶之探究转置之法 | 带你学《Java面向对象编程》之十九

简介: 本节列举了两个转置数组元素的方案,并辅以内存分析辨明两种方案的优劣,带领读者迅速掌握其中的算法思想。

上一篇:数组排序-触摸算法的门槛 | 带你学《Java面向对象编程》之十八
【本节目标】
通过阅读本节内容,你将通过一则数组转置对算法这一范畴有更深的理解,并学会通过分析设计优化思路、改良算法,以更容易应对复杂的逻辑场景。

数组操作案例:数组反转

数组的反转操作指的是进行前后转置处理,即:首尾交换,例如,现在有一个数组,其内容如下:

  • 数组内容:1、2、3、4、5、6、7、8、9;

  • 交换后的内容:9、8、7、6、5、4、3、2、1;

对于数组的前后交换有两种做法:
做法一:定义一个新的数组而后按照逆序的方式保存(会产生无用的垃圾空间)

image.png
图一 数组转换结果图

class ArrayUtil {   
    public static void printArray(int temp []) {
        for (int x = 0 ; x < temp.lenght ; x ++) {
            System.out.print (temp[x] + “、”) ;
        }
        System.out.println() ;
    }
}
public class ArrayDemo {
     public static void main (String args[ ]) {
         int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
         int temp [] = new int [data.length] ;   //第二个数组
         int foot = temp.length – 1 ;   //第二个数组的脚标
         for (int x = 0 ; x < data.lenght ; x ++) {
             temp[foot --] = data [x] ;
         }
         data = temp ;
         ArrayUtil.printArray(data) ;
     }    
}

image.png
图二 转换结果

下面进行一下内存的分析处理,观察一下程序存在的问题。(以3个数据为例)

image.png
图三 数组转换内存分析图

做法二:在一个数组上进行转置(部分数据为例)

image.png
图四 数组转置分析

现在如果想实现这种转置最需要确定的是数组转换的次数,次数的计算:“数组长度÷2”,实际上并不需要去考虑数组是奇数个数还是偶数个数。

class ArrayUtil {
    public static void printArray(int temp []) {
         for (int x = 0 ; x < temp.lenght ; x ++) {
             System.out.print (temp[x] + “、”) ;
         }
         System.out.println() ;
     }
}
public class ArrayDemo {
     public static void main (String args[ ]) {
         int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
         int center = data.length /2 ;    //确定转换的次数
         int head = 0 ;   //操作的脚标
         int tail = data.length – 1 ;  //操作脚标
         for (int x = 0 ;x < center ;x ++) {
             int temp =data [head] ;
             data [head] = data [tail] ;
             data [tail] = temp ;
             head ++ ;
             tail -- ;
         }
         ArrayUtil.printArray(data) ;
     }    
}

image.png
图五 执行结果图

两种实现如果要进行比较可以发现,第一种处理方式循环次数较多,并且还会产生垃圾。而第二种实现,循环次数降低,但是存在有if判断增加了时间复杂度,可是可以减少无用对象的产生,以提升性能。
范例:将转换功能变为类定义

class ArrayUtil {
     public static void reverse(int data[]) {
         int center = data.length /2 ;    //确定转换的次数
         int head = 0 ;   //操作的脚标
         int tail = data.length – 1 ;  //操作脚标
         for (int x = 0 ;x < center ;x ++) {
             int temp =data [head] ;
             data [head] = data [tail] ;
             data [tail] = temp ;
             head ++ ;
             tail -- ;
          }
      }
      public static void printArray(int temp []) {
          for (int x = 0 ; x < temp.lenght ; x ++) {
              System.out.print (temp[x] + “、”) ;
          }
          System.out.println() ;
       }
}
public class ArrayDemo {
     public static void main (String args[ ]) {
         int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
         ArrayUtil.reverse(data) ;      //转置处理
         ArrayUtil.printArray(data) ;
     }    
}

image.png
图六 执行结果二

可以发现数组由于可以通过脚标进行元素的控制,所以相应的循环逻辑使用的会比较多。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:欲善其事,先利其器-数组类库 | 带你学《Java面向对象编程》之二十
更多Java面向对象编程文章查看此处

相关文章
|
2月前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
194 63
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
56 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
3月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
39 4
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
47 2
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
106 2
|
3月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
30 3
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
31 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
42 0
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。