分治法课堂案例(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、数据读写存储…

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

在如今这个视觉为王的时代&#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 不再推荐使用…

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

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

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

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

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

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

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

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

.NET CORE 分布式事务(三) DTM实现Saga及高并发下的解决方案

目录(结尾附加项目代码资源地址) 引言&#xff1a; 1. SAGA事务模式 2. 拆分为子事务 3. 失败回滚 4. 如何做补偿 4.1 失败的分支是否需要补偿 5. 异常 6. 异常与子事务屏障 6.1 NPC的挑战 6.2 现有方案的问题 6.3 子事务屏障 6.4 原理 7. 更多高级场景 7.1 部分…

vue3+threejs新手从零开发卡牌游戏(二十二):添加己方游戏流程(先后手、抽牌、主要阶段、战斗阶段、结束阶段)

首先在utils/common.ts里定义一些流程相关的变量&#xff1a; const flow ref([ // 游戏流程{name: "抽卡阶段"},{name: "主要阶段"},{name: "战斗阶段"},{name: "结束阶段"}])const flowIndex ref(0) // 当前流程const currentPla…

[C++初阶] 爱上C++ : 与C++的第一次约会

&#x1f525;个人主页&#xff1a;guoguoqiang &#x1f525;专栏&#xff1a;我与C的爱恋 本篇内容带大家浅浅的了解一下C中的命名空间。 在c中&#xff0c;名称&#xff08;name&#xff09;可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大&#xff0c;名称…

什么是gif? 如何把视频格式转成gif动图格式?展现动图的魅力

一&#xff0c;什么是gif格式 gif是一种位图图形文件格式&#xff0c;主要用于显示索引彩色图像。gif格式在1987年由CompuServe公司开发&#xff0c;它采用LZW&#xff08;Lempel-Ziv-Welch&#xff09;无损压缩算法&#xff0c;这种算法可以有效地减少图像文件在网络上传…

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称&#xff0c;然后选择 "Manage NuGet Packages"&#xff08;管理 NuGet 包&#xff09;。N…

【C++】 vector 数组/向量

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

蚂蚁新村3.30答案:“秀女拈针锦线长,纤纤玉指领馨香”说的是哪一项非遗技艺

蚂蚁新村是一个虚拟社区。在这个虚拟社区中&#xff0c;用户可以参与各种活动&#xff0c;比如生产能量豆、做慈善捐赠等。同时&#xff0c;蚂蚁新村也提供了一些知识问答环节&#xff0c;用户在参与的过程中可以增进知识。这些问答内容往往涉及广泛的主题&#xff0c;如文化、…

iOS - Runtime - Class-方法缓存(cache_t)

文章目录 iOS - Runtime - Class-方法缓存(cache_t)1. 散列表的存取值 iOS - Runtime - Class-方法缓存(cache_t) Class内部结构中有个方法缓存&#xff08;cache_t&#xff09;&#xff0c;用散列表&#xff08;哈希表&#xff09;来缓存曾经调用过的方法&#xff0c;可以提高…

Python3:ModuleNotFoundError: No module named ‘elftools‘

问题背景 问题 ModuleNotFoundError: No module named ‘elftools’ 解决方法 pip3 install pyelftools 成功&#xff01;&#xff01;&#xff01;