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

相关文章
|
4月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
670 35
|
4月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
4月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
6月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
277 0
|
7月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
165 4
|
7月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
286 0
|
7月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
278 1
|
8月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
549 58
|
9月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
371 0
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1