关键词:
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—... 查看详情