分治与减治算法实验:题目6 淘汰赛冠军问题

本文介绍了如何使用C++编程实现淘汰赛冠军问题的分治和减治算法,包括算法原理、递归过程以及时间复杂度分析。实验目标是让学生掌握减治法设计思想和递归技术运用,最终通过实例编程实现算法。
摘要由CSDN通过智能技术生成

实验时间

2024年 4 月10日19时至22时

学时数

3

1.实验名称

分治与减治算法实验:题目6 淘汰赛冠军问题

2.实验目的

(1)掌握减治法的设计思想;

(2)掌握淘汰赛冠军问题的具体实现过程;

(3)通过这个实例进一步掌握递归技术的运用;

(4)在掌握的基础上编程实现淘汰赛冠军问题的具体实现过程。

3.实验内容

假设有n个选手进行竞技淘汰赛,最后决出冠军的选手,请设计竞技淘汰比赛的过程,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。

  1. 实验原理

竞技淘汰比赛最自然的想法是将所有选手分成两部分,每部分决出胜者后。让这两个胜者进行比赛,再决出最后的冠军,这属于分治法,显然满足如下递推式:

应用扩展递归技术求解这个递推式,得到T(n)=O(n)。

下面考虑采用减治法,开始时将所有选手分成n/2组,每组两个选手进行比赛,被淘汰者不参加以后的比赛,然后再将剩余选手分成n/4组,每组两个选手进行比赛,……直到剩余最后两个选手,进行一次比赛即可选出最后的冠军。图给出了一个减治技术解决淘汰赛冠军问题的过程示例(假设按照字符编码进行比较)。

   减治法求解淘汰赛冠军问题实例

                     

  1. 实验源代码和伪代码

设函数Comp模拟两位选手meml和mem2的比赛,若meml获胜则函数Comp返回1,否则返回0,并假定可以在常数时间内完成函数Comp的执行,简单起见,用字符表示选手,设字符数组r[n]存储n个选手,算法用C++语言描述如下:

#include <iostream>

using namespace std;

char Game (char r[], int n);

bool Comp(int a, int b);

char Game (char r[], int n) {

int i = n;

while (i > 1) {

i = i / 2;

for (int j = 0; j < i; j++)

if (Comp(r[j + i], r[j])) //胜者存入r[j]中

r[j] = r[j + i]; //比赛直到剩余1人即为冠军

}

return r[0];

}

bool Comp(int a, int b) {

if (a > b)

return false;

else

return true;

}

int main() {

int n;

char r[100];

cout << "请输入选手个数:";

cin >> n;

cout << "请输入各选手姓名" << endl;

for (int i = 0; i < n; i++) {

cin >> r[i];

}

char winner = Game (r, n);

cout << "最终胜利的是:" << endl;

cout << winner << "!";

}

时间复杂度分析:

设n=2k,则外层的while循环共执行k次,在每一次执行时,内层的for循环的执行次数分别是n/2,n/4,…,1,而函数Comp可以在常数时间内完成,因此,算法的执行时间为:

  1. 实验结论及心得

代码运行截图:

心得:

因为时间原因未能实现输入选手中文名字的比较代码

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值