目录

  • 一、问题描述
  • 二、实现思路
  • 三、解题代码
  • 四、运行结果

一、问题描述

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

二、实现思路

  在划分算法中,集合A的元素都为正整数,则只需要找到中位数,以中位数为界,将小于中位数的部分归为一个集合,大于等于中位数包括中位数在内的归为另外一个集合。此时,|n1-n2|等于0(数组元素个数为奇数)或1(数组元素个数为偶数),且|S1-S2|最大。很简单的做法就是对数组进行排序,随后输出。但这样基于排序的时间复杂度至少是O(nlogn)(快速排序)。这里注意,由于只需要将数组分割,分割的集合不要求有序,所以只需找到这样一个元素(轴枢),它可以将数组一分为二:该元素之前的元素小于它,该元素之后的元素都大于等于它。如该元素的位置恰好是中央,则划分操作结束。
  算法实现具体步骤为:

  1. 选择轴枢元素,进行一趟划分,得到轴枢元素的准确位置;
  2. 将轴枢元素位置和数组中央进行比较,如轴枢元素不位于中央,递归处理左(或右)半数组,直至所得元素位置恰好位于数组中央。

  对 n+(1/2)n+(1/4)n+(1/8)n+…,取极限得到O(n),则本算法时间复杂度为O(n)。空间复杂度为O(1)。

三、解题代码

#include <iostream>using namespace std;
#define MaxSize 20000/*一趟划分*/
int partition(int R[], int low, int high)
{int temp = R[low];   //以R[low]为基准while (low<high)      //从两端交替向中间扫描{while (low < high&&R[high] >= temp) //逆向查找首个小于枢轴的元素{high--;}R[low] = R[high];  //将小于枢轴的元素交换到低端while (low < high&&R[low] <= temp)//正向查找首个大于枢轴的元素{low++;}R[high] = R[low]; //将大于枢轴的元素交换到高端}R[low] = temp; //枢轴元素置于正确的位置return low;       //返回枢轴元素的位置
}/*查找n/2,数组以n/2排序,将序列分成[0...n/2)和[n/2...n)*/
void Divide(int arr[], int n)
{int low = 0, high = n - 1;int mid = -1;       //[0...mid) [mid...n)while (low < high){mid = partition(arr, low, high);if (mid == n / 2) //循环终止条件,当mid位于数组中央时break;else if (mid < n / 2) //在右半部分查找{low = mid + 1;}else //在左半部分查找 {high = mid - 1;}}}/*输出数组a[start...end]*/
void OutputArray(int a[], int start, int end)
{int i;for (i = start; i <= end - 1; i++){printf("%d ", a[i]);}printf("%d\n", a[i]);
}int main()
{int n = 0;int a[MaxSize];cout << "请输入由正整数构成的集合元素总数: ";cin >> n;cout << "请依次输入集合元素: ";for (int i = 0; i < n; i++){cin >> a[i];}Divide(a, n);cout << "\n划分子集A1:";OutputArray(a, 0, n / 2 - 1);cout << "        A2:";OutputArray(a, n / 2, n - 1);
}

四、运行结果

整数集合划分且满足|n1-n2|最小且|S1-S2|最大相关推荐

  1. golang 数组组合成最小的整数_Redis之整数集合底层实现

    1.整数集合简述 整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.例如当我们创建只包含五个元素的集合键,并且集 ...

  2. 数据结构与算法:13 字符串与整数集合

    13 字符串与整数集合 知识点: 1. 字符串 我们古人没有电影电视,没有游戏网络,所以文人们就会想出一些文字游戏来娱乐.比如宋代的李禺写了这样一首诗:"枯眼望遥山隔水,往来曾见几心知?壶空 ...

  3. [redis设计与实现][5]基本数据结构——整数集合

    整数集合(intset)用于集合键.当一个集合只包含整数值元素,并且数量不多的时候,会使用整数集合作为集合键的底层实现.相对于直接保存字符串,整数集合能够很好地节约内存,但是由于是数组保存,需要特别关 ...

  4. Redis源码剖析(十三)整数集合

    Redis提供一种叫整数集合的数据结构,当数据中只包含整数,并且数据数量不多时,Redis便会采用整数集合存储 Redis保证整数集合有以下几个特性 所含元素全是整数,且不重复 内部元素有序,通常是会 ...

  5. redis——数据结构(整数集合,压缩列表)

    4.整数集合 整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 可以保存 int16_t . int32_t . int64_t 的整数值, 并且保证集合中不会出现重复元素. ...

  6. c语言n1.n2%,C语言题库填空.doc

    C语言题库填空.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所得收入 ...

  7. 集合划分讲解-And-2021年ACM竞赛班训练(九)2021.5.20-问题 E: 登上火星-题解

    集合划分 集合划分,把 n n n个数分成 k k k个集合,不能包含空集,所有的划分数量记为斯大林数,用 S ( n , k ) S(n,k) S(n,k)表示. 目前斯大林数没有直接的公式,但是有 ...

  8. c语言n1=(n2=(n3=0)),计算机二级C语言考试选择题(带答案)

    C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.全国计算机等级考试有二级c语言这个考试的项目.2016年的计算机等级考试即将到来了,同学们复习的怎么样了?下面是一份相关的 ...

  9. 为什么整数集合使用Z来表示?

    简 介: 讨论了一个有趣的问题:数学上不同数域的字母表示的来历,特别是对于整数使用Z这个奇怪的Z表示来历进行说明. 关键词: 数域,集合 #mermaid-svg-etOYlAdY88rp3TGV . ...

  10. Redis学习之intset整数集合源码分析

    1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 ...

最新文章

  1. Python3 MySQL 数据库连接 - PyMySQL 驱动
  2. (详细讲解)配置Pycharm连接服务器跑本地代码
  3. byte数组和hexstring互相转换
  4. [projectEuler.net]12
  5. 华夫饼为什么不松软_用了3年的华夫饼配方,掌握这个配比,外酥里软超,比蛋糕好吃...
  6. 8.0强行转换后变成了7_【建筑通】钻孔灌注桩后注浆施工工艺介绍
  7. vue 绑定图片相对路径
  8. Play框架的用户验证。
  9. DotNet软件开发框架
  10. 【剑指offer - C++/Java】9、变态跳台阶
  11. matplotlib设置colorbar字体大小
  12. 石子合并问题--直线版(Hrbust-1818)
  13. idea json转为对象_数据存储—JSON
  14. MySQL练习题和代码附录
  15. 【译】Tim Rose 的kibana插件教程-自定义App插件
  16. 前沿 | IBM语音识别已接近人类水平
  17. Servlet — 如何让服务器控制浏览器10秒后跳转到另一个页面
  18. Unity3D:粒子特效(Particle System)播放序列帧动画
  19. 科研工具:公式书写神器(Mathpix Snipping Tool)
  20. windows 7 旗舰版下,安装vs2010旗舰版终于成功!

热门文章

  1. word文档图片画红线_Word文档怎么在图片内画线?
  2. 在计算机编程里pi是什么意思,编程中的术语“钩子”是什么意思?
  3. 云计算与大数据技术应用 第二章
  4. 使用Go语言解析多点触摸协议(MIT)TypeB由ADB调试产生的数据
  5. CS5211/eDP转LVDS转换器方案设计电路图
  6. 打开ps显示计算机内存不足怎么办,电脑PS提示内存不足怎么解决
  7. google搜索自己博客文章小记
  8. 公链、私链、联盟链、侧链简介
  9. 2022茶艺师(初级)试题及在线模拟考试
  10. 数独游戏技巧从入门到精通_免费教学视频数独阶梯训练让孩子从入门到精通,数学思维直线上升!...