>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 25088 个阅读者 刷新本主题
 * 贴子主题:  算法优化策略之“中途相遇”算法思想 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2020-03-15 20:28:04     消息  查看  搜索  好友  邮件  复制  引用

  
中途相遇法,这是一种特殊的算法,大体思路是从两个不同的方向来解决问题,最终“汇集”到一起。“双向广度优先搜索”算法就有一点中途相遇的味道。

下面我们通过一道具体的题目,来了解一下这种算法思想的应用。

和为0的4个值(4 Value Whose Sum is Zero,ACM/ICPC SWERC 2005,UVa 1152)
给定4个n(1<=n<=400)元素集合A,B,C,D,要求分别从中选取一个元素a,b,c,d,使得a+b+c+d=0。问有多少种选法?

例如,A={-45,-41,-36,26,-32},B={22,-27,53,30,-38,-54},C={42,56,-37,-75,-10,-6},D={-16,30,77,-46,62,45},则有5中选择法:(-45,-27,42,30),(26,30,-10,-46),(-32,22,56,-46),(-32,30,-75,77),(-32,-54,56,30)。

分析如下:

我们最容易想到的就是写一个四重循环枚举a,b,c,d,看看加起来是否等于0,时间复杂度为O(n^4),超时。一个稍好的方法就是枚举a,b,c,则只需要再集合D里面找找是否有元素-a-b-c,如果存在,则方案加1.如果排序后使用二分查找则算法可以适当优化。

把刚才的方法加以推广就可以得到一个更快的算法:首先枚举a,b,把所有的a+b记录下来存放在一个有序数组里,然后枚举c,d,看看有多少种方法写成a+b的形式。这里就用到了“中途相遇“的思想。但如果数据量较大,以上所述算法也可能会超时。所以,在此处,小编推荐一种更高效的实现方法,就是把a+b放在自己实现的一个哈希表里。这样,就可以适当程度上优化算法。

由于,此文重在通过一道简单的例题讲述”中途相遇“的思想,重点不在次例题的具体实现算法上。所以,此处没有写出具体的实现代码。小编建议读者,亲自试一下此博文中提到的几种思想,以便于让自己对执行效率有更加清楚的认识。

由于小编水平有限,欢迎读者发现错误,并提出错误,小编一定积极改正。



----------------------------
原文链接:https://blog.51cto.com/13642075/2086255

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-16 11:47:34 重新编辑]
  Java面向对象编程-->Java常用类(上)
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->域对象在持久化层的四种状态
  Java网络编程-->创建非阻塞的HTTP服务器
  精通Spring-->Vue组件开发基础
  Vue3开发-->Vue简介
  整理得吐血了,二叉树、红黑树、B、B+树超齐全,快速搞定数据...
  浅谈算法,一些感悟
  银行家算法范例
  java 通配符的应用范例, java 排序算法
  AES算法,DES算法,RSA算法JAVA实现
  活动安排问题(贪心算法)
  基于JavaScript的Base64编码、解码算法
  无向图的最短路径求解算法之——Dijkstra算法
  一种码位倒置算法
  RSA 非对称加密原理(小白也能看懂哦~)
  小米面试算法题:搜索旋转排序数组
  Java数据结构与算法 - 栈和队列
  分析递归和迭代的区别、优缺点及实例对比
  技术和算法的抉择
  好书推荐:《小灰的算法之旅》
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。