数组算法进阶之探究转置之法 | 带你学《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面向对象编程文章查看此处

相关文章
|
21天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
3天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
6天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
53 23
|
22天前
|
存储 Java 索引
Java基础(六):数组
Java基础(六):数组
Java基础(六):数组
|
16天前
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
|
17天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
56 16
|
20天前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
51 12
|
20天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
54 6
|
20天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
42 5
|
23天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。