算法学习笔记----判断集合S中是否存在有两个其和等于x的元素

题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。

解题思路:
直观的方法是直接计算集合中两两元素的和,然后判断是否存在x,但时间复杂度为Θ(n^2),不符合题目的要求,也不是一个好的解决问题的方法,下面两种方法要好一些:
 第一种是《算法导论》的教师手册上提供的思路,构建一个辅助集合S',通过查找辅助集合S'和原集合合并后的集合中是否有重复的元素来判断,具体步骤如下:
   1)对集合S进行排序
   2)构建辅助集合S',S'={z:z=x-y,y∈S},也就是说S'中的元素是x减去集合S中的元素生成
   3)对集合S'进行排序
   4)移除集合S中重复的元素,只保留一个,也就是说使集合S中的元素唯一。对集合S'中做同样的处理。
   5)合并集合S和S'
   6)当且仅当合并的集合中存在连续的位置上出现相同的的值时,集合S中存在两个数的和为x。(基本直译)
   这个解题思路是有问题,而且如果简单从字面意思理解的话,这个思路是错误的,在某些情况下是不正确的。下面一一列出这个思路存在的问题:
  a. 在生成辅助集合S'之后,才开始将集合S中的重复元素去掉只保留一个,这样S'中也会有同样的重复元素,为什么不在生成辅助结合S'之前做呢?如果在第1步之后做的话,S'中的元素也是唯一的了,减少重复的工作
  b. 第3步完全没有必要,因为S在第1步中已经排好序了,所以生成的S'集合也是排好序的了,只是排序的方式不同。如果集合S是升序排列,则集合S'是降序排列。所以没有必要再对集合S'排序,只需在合并的时候稍作处理即可。
  c. 第6步中的描述原文是”There exist two elements in S whose sum is exactly x if and only if the same value appears in consecutive positions in the merged output“,如果 从字面意思理解的话,就是只要合并的集合中有重复的元素就证明结合S中存在两个数的和为x。但是如果这么理解的话,是不对的,比如集合S={2,3,5, 6},x=4,       则S'={2, 1,-1,-2},合并后的集合为{-2, -1, 1, 2, 2, 3, 5, 6},合并后的结合中存在重复的元素{2, 2},位置连续并且和为x,但是集合S中并没有两个数的和        为x。所以第6步的表述是有问题,要么是真的错了,要么是语音差异理解的有问题。那要怎么才能正确地确定呢?就是在合并的集合中必须至少有两个重复的元素,这时      才能肯定集合S中存在两个数的和为x。可以
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值