当前位置: 首页 > news >正文

【2016年数据结构真题】

image.png

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

1) 给出算法的基本设计思想。

2) 根据设计思想,采用C或C++语言描述算法,关键之处给出注释。

3) 说明你所设计算法的平均时间复杂度和空间复杂度。

// 方法一;对整个数组进行排序,然后再将整个数组等分为两份,此时因为利用的是选择排序,所以时间复杂度为O (n^2)
int setpartition(int[] a, int n)
{Selectsort(a, 0, n - 1);int s1 = 0, s2 = 0; //S1,S2表示数组的前半部分和后半部分之和for (int i = 0; i < n / 2; i++)s1 += a[i];for (int i = n / 2; i < n; i++)s2 += a[i];return s2 - s1;
}
void Selectsort(int[] a, int n)
{ //对长度为n的数组a进行选择排序for (int i - 0; i < n - 1; i++){int min = i; //表示本轮次排序中的最小值所在的数组下标for (int j = i + 1; j < n; j++){if (a[j] < a[min])min = j;}int temp = a[i];a[i] = a[min];a[min] = temp;}
}

算法的基本设计思想

  1. 由题意知,将最小的 n/2 (向下取整) 个元素放在A1中,其余的元素在A2中,分组结果即可满足题目要求。仿照快速排序的思想,基于枢轴将个整数划分为两个子集。根据划分后枢轴所处的位置i分别处理:

    • 若i= n/2 (向下取整) ,则分组完成,算法结束;
    • 若i< n/2 (向下取整) ,则枢轴及之前的所有元素均属于 A1,继续对 i之后的元素进行划分
    • 若i> n/2 (向下取整) ,则枢轴及之后的所有元素均属于 A2,继续对 i之前的元素进行划分

基于该设计思想实现的算法,无须对全部元素进行全排序,其平均时间复杂度是 O(n) 空间复杂度是 0(1)

法二

int setPartition(int a[], int n)
{int pivotkey, low = 0, low0 = 0, high = n - 1, high0 = n - 1, flag = 1, k = n / 2, i;int s1 = 0, s2 = 0;while (flag){pivotkey = a[low]; //选择枢轴while (low < high) //基于轴对数据进行划分{while (low < high && a[high] >= pivotkey)--high;if (low != high)a[low] = a[high];while (low < high && a[low] <= pivotkey)++low;if (low != high)a[high] = a[low]; //end of while(low<high)a[low] = pivotkey;if (low == k - 1) //如果枢纽是第n/2个元素。划分成功flag = 0;else //是否继续划分{if (low < k - 1){low0 = ++low;high = high0;}else{high0 = --high;low = low0;}}}for (i = 0; i < k; i++)s1 += a[i];for (i = k; i < n; i++)s2 += a[i];return s2 - s1;}
}

相关文章:

  • DQL、DML、DDL、DCL的概念与区别
  • 家用小型洗衣机哪款性价比高?婴儿专用洗衣机推荐
  • 二百零三、Flume——Flume实时采集数据频率为1s的高频率Kafka数据直接写入ODS层表的HDFS文件路径下
  • 三行Python代码即可将视频转Gif
  • ASP.NETWeb开发(C#版)-day1-C#基础+实操
  • 【SA8295P 源码分析 (三)】121 - MAX9295A 加串器芯片手册分析 及初始化参数分析
  • 在 HarmonyOS 上实现 ArkTS 与 H5 的交互
  • LeetCode-2760. 最长奇偶子数组-滑动窗口暴力
  • 基于Matlab+ AlexNet神经网络的动物识别系统
  • 基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
  • Windows客户端开发框架WPF简介
  • 3.5 Windows驱动开发:应用层与内核层内存映射
  • 二维码智慧门牌管理系统升级解决方案:实现服务状态实时监控
  • JPA概述
  • OceanBase杨冰:完全自研,才能逢山开路遇水搭桥
  • Druid 在有赞的实践
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaWeb(学习笔记二)
  • Java精华积累:初学者都应该搞懂的问题
  • magento2项目上线注意事项
  • Rancher如何对接Ceph-RBD块存储
  • supervisor 永不挂掉的进程 安装以及使用
  • windows-nginx-https-本地配置
  • 配置 PM2 实现代码自动发布
  • 异步
  • 你对linux中grep命令知道多少?
  • ionic异常记录
  • scrapy中间件源码分析及常用中间件大全
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • %@ page import=%的用法
  • (C#)获取字符编码的类
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)Linux——Linux常用指令
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • ... 是什么 ?... 有什么用处?
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 设置默认首页
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .sh 的运行
  • @Transactional 竟也能解决分布式事务?
  • [ 第一章] JavaScript 简史
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [4.9福建四校联考]
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Angularjs]ng-select和ng-options