算法设计:实验一分治与递归

【实验目的】

深入理解分治法的算法思想,应用分治法解决实际的算法问题。

【实验内容与要求】

设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:

  1. 1.每个选手必须与其他n-1个选手各赛一次;
  2. 2.每个选手一天只能赛一次;
  3. 3.循环赛一共进行n-1天。按此要求可将比赛日程表设计成有n行和n列的一个表。表中第一列是选手编号,表中第i行和第j列(j>1)处填入第i个选手在第j天所遇到的选手。例如8个选手的日程表安排如右图所示。

要求:请设计算法,并采用C或C++语言编写程序实现上述功能,调试运行并对算法的时间复杂度进行分析。

【算法思想及处理过程】

分治法是一种解决问题的算法设计策略,其基本思想是将一个大问题分解成若干个规模较小且相互独立的子问题,然后分别解决这些子问题,最后将子问题的解合并起来得到原问题的解。其一般步骤包括:

1. 分解(Divide):将原问题分解成若干个规模较小的子问题,子问题的规模通常是原问题规模的一部分。

2. 解决(Conquer):递归地解决子问题。如果子问题足够小,则直接求解;否则,继续将子问题分解为更小的子问题。

3. 合并(Combine):将子问题的解合并起来,得到原问题的解。

在该问题中,使用分治法生成比赛日程表,其算法步骤如下:

1. 分解:将所有选手分成两组,每组包含一半的选手。这样就把原问题分解成了两个规模较小的子问题,即每个分组内的选手需要生成比赛日程表。

2. 解决:递归地对每个分组的选手生成比赛日程表。如果分组内的选手数量大于 2,则继续递归;否则,直接给出两位选手的比赛日程。

3. 合并:将子问题的解合并起来,即填充下半部分的日程表。根据上半部分的日程表填充下半部分,确保每个选手都能与其他所有选手进行一次比赛。

其下图为getday函数的流程图:

对于每对选手(i,j),它们的比赛日程被设置为i与j的初始日程加上一定的偏移量。这个偏移量是选手数量的一半,为了确保了在日程表中分布均匀。对于每对选手(i,j),它们的比赛日程被设置为i与j的初始日程加上一定的偏移量。这个偏移量是选手数量的一半,即half。因此,对于日程表中的每个元素sch[i][j],我们将其更新为sch[i][j] + half。

同时当n==2时数值也会运行数据整合这段程序,其中的herf值为1,所以设计的初始数组为[0][1],[1][0].

算法采用了递归来解决子问题,数据结构主要是二维数组来表示比赛日程表。通过递归分组和填充日程表,最终得到了完整的比赛日程表。

【程序代码】 

#include <stdio.h>#define MAX_PLAYERS 128void getday(int sch[MAX_PLAYERS][MAX_PLAYERS], int n) {// 递归结束条件:只剩下2个选手时if (n == 2) {sch[0][0] = 0;sch[0][1] = 1;sch[1][0] = 1;sch[1][1] = 0;return;}// 将所有选手分为两组int half = n / 2;int group1[half];int group2[half];int index = 0;int i,j; for (i = 0; i < n; i++) {if (i < half) {group1[i] = i;} else {group2[index++] = i;}}// 递归地生成 getday(sch, half);getday(sch + half, half);for (i = 0; i < half; i++) {for (j = 0; j < half; j++) {sch[i + half][j] = sch[i][j] + half;sch[i][j + half] = sch[i][j] + half;sch[i + half][j + half] = sch[i][j];}}
}void printSch(int sch[][MAX_PLAYERS], int n) {printf("比赛日程表:\n");int i,j;for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {printf("%d ", sch[i][j] + 1); }printf("\n");}
}int main() {//printf("计算机224高宇浩202202372\n");int n;int flag = 0;while( flag == 0){printf("请输入选手数量(2的幂次方):");scanf("%d", &n);if (n <= 1 || (n & (n - 1)) != 0) {printf("选手数量必须为2的幂次方且大于1!\n");}elseflag = 1 ;}int sch[MAX_PLAYERS][MAX_PLAYERS] = {0}; getday(sch, n);printSch(sch, n);return 0;
}

【运行结果】

【算法分析】

划分选手:这一步需要遍历一次所有选手,时间复杂度为 O(n),其中 n 为选手数量。

递归生成比赛日程表:每次递归都将选手数量减半,直到选手数量为 2,因此总共会进行 log₂(n) 次递归操作。

填充日程表:填充日程表的过程是一个双重循环,其中外层循环执行了 n/2 次,内层循环也执行了 n/2 次。因此填充日程表的时间复杂度为 O(n²)。

综上所述,该算法的时间复杂度主要由递归生成比赛日程表和填充日程表两个部分决定,而递归部分的时间复杂度为 O(log₂(n)),填充日程表部分的时间复杂度为 O(n²)。因此,总体时间复杂度为 O(n² * log₂(n))。

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

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

相关文章

Mysql 集群技术

目录 一 Mysql 在服务器中的部署方法 1.1 在Linux下部署mysql 1.1.1 安装依赖性并解压源码包&#xff0c;源码编译安装mysql&#xff1a; 1.1.2 部署mysql 二 mysql的组从复制 2.1 配置mastesr和salve 测试结果 2.2 当有数据时添加slave2 2.3 延迟复制 2.4 慢查询日志…

【C++ | 设计模式】简单工厂模式的详解与实现

1.简单工厂模式概述 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它定义了一个工厂类&#xff0c;由这个类根据提供的参数决定创建哪种具体的产品对象。简单工厂模式将对象的创建逻辑集中到一个工厂类中&#xff0c;从而将对…

Python-进阶-Excel基本操作

文章目录 Excel 基本操作1. 概述2. 写入2.1 使用 xlwt2.2 使用 XlsxWriter 3. 读取4. 修改 Excel 基本操作 1. 概述 在数据处理方面&#xff0c;Python 一直扮演着重要的角色&#xff0c;对于 Excel 操作&#xff0c;它有着完整且成熟的第三方库&#xff0c;使用也较为简单。…

视频结构化从入门到精通——认识视频结构化

认识视频结构化 1. 视频结构化与非结构化 1. 非结构化数据 非结构化数据指的是未经处理、以原始形式存在的数据。这类数据是直接采集、记录的&#xff0c;包含了音频、视频等多维信息&#xff0c;且没有任何标签、注释或分类来表示其中的内容。非结构化数据需要进一步处理和…

AI视频平台精选:国内外对比与推荐

原文&#xff1a;AI视频平台精选&#xff1a;国内外对比与推荐 国内外有多个平台可以生成AI视频&#xff0c;这些平台各有其独特的优点和缺点。以下是对一些主要平台的详细介绍&#xff0c;包括它们的优缺点&#xff0c;以及针对个人和自媒体用户的推荐。 国内平台 1. 快手可…

Android 架构模式之 MVVM

Android 架构 Android 架构模式之 MVCAndroid 架构模式之 MVPAndroid 架构模式之 MVVM 目录 Android 架构架构设计的目的对 MVVM 的理解代码ModelViewViewModel Android 中 MVVM 的问题试吃个小李子BeanModelViewViewModel效果展示 大家好&#xff01; 作为 Android 程序猿&a…

代码随想录算法训练营第13天 |二叉树的学习

目录 二叉树 理论基础 二叉树的分类 1. 满二叉树 (Full Binary Tree) 2. 完全二叉树 (Complete Binary Tree) 3. 平衡二叉树 (Balanced Binary Tree) 5. 二叉搜索树 (Binary Search Tree, BST) 二叉树的存储 1. 链式存储 (Linked Representation) 2. 顺序存储 (Sequent…

Golang | Leetcode Golang题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; import "math/rand"type node struct {ch [2]*nodepriority intval int }func (o *node) cmp(b int) int {switch {case b < o.val:return 0case b > o.val:return 1default:return -1} }func (o *node) rotate…

pyro 教程 时间序列 单变量,重尾,python pytorch,教程和实例 Forecasting预测,布朗运动项、偏差项和协变量项

预测I:单变量&#xff0c;重尾 本教程介绍了预测模块&#xff0c;用Pyro模型进行预测的框架。本教程只涵盖单变量模型和简单的可能性。本教程假设读者已经熟悉慢病毒感染和张量形状. 另请参见: 预测II:状态空间模型 预测三:层次模型 摘要 要创建预测模型: 创建预测模型班级…

算法笔试-编程练习-H-02-24

w这套题&#xff0c;侧重模拟和题目理解&#xff0c;只要按照题目描述正常复现整体分数应该不错 一、数据重删 数据重删是一种节约存储空间的技术&#xff0c;通常情况下&#xff0c;在数据存储池内是有很多重复的数据库。重删则是将这些重复的数据块找出并处理的技术。简单地…

Java:jdk8之后新增的时间API

文章目录 为什么要使用新增的API新增了哪些&#xff1f;Local常用方法代码一样的用法 黑马学习笔记 使用新增的 为什么要使用新增的API 新增了哪些&#xff1f; Local 常用方法 代码 package NewTime;import java.time.LocalDate;/*** Author: ggdpzhk* CreateTime: 2024-08-…

竞猜足球核心算法源码

需要实现的功能如下&#xff1a; 仅用于学习 竞猜足球核心算法源码 package com.lotterysource.portsadmin.service; import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.lotterysource.portsadmin.dbprovid…

@ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)

本文介绍如何使用应用ohos.systemParameterEnhance (系统参数)(系统接口)来控制设备硬件&#xff0c;可以通过它在系统中执行一段shell命令&#xff0c;从而实现控制设备的效果。接下来以一个实际的样例来演示如何通过它来控制设备以太网接口 开源地址&#xff1a;https://git…

链表OJ题——环形链表2

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 环形链表2 题目描述&#xff1a;在链表有环的基础上&#xff0c;找出环的入口点。 二、解题思路 三、解题代码

超实用的8个无版权、免费、高清图片素材网站整理

不管是设计、文章配图&#xff0c;还是视频制作&#xff0c;图片都至关重要。但是图片版权一直都是困扰很多设计、自媒体以及企业的大问题。现在&#xff0c;因为图片侵权被告的案例已经是司空见惯了&#xff0c;有的公众号甚至因为图片版权问题遭受致命打击。 1. Pexels Pexe…

(经验)SVN降版本,保留版本信息和用户信息。

背景&#xff1a;由于开始公司人数规模小&#xff0c;没有关心SVN最新版本免费对于用户数量限制要求不敏感&#xff0c;随着人数越来越多&#xff0c;公司来了新员工已经添加不了SVN需要注册码了&#xff0c;不利于SVN文件管理的在公司内部的推广。看了好多资料&#xff0c;都没…

信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪心策略

文章PDF链接: https://pan.baidu.com/s/1SVcGU_rApvoUWrUoviPCiA?pwdht2j 提取码: ht2j 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 郊游活动 有 n名同学参加学校组织的郊游活动&#xff0c…

有没有比较好用的在线翻译工具?实力推荐这4款。

当我们面对外文资料时&#xff0c;可能需要翻阅厚重的词典&#xff0c;耗费大量的时间和精力。在翻译这方面&#xff0c;很多人都十分依赖翻译工具的&#xff0c;因为这些工具只需几秒钟就能给出翻译结果&#xff0c;提高了我们的学习和工作的效率。但是随着翻译工具越来阅读&a…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第八篇:Tab标签页的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

使用C++封装顺序表

作业&#xff1a;使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream>using namespace std;using datatypeint; #define MAX 20struct SeqList { private: //私有datatype *data;int size0; …