那篇并编程艺术3写完了,但下午发现了原创度更高的个人真实案例分析,反正已经写完了,随时可以发,个人问题的优化记忆才更深。
1.go to语法
今天偶然看到ThreadPoolExecutor的addworker方法用到了go to,他到底是个优雅高级语法,还是个混淆语法。
public static void main(String[] args) { for (int i = 0; i <2; i++) { for (int j = 0; j < 5; j++) { System.out.println(j); if(j==3){ break; } } } System.out.println("=================="); retry: for (int i = 0; i <2; i++) { for (int j = 0; j < 5; j++) { System.out.println(j); if(j==3){ break retry; } } } }
普通的break跳出了当前for循环,但没有结束外层循环
retry 标识此处循环跳出,标识位在外层循环外面,跳出外循环。
2.递归优化
递归算法空间复杂度:递归深度n*每次递归所要的辅助空间,如果每次递归所需要的辅助空间为常数,则递归空间复杂度o(n)。
优化前
public Long filterOrg(Long orgId) { CountVo vo= gMapper.queryOrId(orgId); if(vo==null){ return orgId; }else if(1==vo.getPid()){ return orgId; }else{ return filterOrg(vo.getPid()); }
业务逻辑不考虑pid为null情况
优化
public Long filterOrg(Long orgId) { if (orgId == 1) return orgId; Long serachId = orgId; for (; ;) { CountVo vo = this.queryOrgId(serachId); if(vo==null||vo.getPid()==1)return orgId; serachId=vo.getPid(); } }
然后kk不知廉耻的写上了一段注释,深藏功与名
/** * 功能描述: 舍弃递归,复杂度降低,避免栈溢出 * @Param: [orgId] * @Return: java.lang.Long * @Author: kk */
看着这个多层if就想起被千行foreach+if支配的恐惧,必须干掉他,写到这竟然笑出了声,可能这就是菜鸡成长的喜悦吧。
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。这个优化厉害了
function factorial(n, total) { if (n === 1) return total; return factorial(n - 1, n * total); } factorial(5, 1) // 120
尾递归优化
function Fibonacci2 (n , ac1 = 1 , ac2 = 1) { if( n <= 1 ) {return ac2}; return Fibonacci2 (n - 1, ac2, ac1 + ac2); } Fibonacci2(100) // 573147844013817200000 Fibonacci2(1000) // 7.0330367711422765e+208 Fibonacci2(10000) // Infinity https://blog.csdn.net/qq_37818095/article/details/81944809
虽然这是js的
用队列优化递归
public void getFile(File file){ if(file.isDirectory()){//如果是目录 File[] files = file.listFiles(); for(int i=0;i<files.length;i++) getFile(files[i]);//递归 } else if(file.isFile()){ //如果是文件,就输出。 System.out.println(file.getName()); } }
使用队列优化。
//创建一个队列 Queen<File> queue = new LinkedList<File>(); queue.offer(file); while(!queue.isEmpty()){//如果队列不为空 File file = queue.poll(); if(file.isDirectory()){ //从队列中获取一个File File[] files = file.listFiles(); //是目录,将目录下所有文件遍历出来,存储到队列中 for(int i =0;i<files.length;i++) queue.offer(files[i]); }else{ //是文件,进行输出。 System.out.println(file.getName()); } }版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/pseudonym_/article/details/71600084
本文分享自微信公众号 - 赵KK日常技术记录(gh_cc4c9f1a9521),作者:赵kk
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-07-31
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句