首页 > 其他分享 >2-sum 和 3-sum 问题的快速解法

2-sum 和 3-sum 问题的快速解法

时间:2023-01-21 11:55:26浏览次数:42  
标签:二分 级别 sum 算法 查找 快速 解法

用科学方法分析程序中介绍了 3-sum 问题的暴力解法(ThreeSum)——用三个嵌套的 for 循环来求和为 0 的三元组个数,增长数量级为立方级别。

类似地,对于 2-sum 问题(找出一个输入中所有和为 0 的整数对的数量),可用两个嵌套的 for 循环来解决(TwoSum),增长数量级为平方级别。

将输入数据排序后应用二分查找,可得到 2-sum 的快速解法(假设输入的所有整数均各不相同):

首先将数组排序(为二分查找做准备),然后对于数组中的每个 a[i],使用 BinarySearch 的 rank() 方法对 -a[i] 进行二分查找。如果结果为 j 且 j>i[1],我们就将计数器加 1。

归并排序所需的时间和 NlogN 成正比,二分查找所需的时间和 logN 成正比,因此整个算法的运行时间和 NlogN 成正比。

2-sum 问题的线性对数级别的解法

和刚才一样,我们假设所有整数均各不相同。当且仅当 -(a[i] +a[j]) 在数组中时,整数对(a[i] 和 a[j])为某个和为 0 的三元组的一部分。下面代码框中的代码会将数组排序并进行 N(N-1)/2 次二分查找[2],每次查找所需的时间都和 logN 成正比。因此总运行时间和 N2logN 成正比。

3-sum 问题的 N2lgN 解法

图 1 显示了用这 4 种算法的成本的悬殊差距。

图 1 解决 2-sum 和 3-sum 问题的各种算法的成本

下界

我们还能找到比 2-sum 问题的 TwoSumFast 和 3-sum 问题的 ThreeSumFast 快得多的算法吗?是否存在解决 2-sum 问题的线性级别的算法,3-sum 问题的线性对数级别的算法?对于 2-sum,这个问题的回答是没有(在仅允许在线性或是平方级别计算或比较这些整数的成本模型下);对于 3-sum,回答是不知道,不过专家们相信 3-sum 可能的最优算法是平方级别的。

为算法在最坏情况下的运行时间给出一个下界的思想是非常有意义的,它非常有助于指引我们追求更加有效的算法。


  1. 这个条件测试覆盖了三种情况:

    ❏ 如果二分查找不成功则会返回 -1,因此我们不会增加计数器的值;

    ❏ 如果二分查找返回的 j>i,我们就有 a[i] + a[j] = 0,增加计数器的值;

    ❏ 如果二分查找返回的 j 在 0 和 i 之间,我们也有 a[i] + a[j] = 0,但不能增加计数器的值,以避免重复计数。 ↩︎

  2. 两个 for 循环的作用是选二元组,在 N 个数中选二元组有 C(2,N)=N!/[(N-2)!2!]=N(N-1)/2 种选法。 ↩︎

标签:二分,级别,sum,算法,查找,快速,解法
From: https://www.cnblogs.com/Higurashi-kagome/p/17063673.html

相关文章

  • Consumer<T>函数式编程总结
    publicclassParent{publicvoidgetName(Stringname){System.out.println("name:"+name);}}publicclassSonextendsParent{@Ove......
  • RESTful快速学习
    REST简介REST(RepresentationalStateTransfer),表现形式转换,即访问网络资源格式传统风格资源描述形式http://localhost/user/getById?id=1http://localhost/user......
  • Vue 快速入门(二)
     1、Vue浏览器插件安装 安装地址https://devtools.vuejs.org/guide/installation.html   下载完后,直接将vuejs-devtools.crx文件拖到Chrome浏览器扩展程......
  • 17种编程语言实现排序算法-快速排序
    开源地址https://gitee.com/lblbc/simple-works/tree/master/sort/1.安卓Java版privatestaticvoidsort(int[]array){sortMe(array,0,array.length-1);......
  • 狂神说笔记——Linux快速入门27
    Linux快速入门参考于:B站狂神视频!Java开发之路:JavaSE、MySQL、前端(HTML、Css、JS)、JavaWeb、SSM框架、SpringBoot、Vue、SpringCloud、Mybatis-plus、Git、Linux(CentO......
  • 狂神说笔记——Nginx快速入门28
    Nginx快速入门在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。随着用户越来越多了,并发量慢慢增大了,此时一台服务器满足不了需求了。于......
  • Scrapy爬虫框架快速入门
    安装scrapypipinstall scrapy-ihttps://pypi.douban.com/simple/安装过程可能遇到的问题版本问题导致一些辅助库没有安装好,需要手动下载并安装一个辅助库Twisted......
  • CF622F The Sum of the k-th Powers 题解
    观前提示本题解仅提供一个理论复杂度正确的解法,因为本题模数为\(10^9+7\),没有优秀\(\text{MTT}\)板子的我被卡常了。正文部分不妨设\(S_{n,m}=\sum_{i=0}^{n-1}i^m......
  • 快速诊断I/O性能问题
    背景客户反馈最近一段时间数据库运行缓慢,磁盘的压力很大,现在有两种不同的分析结论,存储设备性能下降和数据库压力变大,请我们进行系统的分析,给一个结论。现象登录SQL专家云,进......
  • mac 安装好jmeter如何快速启动jmeter
    背景:mac安装好jmeter后每次启动时候都需要在终端敲命令进入jmsterbin文件中然后shjmeter,简直太麻烦啦!  步骤一:找jmster目录地址终端进入jamter文件中,pwd,然后复制......