给定N个整数集合是否存在两个其和刚好为指定常数的元素
又一次学习一遍<算法导论>,看到了这个问题:
描写叙述一个执行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和还有一个整数 X 时,推断出S中是否存在有两个其和刚好等于 X 的元素。
Solution:
(1)->对整个集合进行排序,能够用快排(含有小文件策略、三者取中策略)。时间复杂度O(nlogn)。形成一个数组A[n]。
->设定两个下标pBegin和pEnd,分别指向数组A[n]的头尾。pBegin = 0。pEnd
 = n -1。
->若(A[pBegin] +A[pEnd])==
 X,找到元素对;
->若(A[pBegin]
 +A[pEnd])> X。则表示所需的元素相应该要小一些,对于已经排好序的非降序数组,仅仅须要将--pEnd就可以;
->若(A[pBegin]
 +A[pEnd])< X,则表示所需的元素相应该要大一些,仅仅须要将++pBegin就可以;
->直到 pBegin
  == pEnd 。总共的时间复杂度为O(nlogn+n),空间复杂度O(1)。
证明的思路:利用反证法。假如 (A[m] + A[k] )== X。初始化时,pBegin <= m。pEnd >= k。
首先证明在移动过程中pBegin 不可能大于m。假如pBegin 大于m,则在ipBegin 大于m之前。必有pBegin 必会有一次等于m,当pBegin 等于m时,pEnd 是大于k的,这时的A[pBegin]
 + A[pEnd] > X,所以pBegin 会一直停留在m处,直到pEnd 移动到k为止。所以pBegin 不会移动超过m。
同理能够证明pEnd 不会小于k,算法是正确。
(2)->对于较小的X。能够考虑利用Hash的思路。直接声明一个大小为X的数组S[X],初始化所有元素为0。
消耗X个辅助空间。
->遍历一次集合,对于全部小于等于X的元素k,令S[k]++。时间复杂度n;
->遍历数组S[X],对于不为0的元素下标m(S[m]!=0),查看S[X-m]是否为0。若m == X-m。查看S[m]>=2是否为真。
->总共的时间复杂度为O(X+n),空间复杂度O(X)。可是是在X较小的情况下。
->同一时候这种方法能够找出全部的元素对!
拓展问题:
(1)是否存在三个元素之和正好等于给定值X?
【假如 A[m]+A[k]+A[s] == X。对于全部元素i,是否在集合S(除去i)中有两个元素之和等于 X-A[i]。n个元素相应n个上述的两个元素和的子问题。时间复杂度应该是O(nlogn+n^2)】不知是否有更好的思路?
(2)给定n个整数的集合S。输出集合S中全部满足 a+b=c 的整数a、b、c。
【类似1的解法。事实上就是 a+b-c=0的变形】
给定N个整数集合是否存在两个其和刚好为指定常数的元素的更多相关文章
- 跟着大彬读源码 - Redis 10 - 对象编码之整数集合
		
[TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...
 - 设计算法,求AB两个整数集合的交集
		
[本文链接] http://www.cnblogs.com/hellogiser/p/ab-set-intersection.html [分析] 思路1:排序法 对集合A和集合B进行排序(升序,用快排 ...
 - 对于给定的整数集合S,求出最大的d,使得a+b+c=d。
		
对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...
 - 79  两个整数集合A和B,求其交集
		
[本文链接] http://www.cnblogs.com/hellogiser/p/ab-intersect.html [题目] 两个整数集合A和B,求其交集. [分析] 1. 读取整数集合A中 ...
 - C++程序设计实践指导1.5求两个整数集合并集改写要求实现
		
改写要求1:改写为单链表结构可以对任意长度整数集合求并集 #include <cstdlib> #include <iostream> using namespace std; ...
 - 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
		
描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...
 - redis 系列8 数据结构之整数集合
		
一.概述 整数集合(intset)是集合键的底层实现之一, 当一个集合只包含整数值元素,并且这个集合元素数量不多时, Redis就会使用整数集合作为集合键的底层实现.下面创建一个只包含5个元素的集合键 ...
 - Redis实现之整数集合
		
整数集合 整数集合(insert)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.举个栗子,如果我们创建一个只包含五个 ...
 - Redis 的底层数据结构(整数集合)
		
当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现结构相对复杂并且会分配较多的内存空间. ...
 
随机推荐
- correlated subquery and non-correlated subquery
			
子查询:嵌套在其他查询中的查询称之. 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询). 所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查 ...
 - mysql常用操作(转自阿铭linux)
			
在前面两个章节中已经介绍过MySQL的安装了,但是光会安装还不够,您还需要会一些基本的相关操作.当然了,关于MySQL的内容也是非常多的,只不过对于linux系统管理员来讲,一些基本的操作已经可以应付 ...
 - 监控工具zabbix
			
1 安装zabbixyum install -y epel-release安装rpm包的lamp环境 yum install httpd mysql mysql-libs php php-mysql ...
 - (转)union和union all的区别
			
Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个s ...
 - Jquery对选取到的元素显示指定的长度,对于的字符串用“...”显示
			
$(function() { $(".video_name").each(function() { var s = $(this).text(); $()); }); }); fu ...
 - C#定义委托函数实现在别的窗体中操作主窗体中的SerialPort控件
			
1.在主窗体(含有serialPort的窗体)中 //先定义委托 public delegate void OpenPort(); public delegate void ClosePort(); ...
 - web worker使用
			
使用postMessage()方法传递信息.来自Worker的数据保存在event.data中.通过message和error事件与页面通信. <script> var data = [4 ...
 - 转载:js和jquery获取父级元素、子级元素、兄弟元素的方法
			
转载网址: 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元 ...
 - python bottle使用多个端口(多个进程)提高并发
			
我的程序是用python结合bottle框架写的,但bottle自带wsgi原本只是单进程单线程运行模式(Bottle 默认运行在内置的 wsgiref 服务器上面.这个单线程的 HTTP 服务器在开 ...
 - JAVA单元测试Junit
			
1.为什么要用Junit 做了很多项目,几乎没怎么用过Java的单元测试,是因为它没有用吗?显然不是,是自己的开发方式太不规范!对于大型的软件项目,单元测试不仅有效实用,还非常有必要!它能够测试每个方 ...