7.12 子集和问题和后期预告

【问题描述】给定一个整数的集合 S 和一个整数 X,问是否存在 S 的一个子集满足其中所有元素的和为 X。
【分析】
子集和问题是一个 NPC 问题,与 0/1 背包问题并不相同。
这个问题有一个时间复杂度为 O(2^N/2)的较高效的搜索算法,其中 N 是集合 S 的大小。
第一步思想是二分。将集合 S 划分成两个子集 S1和 S2,它们的大小都是 N/2。对于 S1和 S2,分别枚举出它们所有的 2N/2 个子集和,保存到某种支持查找的数据结构中(如散列表)。然后就要将两部分结果合并,寻找是否有和为 X 的 S 的子集。事实上,对于 S1的某个和为 X1 的子集,只需寻找 S2 是否有和为 X-X1 的子集。假设采用的散列表是理想的,每次查找和插入都仅花费 O(1)的时间。两步的时间复杂度显然都是 O(2^N/2)。
实践中,往往可以先将第一步得到的两组子集和分别排序,然后再用两个指针扫描的方法查找是否有满足要求的子集和。这样的实现,在可接受的时间内可以解决的最大规模约为 N=42。

预告 

第八单元 排序算法................ 85
8.1 常用排序算法 ................. 85
8.2 简单排序算法 ................. 87
8.3 线性时间排序 ................. 88
8.4 使用二叉树的排序算法*.......... 89
8.5 小结 ........................ 90
第九单元 基本数据结构 ............ 91

9.1 线性表(顺序结构) .............91
9.2 线性表(链式结构) .............91
9.3 栈 .............

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值