精华内容
下载资源
问答
  • 三层for循环嵌套优化
    千次阅读
    2021-03-08 07:06:06

    代码示例

    package com.cwl.po;

    /**

    * @program: cwl-performance-optimization

    * @description: 测试for循环-嵌套循环

    * @author: ChenWenLong

    * @create: 2019-11-22 11:27

    **/

    public class TestNestedLoop {

    // 当需要嵌套循环时 外层循环越小 性能越好

    // 例如 10*100*1000 与 1000*100*10 相互比较

    public static void main(String[] args) {

    // 测试最终结果发现当嵌套循环越大 两者相差性能比越大

    System.out.println(testOutSide());

    System.out.println(testInSide());

    }

    /**

    * 功能描述:

    * 〈测试内层循环逐步增大〉

    *

    * @params : []

    * @return : long

    * @author : cwl

    * @date : 2019/11/22 11:36

    */

    private static long testInSide() {

    long begin = System.currentTimeMillis();

    int d = 0;

    for(int a=0;a<1000;a++){

    for(int b=0;b<10000;b++){

    for (int c=0;c<100000;c++){

    d = a+b+c;

    }

    }

    }

    long end = System.currentTimeMillis();

    System.out.println(d);

    return end - begin;

    }

    /**

    * 功能描述:

    * 〈测试内层循环逐步减小〉

    *

    * @params : []

    * @return : long

    * @author : cwl

    * @date : 2019/11/22 11:37

    */

    private static long testOutSide() {

    long begin = System.currentTimeMillis();

    int d = 0;

    for(int a=0;a<100000;a++){

    for(int b=0;b<10000;b++){

    for (int c=0;c<1000;c++){

    d = a+b+c;

    }

    }

    }

    long end = System.currentTimeMillis();

    System.out.println(d);

    return end - begin;

    }

    }

    本文同步分享在 博客“cwl_java”(CSDN)。

    如有侵权,请联系 support@oschina.cn 删除。

    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    更多相关内容
  • python 多层for循环嵌套优化方法

    万次阅读 多人点赞 2020-03-11 14:20:40
    题目:有5个长度不一的数组a1、a2、a3、a4、a5,现各从数组中取出一个数,组成...题目挺简单,看一下就明白,然后第一时间用了一堆for循环,脚本如下: a1 = [1,2,4] a2 = [2,3,4,5] a3 = [1,4,7] a4 = [3,6,7,8] a5...

    题目:有5个长度不一的数组a1、a2、a3、a4、a5,现各从数组中取出一个数,组成一个新的数组,要求从a1取出的数必须小于从a2取的数,同理从a2取出的数必须小于从a3取的数,以此类推,列出所有满足条件的数组。

    题目挺简单,看一下就明白,然后第一时间用了一堆for循环,脚本如下:

    a1 = [1,2,4]
    a2 = [2,3,4,5]
    a3 = [1,4,7]
    a4 = [3,6,7,8]
    a5 = [3,6,8,9,10]
    
    for i in a1:
        for j in a2:
            for k in a3:
                for l in a4:
                    for m in a5:
                        if i<j<k<l<m:
                            print(i,j,k,l,m)
    

    在这里插入图片描述
    输出结果没错,但是看着这一堆for循环,总感觉很不爽,一番搜索后,发现了itertools.product(A, B)这个函数,这个函数会返回A、B中的元素的笛卡尔积的元组,似乎满足条件,于是上面的脚本改成了下面的样子

    import itertools
    
    for i in itertools.product(a1,a2,a3,a4,a5):
        if i[0]<i[1]<i[2]<i[3]<i[4]:
            print(i)
    

    在这里插入图片描述

    展开全文
  • Java优化for循环嵌套的高效率方法

    千次阅读 2021-02-12 23:59:03
    前几天有人问过我一个问题,就是两个嵌套for循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧!!! 请教了答案,恍然大悟。比如:两个list中分别装有相同的对象数据。 list1中有3...

    前几天有人问过我一个问题,就是两个嵌套for循环执行效率的问题,问有什么好的办法替换。当时我想了想,实在想不起来,哎,惭愧!!! 请教了答案,恍然大悟。

    比如:两个list中分别装有相同的对象数据。 list1中有3万条对象数据。 list2中有2万条对象数据(但是对象中的某个属性变量为空)。两个list中的id或者其他变量都一模一样。请用最快的方式找出list2中变量为空的那个对象,并且去list1中找出id相同的对象。 或者可以理解成,从list2中找出变量为空的,去list1中找出对应的对象,然后把为空的列补上。总之就是这么一个意思,先 for 循环 list2,判断一下每个对象的那个属性变量是否为空,如果为空,再去for循环list1,找出id一样的对象,就算执行成功了。

    那么请看下边的for循环嵌套的解决方式:

    for(member m2:list2){

    if(m2.getname()==null){

    for(member m1:list1){

    if(m1.getid().intvalue()==m2.getid().intvalue()){

    system.out.println(m2.getid()+" name 值为空!!!");

    }

    }

    }

    }

    这样真的好吗? 如果有上万,甚至十几万的数据,那么这个执行效率问题,我就不多说了。 非常非常的慢。

    下边来看使用map代替的执行方式,以及两种方式的效率对比:

    import java.util.arraylist;

    import java.util.date;

    import java.util.hashmap;

    import java.util.list;

    import java.util.map;

    import java.util.concurrent.timeunit;

    class member {

    private integer id;

    private string name;

    private integer age;

    private date adddate;

    public member() {

    }

    public member(integer id, string name, integer age, date adddate) {

    super();

    this.id = id;

    this.name = name;

    this.age = age;

    this.adddate = adddate;

    }

    public integer getid() {

    return id;

    }

    public void setid(integer id) {

    this.id = id;

    }

    public string getname() {

    return name;

    }

    public void setname(string name) {

    this.name = name;

    }

    public integer getage() {

    return age;

    }

    public void setage(integer age) {

    this.age = age;

    }

    public date getadddate() {

    return adddate;

    }

    public void setadddate(date adddate) {

    this.adddate = adddate;

    }

    }

    public class for2 {

    public static void main(string[] args) throws interruptedexception {

    list list1 = new arraylist<>();

    list list2 = new arraylist<>();

    for(int i=0;i<30000;i++){

    date date = new date();

    list1.add(new member((i+1),"技术客",(i+1), date));

    if(i%2==0){

    list2.add(new member((i+1),null,(i+1), date));

    }

    }

    //双for循环嵌套测试

    long s1 = system.currenttimemillis();

    int fornumber = 0;

    for(member m2:list2){

    if(m2.getname()==null){

    for(member m1:list1){

    if(m1.getid().intvalue()==m2.getid().intvalue()){

    // system.out.println(m2.getid()+" name 值为空!!!");

    fornumber++;

    }

    }

    }

    }

    long s2 = system.currenttimemillis();

    system.out.println("双for循环查询时间为:"+(s2-s1)+"(毫秒),一共查询出"+fornumber+"条数据 \n\n\n");

    timeunit.seconds.sleep(3);

    //map查询测试

    long s3 = system.currenttimemillis();

    int mapnumber = 0;

    map map = new hashmap<>();

    for(member m1:list1){

    map.put(m1.getid(), m1);

    }

    for(member m2:list2){

    if(m2.getname()==null){

    member m = map.get(m2.getid());

    if(m!=null){

    // system.out.println(m2.getid()+" name 值为空!!!");

    mapnumber++;

    }

    }

    }

    long s4 = system.currenttimemillis();

    system.out.println("使用map结构查询时间为:"+(s4-s3)+"(毫秒),一共查询出"+mapnumber+"条数据 \n\n\n");

    }

    }

    输出结果:

    双for循环查询时间为:1578(毫秒),一共查询出15000条数据

    使用map结构查询时间为:14(毫秒),一共查询出15000条数据

    如果我们模拟10万条数据,然后其中五千条重复数据的情况下:效率更是天壤之别。

    看输出结果:

    双for循环查询时间为:30929(毫秒),一共查询出50000条数据

    使用map结构查询时间为:24(毫秒),一共查询出50000条数据

    循环数据越小,两者差别也就越小,但是数据量越大,差别也就越大。 10万条数据的差别竟然达到上千倍!

    以上就是java优化for循环嵌套的高效率方法的详细内容,更多关于java 优化 for循环的资料请关注萬仟网其它相关文章!

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 参考资料:http://cgs1999.iteye.com/blog/15966711 案例描述某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化Java代码for(inti=0;ifor(intj=0;jfor(intk=0;ktestFunction(i,j,k);(注:为了...

    参考资料:http://cgs1999.iteye.com/blog/1596671

    1 案例描述

    某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化

    Java代码  40229668c3fe72356cfdc78f39afa7b3.png

    for (int i = 0; i 

    for (int j = 0; j 

    for (int k = 0; k 

    testFunction (i, j, k);

    (注:为了同后面的内容一致,这里对原题目进行了部分修改)

    2 案例分析

    从给出的代码可知,不论如何优化,testFunction执行的次数都是相同的,该部分不存在优化的可能。那么,代码的优化只能从循环变量i、j、k的实例化、初始化、比较、自增等方面的耗时上进行分析。

    首先,我们先分析原题代码循环变量在实例化、初始化、比较、自增等方面的耗时情况:

    变量

    实例化(次数)

    初始化(次数)

    比较(次数)

    自增(次数)

    i

    1

    1

    1000

    1000

    j

    1000

    1000

    1000 * 100

    1000 * 100

    k

    1000 * 100

    1000 * 100

    1000 * 100 * 10

    1000 * 100 * 10

    (注:由于单次耗时视不同机器配置而不同,上表相关耗时采用处理的次数进行说明)

    该代码的性能优化就是尽可能减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时,不能引进其它可能的运算耗时。

    3 解决过程

    从案例分析,对于原题代码,我们提出有两种优化方案:

    3.1 优化方案一

    代码如下:

    Java代码  40229668c3fe72356cfdc78f39afa7b3.png

    for (int i = 0; i 

    for (int j = 0; j 

    for (int k = 0; k 

    testFunction (k, j, i);

    该方案主要是将循环次数最少的放到外面,循环次数最多的放里面,这样可以最大程度的(注:3个不同次数的循环变量共有6种排列组合情况,此种组合为最优)减少相关循环变量的实例化次数、初始化次数、比较次数、自增次数,方案耗时情况如下:

    变量

    实例化(次数)

    初始化(次数)

    比较(次数)

    自增(次数)

    i

    1

    1

    10

    10

    j

    10

    10

    10 * 100

    10 * 100

    k

    10 * 100

    10 * 100

    10 * 100 * 1000

    10 * 100 * 1000

    3.2 优化方案二

    代码如下:

    Java代码  40229668c3fe72356cfdc78f39afa7b3.png

    int i, j, k;

    for (i = 0; i 

    for (j = 0; j 

    for (k = 0; k 

    testFunction (k, j, i);

    该方案在方案一的基础上,将循环变量的实例化放到循环外,这样可以进一步减少相关循环变量的实例化次数,方案耗时情况如下:

    变量

    实例化(次数)

    初始化(次数)

    比较(次数)

    自增(次数)

    i

    1

    1

    10

    10

    j

    1

    10

    10 * 100

    10 * 100

    k

    1

    10 * 100

    10 * 100 * 1000

    10 * 100 * 1000

    4 解决结果

    那么,提出的优化方案是否如我们分析的那样有了性能上的提升了呢?我们编写一些测试代码进行验证,数据更能说明我们的优化效果。

    4.1 测试代码

    Java代码  40229668c3fe72356cfdc78f39afa7b3.png

    public static void testFunction(int i, int j, int k) {

    System.out.print("");   // 注:该方法不影响整体优化,这里只有简单输出

    }

    public static void testA() {

    long start = System.nanoTime();

    for (int i = 0; i 

    for (int j = 0; j 

    for (int k = 0; k 

    testFunction(i, j, k);

    System.out.println("testA time>>" + (System.nanoTime() - start));

    }

    public static void testB() {

    long start = System.nanoTime();

    for (int i = 0; i 

    for (int j = 0; j 

    for (int k = 0; k 

    testFunction(k, j, i);

    System.out.println("testB time>>" + (System.nanoTime() - start));

    }

    public static void testC() {

    long start = System.nanoTime();

    int i;

    int j;

    int k;

    for (i = 0; i 

    for (j = 0; j 

    for (k = 0; k 

    testFunction(k, j, i);

    System.out.println("testC time>>" + (System.nanoTime() - start));

    }

    4.2 测试结果

    1、测试机器配置:Pentium(R) Dual-Core CPU E5400 @2.70GHz 2.70GHz, 2GB内存;

    2、循环变量i、j、k循环次数分别为10、100、1000,进行5组测试,测试结果如下:

    第1组

    第2组

    第3组

    第4组

    第5组

    原方案

    171846271

    173250166

    173910870

    173199875

    173725328

    方案一

    168839312

    168466660

    168372616

    168310190

    168041251

    方案二

    168001838

    169141906

    168230655

    169421766

    168240748

    从上面的测试结果来看,优化后的方案明显性能优于原方案,达到了优化的效果。但优化方案二并没有如我们预期的优于方案一,其中第2、4、5组的数据更是比方案一差,怀疑可能是循环次数太少,以及测试环境相关因素影响下出现的结果。

    3、重新调整循环变量i、j、k循环次数分别为20、200、2000,进行5组测试,测试结果如下:

    第1组

    第2组

    第3组

    第4组

    第5组

    原方案

    1355397203

    1358978176

    1358128281

    1350193682

    1354786598

    方案一

    1343482704

    1348410388

    1343978037

    1347919156

    1340697793

    方案二

    1342427528

    1343897887

    1342662462

    1342124048

    1336266453

    从上面的测试结果来看,优化后的方案基本符合我们的预期结果。

    5 总结

    从案例分析和解决过程中的三个表的分析可知,优化方案一和优化方案二的性能都比原代码的性能好,其中优化方案二的性能是最好的。在嵌套For循环中,将循环次数多的循环放在内侧,循环次数少的循环放在外侧,其性能会提高;减少循环变量的实例化,其性能也会提高。从测试数据可知,对于两种优化方案,如果在循环次数较少的情况下,其运行效果区别不大;但在循环次数较多的情况下,其效果就比较明显了。

    6 参考资料

    [1] http://www.javaeye.com/topic/762312

    [2] http://www.javaeye.com/topic/632481

    展开全文
  • 使用HashMap优化多级嵌套循环 m层嵌套的n次的for循环的时间复杂度为O(n^m),如下所示: public class forTradition { public static void main(String[] args){ List<Student> stus = new ArrayList(); // 为stus...
  • 多层for循环嵌套使用sql优化

    千次阅读 2020-05-16 16:54:28
    哇,已经有一年多没有写了 这来来记录一下一个小小的优化 ... 可以看出来之前代码套了3层for循环,按照每天去循环查每种票类型对应每一个省份的逻辑,从order(订单表)中依次统计对应create_time...
  • 关于for循环嵌套for循环的优化问题

    千次阅读 2020-06-25 13:54:53
    对于for循环嵌套问题 我们常见就是这样: for (int i = 0; i < 1000; i++){ for (int j = 0; j < 100; j++){ for (int k = 0; k < 10; k++){ system.out.println(i+"====="+j+"====="+k); } } } ...
  • 嵌套For循环性能优化案例

    千次阅读 2021-02-12 23:59:02
    1案例描述某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化for (int i = 0; i < 1000; i++)for (int j = 0; j < 100; j++)for (int k = 0; k < 10; k++)testFunction (i, j, k);2 ...
  • 之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响。可能对性能也有影响,但是一直不知道对性能影响在哪。最近在看虚拟机方面的书,感觉有一个点应该算多层嵌套for循环对jvm有影响,特此记录...
  • 方法一:for 循环--多层嵌套 box,box1,box2 = [0,1,2],[0,3,4],[0,5,6] # 0,1,2 个盒子,数字代表球的种类 box3,box4,box5 = [0,5,6],[0,3,4],[0,1,2] # 3,4,5 个盒子 Box = [box,box1,box2,box3,box4,box...
  • 请教 js中嵌套3层for 如何优化掉呢。3层for用来遍历数组的无标题文档var reg = {isnan: /^[\D]+$/}function interface(name, methods) {if (!(reg.isnan.test(name) && arguments.length <= 2 &&...
  • 主要介绍了vue2.0制作多级嵌套菜单栏,主要使用v-for循环生成一个多级嵌套菜单栏,这个方法应用非常广泛,需要的朋友可以参考下
  • //重构建数组再赋值 循环res:[{…}, {…}, {…}, {…}, {…}, {…}], 使leftArr每一项为一个对象 res.forEach((v) => { leftArr.push({ id: v.id, name: v.name, }); rightArr.push(v.data); }); console.log...
  • 给你稍稍改了下,减了一层循环,不过没有测试,你先看看interface.checkImplement = function(object) {// if (arguments.length < 2 || object.constructor !== Array) {if (arguments.length < 2 || !Array....
  • 多层for循环优化

    千次阅读 2019-05-12 13:33:51
    1.6.1 找出最大周长的三角形 /*可以用穷举找出最长,三重循环。*/ for (i = 0; i ;++i) { for (j = i + 1; j ; ++j) { for (k = j + 1; k ; ++k) { len = b[i] + b[j] + b[k]; m
  • for 循环优化

    千次阅读 2022-02-14 14:27:18
    经常使用循环耗时计算的操作,尤其是 for 循环,如果处理不好,耗时就比较长,如果处理书写得当将大大提高效率,下面总结几条 for 循环的常见优化方式。 一、消除循环终止判断时的方法调用 优化前: for (int i = 0;...
  • 今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环优化。作为大结构之一的循环,在我们编写代码的时候会经常用到。循环结构让我们操作数组、集合和其他一些有规律的事物变得更加的方便...
  • 多层for 循环优化方法

    2020-04-21 15:16:11
    多层for 循环优化方法 demo public List<AclModuleLevelDto> roleTree(int roleId) { // 1、当前用户已分配的权限点 List<SysAcl> userAclList = sysCoreService.getCurrentUserAclList(); // 2、...
  • 在js中的for循环数组,for(vari=nums.length;i--;) 要比for(vari= 0;i<nums.length;i++) 性能提升50%以上: for(vari=nums.length;i--;) 循环消耗性能: var twoSum = function(nums, target) { for (var i = ...
  • 多层for循环优化问题

    千次阅读 2021-11-18 10:22:04
    嵌套循环应该遵循“外小内大”的原则,当需要嵌套循环时,尽可能让外层循环越小,性能越好; 原来代码: long stratTime = System.nanoTime(); for (int i = 0; i < 10000000; i++) { for (int j = 0; j < ...
  • python-for循环-嵌套循环-函数

    千次阅读 2022-01-20 21:43:02
    for循环和可迭代对象遍历 for循环通常用于可迭代对象的遍历。for 循环的语法格式如下: for变量in 可迭代对象 : 循环体语句 [操作]遍历一个元组或列表 for x in (20,30,40): print(x*3) 可迭代对象 Python...
  • 如果直接使用双层循环方式, 那么嵌套循环方式时间复杂度: O(n^2), 此时可以考虑使用 Map 的方式, 优化嵌套循环的时间复杂度, Map 方式时间复杂度: O(n) /** * 双层 for 循环性能比 map 低很多 * 需要用到双层 for...
  • java for循环及其优化

    千次阅读 2021-03-16 11:37:30
    for循环1.首先知道,for循环的3个表达式的意思:表达式1: 一般为赋值表达式,给控制变量赋初值;表达式2: 关系表达式或逻辑表达式,循环控制条件;表达式3: 一般为赋值表达式,给控制变量增量或减量。3个表达式都...
  • 在之前写过的程序里,循环这个东西的使用频率非常高,无论我们是实现基础C语言题目,例如打印一维数组、杨辉三角、打印九九乘法表还是实现种类繁多且适用场景不同的排序...在这篇文章里,我将对for循环进行详细的分析。
  • 使用Map优化双层for嵌套

    千次阅读 2020-11-06 10:58:18
    通常情况下,我们对于数据量比较多的时候,如果使用的双层for,会大大降低程序运行效率,对于数据量相对较少,使用双层for嵌套,是察觉不到什么效果的。下面我为大家模拟一万条数据的情况下,合并成一个集合的效率...
  • JavaScript for循环和for循环嵌套

    千次阅读 多人点赞 2017-09-18 20:03:17
    循环结构的概念 先来看看生活中的一些场景: (1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完了。 (2)快递员送快递:查看送件地址→赶往目的地→电话告知...
  • 如果小循环中执行的函数比较耗时的话可以考虑生产者-消费者模型import randomfrom threading import Threadfrom Queue import Queueresqueue = Queue()aqueue = Queue()bqueue = Queue()cqueue = Queue()def ...
  • 这麽慢,然后在代码中分块记录它的耗时时间, 发现是在 foreach 遍历的问题,嵌套数据量太大了, 我还嵌套三层, 数据量大约为: 30*20000*20000;额~ ~, 相乘起来数据量有点大了,怪不得会慢~1、模拟场景, 优.....
  • 1. 掌握循环嵌套的使用 2. 理解两种跳转的作用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,923
精华内容 13,969
热门标签
关键字:

三层for循环嵌套优化