分治法课堂案例(1-8未完,只有1-5,待续)

一个不知名大学生,江湖人称菜狗
original author: Jacky Li
Email : 3435673055@qq.com

Time of completion:2024.03.30
Last edited: 2024.03.30

目录

分治法课堂案例

第1关:二分搜索技术

任务描述

编程要求

测试说明

代码如下:

第2关:棋盘覆盖问题

任务描述

编程要求

输入格式

输出格式

第3关:合并排序

任务描述

编程要求

测试说明

代码如下:

第4关:快速排序

任务描述

编程要求

测试说明

代码如下:

第5关:线性时间选择问题

任务描述

相关知识

编程要求

测试说明

代码如下:

作者有言


分治法课堂案例

第1关:二分搜索技术

任务描述

本关任务:给定一组有序整数,用二分查找技术查找X是否在序列中,在则输出Yes,不在则输出No。 输入格式:三行,第一行一个整数n,第二行n个正整数,且有序;第三行是要查找的X 输出格式:X在序列中输出下标(0开始),不在输出-1

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

代码如下:

#include<iostream>
using namespace std; 
const int N = 10000; 
int BSearch(int a[], int l, int r,int x)
{
/***********Begin***************/while(l <= r)
{int mid = (l + r)/2;if(x == a[mid]) return mid;else if(x < a[mid]) r = mid - 1;else l = mid + 1;}
return -1;/***********End***************/
}
int main()
{int n,x,a[N];cin>>n;  for(int i = 0; i < n; i++)cin>>a[i];cin>>x;  cout<<BSearch(a,0,n-1,x);return 0;}

第2关:棋盘覆盖问题

任务描述

在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

,

例如:4×4的棋盘的一种覆盖方法为:

,

编写函数,输出给定k的一种棋盘覆盖。

编程要求

根据提示,在右侧编辑器补充代码。

输入格式

输入为三个正整数: size dr dc 其中(size=2k,0≤k≤5),(dr,dc)是特殊方格的位置,且0≤dr,dc≤size−1

输出格式

输出棋盘覆盖方案,特殊方格处输出-1,其他位置处同一编号的L形骨牌用同一个数字表示,数字占宽4格,右对齐。

 #include<iostream>
#include<iomanip>
# define SIZE 32
using namespace std;int tile = 0;
int Board[SIZE][SIZE];
//棋盘以(tr,tc)为左上角,以size为边长,特殊方格位置在(dr,dc),ChessBoard函数用分治法
//完成它四个子棋盘覆盖
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
/************Begin**************/if(size == 1) return ;int t = tile++, s = size/2;if(dr < tr+s && dc < tc+s) //左上角里有特殊ChessBoard(tr, tc, dr, dc, s);else{Board[tr+s-1][tc+s-1]=t;ChessBoard(tr , tc, tr+s-1, tc+s-1, s);}if(dr < tr+s && dc >= tc+s) //右上角里有特殊ChessBoard(tr,tc+s,dr,dc,s);else{Board[tr+s-1][tc+s]=t;ChessBoard(tr, tc+s, tr+s-1, tc+s, s);}if(dr >= tr+s && dc < tc+s) //左下角里有特殊ChessBoard(tr+s, tc, dr, dc, s);else{Board[tr+s][tc+s-1]=t;ChessBoard(tr+s, tc, tr+s, tc+s-1, s);}if(dr >= tr+s && dc >= tc+s) //右下角里有特殊ChessBoard(tr+s, tc+s, dr, dc, s);else{Board[tr+s][tc+s]=t;ChessBoard(tr+s, tc+s, tr+s, tc+s, s);}/************End**************/}
int main()
{/************Begin**************/int size,dr,dc;cin>>size>>dr>>dc;Board[dr][dc]=-1;ChessBoard(0,0,dr,dc,size);/************End**************/for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++)cout << setw(4) << Board[i][j];cout << endl;}
return 0;
}

第3关:合并排序

任务描述

本关任务:用合并排序方法对数组a元素排序。 输入:两行,第一行是正整数n,第二行是n个正整数 输出:排好序的一行正整数

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

代码如下:

#include<iostream> 
using namespace std;  
const int N = 1000;
/*******Begin***********/
void merge(int a[], int b[], int l, int mid, int r)
{int i = l, j = mid+1, k = 0, t = 0;while(i <= mid && j <= r){if(a[i] < a[j]) b[k ++] = a[i ++];else b[k ++] = a[j ++];}while(i <= mid) b[k ++] = a[i ++];while(j <= r) b[k ++] = a[j ++];for(i = l; i <= r; i ++){a[i] = b[t++];}}
void MergeSort(int a[], int b[], int l, int r)
{if(l < r){int mid = (l+r)/2;MergeSort(a, b, l, mid);MergeSort(a, b, mid+1, r);merge(a, b, l, mid, r);}
}/*******End***********/int main( )
{int n,a[N],b[N]; cin>>n; for(int i = 0 ; i < n; i ++)cin>>a[i]; MergeSort(a,b,0,n-1);for(int i = 0 ; i < n - 1; i ++)cout<<a[i]<<" "; cout<<a[n-1];return 0;}

第4关:快速排序

任务描述

本关任务:用快速排序方法对数组a元素排序。 输入:两行,第一行是正整数n,第二行是n个正整数 输出:排好序的一行正整数

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

平台会对你编写的代码进行测试:

测试输入: 8 4 5 3 2 9 7 1 8

预期输出: 1 2 3 4 5 7 8 9

代码如下:

#include<iostream>  
using namespace std;  
const int N = 1000;/**************Begin*********/
void QuickSort(int a[], int l, int r)
{// if(l >= r) return;// int m = a[l], i = l, j = r;// while(i < j)// {//     while(i < j && a[i] <= m) i ++;//     while(i < j && a[j] >= m) j --;//     swap(a[i], a[j]);// }// swap(m, a[i]);// QuickSort(a, l, i-1);// QuickSort(a, j+1, r);if(l >= r) return;int m = a[l], i = l, j = r;while(i < j){while(i < j && a[j] >= m) j --;a[i] = a[j];while(i < j && a[i] <= m) i ++;a[j] = a[i];}a[i] = m;QuickSort(a, l, i-1);QuickSort(a, j+1, r);
}/**************End*********/
int main( )
{int n,a[N]; cin>>n; for(int i = 0 ; i < n; i ++)cin>>a[i]; QuickSort(a,0,n-1);for(int i = 0 ; i < n - 1; i ++)cout<<a[i]<<" "; cout<<a[n-1];return 0;}

第5关:线性时间选择问题

任务描述

给定线性无序数组n个元素和一个正整数k,1≤k≤n,要求在线性时间找到这n个元素的第k小。

相关知识
  1. 排序求第K个元素。由于排序算法的时间复杂度都在O(nlogn),因此不满足线性时间要求。
  2. 借用快速排序中的划分Partition思想,选一个基准元素,将比基准元素小的放到左侧,比基准元素大的放到右侧,如果基准元素的位置是j,则比较k与j的大小:
  • k==j 则基准元素刚好是第k小元素,返回
  • k<j 则第k小在左侧,对左侧递归找第k小
  • k>j 则第k小在右侧,对右侧递归找第j-k小
  1. 该方法效率取决于每次选择的基准元素,如果基准元素能将数组每次分成ϵn1−ϵn0<ϵ<1)两部分,则能在线性时间完成找第k小任务;如果每次选择基准元素是最大值或最小值,则退化成最坏情况,时间复杂度为O(n2)
  2. 问题的关键变成如何在线性时间找一个基准元素,能将数组划分成ϵn1−ϵn0<ϵ<1)两部分.思想如下:
  • 将所有元素每5个一组,分成n/5组,将每组的中位数找到
  • 以所有中位数的中位数做为基准元素
编程要求

完成一个冒泡排序函数:

  1. void BubbleSort(Type a[],int p,int r)

完成根据基准元素x进行划分的函数:

  1. int Partition(int a[],int p,int r,Type x)

完成线性时间选择数组a[p]~a[r]的第k小函数:

  1. int Select(int a[],int p,int r,int k)
  • 数组元素个数小于等于75时,直接用冒泡排序,返回第k小
  • 数组元素个数大于等于75时,调用Select函数,返回第k小
测试说明
  • 函数中数组的元素是整型,返回值也是整型。

  • 输入的数组元素是整型,且不重复。 主函数如下:

    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int a[1000]={0},n,k;
    6. cin>>n;
    7. for(int i = 0; i < n; i ++)
    8. cin>>a[i];
    9. cin>>k;
    10. cout<<Select(a,0,n-1,k)<<endl;
    11. return 0;
    12. }
  • 直接完成要求函数即可,输入输出由隐藏主函数完成。

代码如下:

void Swap(int &a,int &b)
{//交换函数/*********begin************/int c;c = a;a = b;b = c;/*********end************/
}int Partition(int a[],int p,int r,int x)
{//以x为基准划分函数/*********begin************/int i = p, j = r;while(i < j){while(i < j && a[i] < x) i ++;while(i < j && a[j] > x) j --;Swap(a[i], a[j]);}return i;/*********end************/
}void BubbleSort(int a[],int p,int r)
{//冒泡排序/*********begin************/for(int i = p + 1; i <= r; i ++){for(int j = p; j < r - 1; j ++){if(a[j] > a[j + 1]){swap(a[j], a[j + 1]);}}}// int i=0;// while(i<=r-p)// {//     for(int j=p;j<=r-i-1;j++)//     {//         if(a[j]>a[j+1]) Swap(a[j],a[j+1]);//     }//     i++;// }/*********end************/}
int Select(int a[],int p,int r,int k)
{/*********begin************/if (r - p < 75){BubbleSort(a, p, r);return a[p + k - 1];}for (int i = 0; i <= (r - p - 4) / 5; i++){int pp = p + i * 5, rr = p + 5 * i + 4;BubbleSort(a, pp, rr);int mid = (rr - pp + 1) / 2 + pp;Swap(a[mid], a[p + i]);}int x = Select(a, p, p + (r - p - 4) / 5, (r - p - 4) / 10 + 1);int i = Partition(a, p, r, x);int len = i - p + 1;if (k <= len){return  Select(a, p, i, k);}else{return Select(a, i + 1, r, k - len);}/*********end************/
}

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】Flink学习笔记

文章目录 认识FlinkDocker安装Flink基本概念Flink的特点Flink 和 Spark Streaming 对比 基本使用WordCount实现依赖 批模式代码流模式代码网络流模式代码在web UI上提交代码创建项目[^1]编写代码配置打包在Web UI上提交 Flink 架构系统架构核心概念并行度算子链(Opeartor Chain…

一次性了解C语言中文件和文件操作

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文件及文件操作 前言1. 文件分类1.1 文本文件1.2 二进制文件1.3 文本文件和二进制文件的区别 2…

基于哈希槽的docker三主三从redis集群配置

目录 一、三主三从redis集群配置 1、关闭防火墙启动docker后台服务 2、新建6个docker容器redis实例 3、进入容器redis-node-1为6台机器构建集群关系 3.1进入容器 3.2构建主从关系 4、查看集群状态 4.1链接进入6381作为切入点 二、主从容错切换迁移按例 1、数据读写存储…

Shell脚本基础 以及 变量和引用

目录 Shell脚本基础 Shell的基本元素 Shell脚本规范 Shell脚本编写方式 交互式执行 作为程序文件执行 Shell脚本执行方式 bash for_test.sh sh for_test.sh ./for_test.sh source for_test.sh Shell退出状态 变量和引用 什么是变量 变量的命名 变量的作用范围 …

数据库原理(含思维导图)

数据库原理笔记&#xff0c;html与md笔记已上传 1.绪论 发展历程 记住数据怎么保存&#xff0c;谁保存数据&#xff0c;共享性如何&#xff0c;独立性如何 人工管理阶段 数据不保存应用程序管理数据数据不共享数据不具有独立性 文件系统阶段 数据可以长期保存文件系统管…

设计模式(6):桥接模式

一.桥接模式核心要点 处理多层继承结构&#xff0c;处理多维度变化的场景&#xff0c;将各个维度设计成独立的继承结构&#xff0c;使各个维度可以独立的扩展在抽象层建立关系。 \color{red}{处理多层继承结构&#xff0c;处理多维度变化的场景&#xff0c;将各个维度设计成独立…

最好的超声波清洗机排行榜有哪些?好评爆表超声波清洗机盘点

在如今这个视觉为王的时代&#xff0c;一副清晰的眼镜不仅是视力矫正的工具&#xff0c;更是提升形象的重要配饰。然而&#xff0c;眼镜的日常清洁往往让人头疼&#xff0c;传统的清洗方法既费时又难以彻底去除镜片上的污渍和细菌。这时&#xff0c;一台高效的超声波清洗机便成…

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的6个默认成员函数 ​编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…

module ‘numpy‘ has no attribute ‘int‘

在 NumPy 中&#xff0c;如果遇到了错误提示 "module numpy has no attribute int"&#xff0c;这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始&#xff0c;numpy.int 已经不再是一个有效的属性&#xff0c;因为 NumPy 不再推荐使用…

软考 - 系统架构设计师 - 构件组装技术

概念 构件组装是将库中的构件经修改后相互连接&#xff0c;或者将它们和当前开发项目中的软件元素进行连接&#xff0c;最终构成新的目标构件。 构件组装技术是基于构件的软件开发的核心技术&#xff0c;也是构件技术研究的重点和难点。构件组装的目的是利用现有的构件组装成新…

西门子触摸屏SMART 700 IE V3数据记录的记录周期

问题的提出 需要解决的问题&#xff1a;目前我使用的工况是记录2s内速度变化情况&#xff0c;大概需要记录100个点&#xff0c;时间间隔或者说周期还是挺小的。 PLC端 S7-200的编程过程中&#xff0c;这个用填表程序add_to_table指令完成了&#xff0c;但是记录过程最多只能…

Chrome base 库详解:工具类和常用类库

Chrome浏览器使用了一个强大的库名为base&#xff0c;它包括了许多工具类和常用类库&#xff0c;以支持Chrome的底层功能和性能优化。在本文中&#xff0c;我们将详细阐述base库中的每个子项&#xff0c;并提供示例代码来展示其用法。 base 库的基本结构 Chrome的base库是一个…

ActiveMQ Artemis 系列| High Availability 主备模式(消息复制) 版本2.33.0

一、ActiveMQ Artemis 介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理,它完全符合 Java Message Service (JMS) 2.0 规范,并支持多种通信协议,包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foundation 开发和维护,旨在提供可靠…

数字乡村发展之路:探索农村智慧化新模式

一、引言 随着信息技术的迅猛发展和普及&#xff0c;数字化已经成为推动乡村发展的重要引擎。数字乡村建设旨在通过信息化、智能化手段&#xff0c;提升农村地区的生产生活水平&#xff0c;推动农村经济社会的转型升级。本文旨在探讨数字乡村的发展之路&#xff0c;分析农村智…

BabyAGI源码解读(2)-核心agents部分

话不多说&#xff0c;我们直接进入babyAGI的核心部分&#xff0c;也就是task agent部分。 1. 创建任务agent 这一段代码的任务是创建一个任务&#xff0c;这个函数有四个参数 objective 目标result 结果&#xff0c;dict类型task_list 任务清单task_descritption 任务描述 …

【MySql】利用DataX同步mysql数据,多数据源数据同步方案

你说你知道他们的世界 悲歌三首买一切 买昆仑落脚 蓬莱放思想 买人们的争执酿酒汤 买公主坟的乌鸦 事发之木和东窗之麻 买胭脂河里船行渔歌 黄金世界中万物法则 你我都一样 将被遗忘 郭源潮 你的病也和我的一样 风月难扯 离合不骚 层楼终究误少年 自由早晚乱余生 你我山前没相见…

iOS开发进阶之列表加载图片

iOS开发进阶之列表加载图片 列表加载图片通常使用UITableView或UICollectionView&#xff0c;由于列表中内容数量不确定并且对于图片质量要求也不确定&#xff0c;所以对于图片加载的优化是很有必要的。 首先借鉴前文&#xff0c;我们逐步进行操作&#xff0c;以下是加载1000…

基于springboot实现数据库的加解密

项目地址 https://github.com/Chenchicheng/spring-ibatis-encryption 功能说明 支持使用注解的方式目标类进行加解密支持同一个类多个字段分别使用不同的加密方式支持自定义加密方法 本地调试 pull代码到本地&#xff0c;更换application.yml中的数据库用户名和密码&…

nginx用法以及核心知识详解-可以当作使用nginx的操作手册

前言 nginx的使用真的是非常简单&#xff0c;下载下来解压运行就可以&#xff0c;配置都是再conf文件夹的里的nginx.conf文件里配置&#xff0c;所以对于nginx的上手使用&#xff0c;nginx.conf文件里字段的含义是需要掌握的&#xff0c;然后就是一些nginx的常见问题 nginx核心…