408计算机考研--数据结构--2016年统考真题(C语言)

本文讨论了如何设计一个算法,以最小化集合A的两个不相交子集A1和A2的元素数量差,并最大化它们的元素之和的差值。提出了两种策略:一是基于排序的暴力方法,二是采用枢轴划分法。排序法的时间复杂度为O(nlog2n),空间复杂度为O(1),而枢轴划分法平均时间复杂度为O(n),空间复杂度同样为O(1)。文章给出了C语言实现的枢轴划分算法详细步骤。
该文章已生成可运行项目,

408数据结构–2016年统考真题(C语言)

一、题目描述

已知由n(n>=2)个正整数构成的集合A={ak|0<=k<n},将其划分为两个不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2中的元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大。要求:

  1. 给出算法的基本设计思想。
  2. 根据设计思想,采用C或C++语言描述算法,关键之处给出注释
  3. 说明你所设计的算法的平均时间复杂度和空间复杂度。
二、解决思路

1. 暴力法–排序
直接采用时间复杂度较好的排序算法,比如快速排序,排序之后根据数组元素个数划分,若数组元素个数为奇数,则S2集合比S1多划分一个数据元素,此时|n1-n2|=1;若数组元素个数为偶数,则S2集合和S1数据元素个数相同为数组元素个数的一半,此时|n1-n2|=0.该方法的时间复杂度为:O(nlog2n)、空间复杂度为O(1).
2.枢轴划分法
由题意知,将最小的n/2(向下取整)个元素放在A1中,其余的元素放在A2中,分组的结果即可满足题目要求。仿照快速排序的思想,基于枢轴将n个整数划分为两个子集。根据划分后枢轴所处的位置i分别处理:
① 若i=n/2(向下取整),则分组结束,算法结束
② 若i<n/2(向下取整),则枢轴及之前的所有元素均属于A1,继续对i之后的元素进行划分。
③ 若i>n/2(向下取整),则枢轴及之后的所有元素均属于A2,继续对i之前的元素进行划分。
基于该设计思想实现的算法,无须对全部元素进行排序,其平均时间复杂度是O(n),空间复杂度是O(1)。
算法实现:

int setPartition(int a[],int n){
   
   
	int pivotkey,low=
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值