o纬度减少循环次数(代码片段)

taojietaoge taojietaoge     2022-12-14     637

关键词:

O(1)纬度减少循环次数

 

平时看淡,不服就干。老子有句粗口话不知道当不当讲,我们公司上一次发工资时4月4号,时至今日5-30已经有57天没有发工资了,我还要继续坚持下去吗?难不成现在大家工作都TM的不在乎钱了的吗?

使用O(1)纬度减少循环次数,提高代码质量。

需要实现匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:

  1 package com.xinyan.springcloud.tjt;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 
  8 import org.apache.commons.lang.StringUtils;
  9 
 10 import lombok.Data;
 11 
 12 public class CompareOne 
 13     private static List<KeyInfo> list1 = new ArrayList<>();
 14     private static List<CipherPathInfo> list2 = new ArrayList<>();
 15 
 16     /**
 17      * 比较low的methodOne设计
 18      */
 19     public void methodOne() 
 20         // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
 21         // 设计方案1:
 22         for (int i = 0; i < list1.size(); i++) 
 23             KeyInfo keyInfo = list1.get(i);
 24             String keyName = keyInfo.getKeyName();
 25             String cipher = keyInfo.getCipher();
 26             for (int j = 0; j < list2.size(); j++) 
 27                 CipherPathInfo cipherPathInfo = list2.get(j);
 28                 String keyName2 = cipherPathInfo.getKeyName();
 29                 if (StringUtils.equals(keyName, keyName2)) 
 30                     cipherPathInfo.setCipher(cipher);
 31                 
 32             
 33         
 34     
 35 
 36     /**
 37      * 较好的methodTwo设计
 38      */
 39     public void methodTwo() 
 40         // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
 41         // 设计方案2:
 42         Map<String, String> keyNameMap = new HashMap<>();
 43         // 使用keyNameMap缓存keyName的cipher
 44         for (int i = 0; i < list1.size(); i++) 
 45             KeyInfo keyInfo = list1.get(i);
 46             String keyName = keyInfo.getKeyName();
 47             String cipher = keyInfo.getCipher();
 48             keyNameMap.put(keyName, cipher);
 49         
 50         // 根据keyName的名称查keyNameMap取出cipher
 51         for (int j = 0; j < list2.size(); j++) 
 52             CipherPathInfo cipherPathInfo = list2.get(j);
 53             String keyName = cipherPathInfo.getKeyName();
 54             String cipher = keyNameMap.get(keyName);
 55             if (StringUtils.isNotEmpty(cipher)) 
 56                 cipherPathInfo.setCipher(cipher);
 57             
 58         
 59     
 60 
 61     /**
 62      * 实体KeyInfo
 63      * 
 64      * @author apple
 65      */
 66     @Data
 67     class KeyInfo 
 68         private String keyName;
 69         private String cipher;
 70     
 71 
 72     /**
 73      * 实体CipherPathInfo
 74      * 
 75      * @author apple
 76      */
 77     @Data
 78     class CipherPathInfo 
 79         private String keyName;
 80         private String cipher;
 81         private String path;
 82     
 83 
 84     /**
 85      * 构造KeyInfo、CipherPathInfo实体信息
 86      */
 87     public void makeEntityInfo() 
 88         KeyInfo keyInfo = new KeyInfo();
 89         // 构造30个keyInfo实体
 90         for (int i = 0; i < 30; i++) 
 91             keyInfo.setKeyName("name_" + i);
 92             keyInfo.setCipher("cipher_" + i);
 93             list1.add(keyInfo);
 94         
 95         CipherPathInfo cipherPathInfo = new CipherPathInfo();
 96         // 构造100个ciperhPathInfo实体,其中cipher为null
 97         for (int j = 0; j < 100; j++) 
 98             cipherPathInfo.setKeyName("name_" + j);
 99             cipherPathInfo.setPath("path_" + j);
100             list2.add(cipherPathInfo);
101         
102     
103 
104     public static void main(String[] args) 
105         CompareOne c = new CompareOne();
106         c.makeEntityInfo();
107         // 匹配list1 和 list2 中keyName相等的cipher,并把list1中的cipher写入list2:
108         // 设计方案1:
109         c.methodOne();
110         // 方案1设计明显不合理,很low;其中list1有30个元素,而list2有100个
111         // 这样就会累计循环30*100次
112         // 可以将讲list1中获取到的keyName插入哈希中,只需要O(1)的纬度
113         // 方案设计2:
114         c.methodTwo();
115 
116     
117 
118 

 

代码规范(代码片段)

7.3.10尽量减少循环嵌套层次。7.3.11避免循环体内含判断语句避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而... 查看详情

嵌套循环的大o时间复杂度(代码片段)

有人可以告诉我以下嵌套循环的时间复杂度:for(i=1;i<n;i+=i)for(j=1;j<n;j*=j)//O(1)根据我,它将是O(log(n)*log(log(n))因为外部循环将运行log(n)次,因为我们有效地将i乘以2每次迭代。并且在内部循环中我们正在平方在每... 查看详情

数学公式(代码片段)

数学公式一.【累加求和】1+2+3+...+n普通的方法就是For循环,循环次数为N,时间复杂度为O(N)累加求和公式sum=n(n+1)/2时间复杂度为O(1) 查看详情

[算法]复杂度分析(代码片段)

时间复杂度时间复杂度的分析只关注循环执行次数最多的一段代码,因为使用大O表示法,其他执行次数较少的复杂度可以忽略加法法则:总复杂度等于量级最大的那段代码的复杂度乘法法则:嵌套代码的复杂度等于嵌套内外代... 查看详情

算法之选择排序(代码片段)

...层循环结束后,进行一次值替换,此排序比较次数不变,减少值替换次数,相比冒泡排序,性能更高。packagecom.yhq.buildspringmvc.data;importjava.util.Arrays;/***选择排序**@authorYuHaiQi 查看详情

三大基础排序算法(冒泡排序,选择排序,插入排序)(代码片段)

...:冒泡次数注意:1每多排好一个数据,可以将内层循环次数减少一次,从而提高效率.2总共只需要为n-1个数据排序,剩下的一个是最小值,不需要再排序intmain() //定义一个未序一维数组 intarr[10]=1,3,6,9,5,8,-1,2,5,7; //冒泡排序 //外层循环:... 查看详情

每日一题641.设计循环双端队列(代码片段)

641.设计循环双端队列数据结构模拟题一个基本的实现,需要满足除构造函数以外复杂度为O(k)以外,其余操作均为O(1)。常规实现包含两种方式:数组实现与链表实现。其中数组实现可以利用调用次数较小,开成调用次数3倍大小... 查看详情

多重循环编码规(代码片段)

...码规范在多重循环中,必须将最忙的循环放在最内层,以减少CPU切入循环层的次数。【2】示例代码1、新建QT默认工程2、源码(1)pro文件1QT+=coregui23greaterThan(QT_MAJOR_VERSION,4):QT+=widgets45TARGET=TestTime6TEMPLATE=app789SOURCES+=main.cpp10mainwindow.... 查看详情

openclunrollingloops优化(代码片段)

...含循环迭代,可以通过展开循环来提高性能。循环的展开减少了离线编译器执行的迭代次数,但代价是硬件资源消耗的增加。  如果有比较充分的硬件资源,直接在主循环中添加#progmaunroll来展开循环。循环的展开会显著地改... 查看详情

前端性能优化方案(代码片段)

前端开发性能优化方案在JS中尽量减少闭包的使用(原因:闭包会产生不释放的栈内存)A:循环给元素做事件绑定的时候,尽可能的把后期需要的信息(例如索引)存储到元素的自定义属性上,而不是创建闭包存储B:可以在最外层... 查看详情

12字符串中连续最多的字符以及次数(代码片段)

...,计算得到:连续最多的字符是‘e’,4次传统思路嵌套循环,找出每个字符的连接次数,并记录看似时间复杂度是O(n^2)但实际时间复杂度是多少?——O(n),因为有“跳步”代码实现exportinterfaceIRescurChar:stringlength:number... 查看详情

算法学习-排序算法(代码片段)

...句频度或时间频度。记为T(n)eg:计算1-100的和方法一:for循环 T(n)=n+1方法二:直接计算 T(n)=1时间复杂度一般情况下,算法中的基本操作语句的重复执行次数时问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n... 查看详情

数据结构之-时间复杂度/空间复杂度(代码片段)

...模增长的变化趋势。二)、时间复杂度分析:1)、只关注循环次数最多的一短代码T(n)=O(n)intcal(intn)intsum=0;inti=1;for(;i<=n;++i)sum=sum+i;returnsum;2)、加法法则,T(n)=O(max(f(n),g(n)))?场景:多个循环:T(n)=O(mac(f(n)+g(n^2)))=O(n^2)intcal(intn)intsum_1=0;... 查看详情

利用分析函数减少对表访问次数(代码片段)

最近在给一银行客户优化数据仓库,发现了很多烂SQL下面这条SQL有很好的教学作用,现拿来与大家分享SQL语句如下:select/*+parallel(16)*/count(*)from(SELECTHM,DZ,YB,ZZDH,ZJLX,ZJHM,JGBM,ZH,ZHLX,KHRQ,YXRQ,SFLB,FZJG,XXLXFROMSWP.GRKXHBS 查看详情

利用分析函数减少对表访问次数(代码片段)

最近在给一银行客户优化数据仓库,发现了很多烂SQL下面这条SQL有很好的教学作用,现拿来与大家分享SQL语句如下:select/*+parallel(16)*/count(*)from(SELECTHM,DZ,YB,ZZDH,ZJLX,ZJHM,JGBM,ZH,ZHLX,KHRQ,YXRQ,SFLB,FZJG,XXLXFROMSWP.GRKXHBS 查看详情

利用分析函数减少对表访问次数(代码片段)

最近在给一银行客户优化数据仓库,发现了很多烂SQL下面这条SQL有很好的教学作用,现拿来与大家分享SQL语句如下:select/*+parallel(16)*/count(*)from(SELECTHM,DZ,YB,ZZDH,ZJLX,ZJHM,JGBM,ZH,ZHLX,KHRQ,YXRQ,SFLB,FZJG,XXLXFROMSWP.GRKXHBS 查看详情

c#减少嵌套循环(代码片段)

最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。当然,除了关注明显的循环例如for、foreach,还应该关注隐晦一点的循环,例如datatable.s... 查看详情

i/o————缓存流(代码片段)

...读取都是从缓存中读取,直到缓存中数据读取完,这样就减少了io操作,提升了速度。就像拿碗吃饭一样,碗就相当于是缓存,不用吃每一口饭就向锅里盛。分类缓冲流分为字节和字符缓冲流字节缓冲流为:BufferedInputStream—... 查看详情