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

官网网站建设方案书宁波模板建站源码

官网网站建设方案书,宁波模板建站源码,晨阳seo顾问,义乌网站制作公司博主简介#xff1a;一个爱打游戏的计算机专业学生博主主页#xff1a; 夏驰和徐策所属专栏#xff1a;算法设计与分析 目录 书本内容#xff1a; 我的理解#xff1a; 更优化的算法#xff1a; 总结 1.注意实现问题 2.当用C语言和C实现循环赛日程表算法时#xff… 博主简介一个爱打游戏的计算机专业学生博主主页 夏驰和徐策所属专栏算法设计与分析 目录 书本内容 我的理解 更优化的算法 总结 1.注意实现问题 2.当用C语言和C实现循环赛日程表算法时需要注意以下几点 书本内容 分治法不仅可以用来设计算法在其他方面也有广泛应用如用分治思想来设计电路、 构造数学证明等。现举例说明。 设有1-2*个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表 ① 每个选手必须与其他 n-1 个选手各赛一次; ② 每个选手一天只能赛一次 ③ 循环赛一共进行 n-1 天; 按此要求可将比赛日程表设计成有n行和n-1 列的表。在表中第之行和第j列处填入第i个选手在第;天所遇到的选手。按分治策略可以将所有选手对分为两半n个选手的比赛日程表就可以通过为1/2个选手设计的比赛日程表来決定。递归地用这种一分为二的策略对选手进行分割直到只剩下两个选手时比赛日程表的制定就变得简单了。这时只要让这两个选手进行比赛就可以了。图 2-12 所列出的正方形表是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手 1至选手4 和选手 5至选手8 前了天的比赛日程。据此将左上角小块中的所有数字按其相对位置抄到右下角将左下角小块中的所有数字按其相对位置挱到右5上角这样就分别安排好了选手 1至选手 4 和选手 5至选手8在后 4 天的比赛日程。依此思想容易将这2个比赛日程表推广到具有任意多个选手的情形。在一般情况下算法可描述如下 void Table(int k,int **a) {int n1;for(int i1;ik;i){n*2;}for(int i1;in;i){a[1][i]i;}int m1;for(int s1;sk;s){n/2;for(int im1;i2*m;i){for(int jm1;j2*m;j){a[i][j(t-1)*m*2]a[i-m][jt-1*m*2-m];a[i][j(t-1)*m*2-m]a[i-m][j(t-1)*m*2];}}}m*2;} 我的理解 循环赛日程表的构建可以用递归的分治算法来实现。具体地将所有参赛队伍按照一定规则划分为两个子集分别构建它们的日程表最后将这两个日程表组合起来形成总的日程表。这个过程可以递归地进行直到日程表中只剩下两个队伍时结束。 具体来说可以采用如下的划分方式将所有队伍分成两组每组的大小相等或者相差不超过1。接下来将第一组中的第i个队伍与第二组中的第i个队伍进行比赛i从1到第一组队伍数目。这样就完成了一个轮次的比赛。然后将第一组中的所有队伍沿着一个方向循环移动一位将第二组中的所有队伍沿着相反的方向循环移动一位得到新的一轮比赛。重复上述步骤直到完成n-1轮比赛其中n为队伍的总数。这样就得到了完整的循环赛日程表。 在实现分治算法时需要注意一些细节。例如在划分队伍时如果队伍的数目是奇数需要将一个队伍暂时放到一边等到下一轮再加入其中一个小组中。在组合两个子日程表时需要注意将每个队伍在两个子日程表中的比赛分别放到总日程表中对应位置上。此外还需要适当处理递归终止的情况。 循环赛日程表的构建是一个非常实用的算法问题因为循环赛日程表在体育比赛、赛车比赛等领域有广泛的应用。采用分治算法可以降低算法的时间复杂度提高算法的效率。 我的代码实现 C语言实现 #include stdio.h #include stdlib.hvoid roundRobinSchedule(int n, int** schedule) {if (n 1) {schedule[0][0] 0;return;}int** subSchedule (int**)malloc((n / 2) * sizeof(int*));for (int i 0; i n / 2; i) {subSchedule[i] (int*)malloc((n / 2 - 1) * sizeof(int));}roundRobinSchedule(n / 2, subSchedule);for (int i 0; i n / 2; i) {for (int j 0; j n - 1; j) {int team1 subSchedule[i][j % (n / 2)] (j / (n / 2)) * (n / 2);int team2 (n - 1) - subSchedule[i][j % (n / 2)] (j / (n / 2)) * (n / 2);schedule[team1][i] team2;schedule[team2][i] team1;}}if (n % 2 1) {for (int i 0; i n - 1; i) {schedule[n - 1][i] i;schedule[i][n - 1] n - 1 - i;}}for (int i 0; i n / 2; i) {free(subSchedule[i]);}free(subSchedule); }int main() {int n 6;int** schedule (int**)malloc(n * sizeof(int*));for (int i 0; i n; i) {schedule[i] (int*)malloc((n - 1) * sizeof(int));}roundRobinSchedule(n, schedule);for (int i 0; i n; i) {for (int j 0; j n - 1; j) {printf(%d , schedule[i][j]);}printf(\n);}for (int i 0; i n; i) {free(schedule[i]);}free(schedule);return 0; }代码解释 这段代码与之前的实现基本相同只是使用了动态内存分配来创建二维数组。在 main 函数中我们先使用 malloc 分配一个 n 行的指针数组 schedule并在 roundRobinSchedule 函数中也使用 malloc 分配了一个 n/2 行、(n/2-1) 列的二维数组 subSchedule。在完成循环赛日程表的构建后我们需要记得先释放 subSchedule 申请的内存再释放 schedule 申请的内存以避免内存泄漏。 C实现 #include iostream #include vectorusing namespace std;vectorvectorint roundRobinSchedule(int n) {if (n 1) {vectorvectorint result(1, vectorint(1, 0));return result;}vectorvectorint schedule(n, vectorint(n - 1));vectorvectorint subSchedule roundRobinSchedule(n / 2);for (int i 0; i n / 2; i) {for (int j 0; j n - 1; j) {int team1 subSchedule[i][j % (n / 2)] (j / (n / 2)) * (n / 2);int team2 (n - 1) - subSchedule[i][j % (n / 2)] (j / (n / 2)) * (n / 2);schedule[team1][i] team2;schedule[team2][i] team1;}}if (n % 2 1) {for (int i 0; i n - 1; i) {schedule[n - 1][i] i;schedule[i][n - 1] n - 1 - i;}}return schedule; }int main() {int n 6;vectorvectorint schedule roundRobinSchedule(n);for (int i 0; i n; i) {for (int j 0; j n - 1; j) {cout schedule[i][j] ;}cout endl;}return 0; }代码解释 这段代码实现了循环赛日程表的构建。其中roundRobinSchedule 函数使用分治算法递归地构建出小规模的日程表并将它们合并起来得到最终的日程表。在实现过程中我们使用了二维向量 schedule 来存储日程表其第一维表示参赛队伍第二维表示比赛轮次。在每个轮次中我们使用 subSchedule 子日程表来记录参赛队伍之间的比赛对阵情况。最终我们将子日程表中的比赛结果放到总日程表中对应的位置上得到完整的循环赛日程表。 在 main 函数中我们调用 roundRobinSchedule 函数构建了一个大小为6的循环赛日程表并将其打印输出。 更优化的算法 好的下面我会具体讲解一下循环移位矩阵法和压缩算法。 循环移位矩阵法 循环移位矩阵法是一种将循环赛日程表问题转化为矩阵问题的方法它可以通过矩阵的循环移位来生成日程表。 具体实现步骤如下 1构造一个大小为n x n的矩阵初始值都为0 2在矩阵的第一行第一列放置1 3依次填充矩阵的其它位置填充规则如下 a. 如果当前位置在矩阵的第一行那么下一个位置应该是矩阵的最后一列的下一行。 b. 如果当前位置在矩阵的最后一列的下一行那么下一个位置应该是矩阵的第一行。 c. 如果当前位置不满足a和b两个条件那么下一个位置应该是当前位置的右上方。 4根据矩阵的每一行来生成对应的日程表。 该算法的时间复杂度为O(n^2)与传统的循环赛日程表算法相同但是可以减少循环的次数从而提高算法的效率。 压缩算法 压缩算法是一种只生成需要的那一行或那一列的算法避免浪费时间和空间。该算法的实现思路是首先利用循环赛日程表算法生成完整的日程表然后只保留需要的那一行或那一列。 具体实现步骤如下 1根据循环赛日程表算法生成完整的日程表 2如果需要生成第i行日程表则只保留日程表中第i行的数据其它行的数据全部删除 3如果需要生成第i列日程表则只保留日程表中第i列的数据其它列的数据全部删除。 该算法的时间复杂度取决于循环赛日程表算法的时间复杂度如果原始算法的时间复杂度为O(n^2)则压缩算法的时间复杂度也为O(n^2)。但是压缩算法可以减少内存的占用避免浪费时间和空间。 总结 1.注意实现问题 (1在使用分治策略解決问题时 注意检查四个条件是否满足 (2尽量保证划分出的子问题规模大致一致。平衡子问题思想 (3如果可以使用递推的方式解决问题尽量使用递推算法 (4递归的分治算法的时间复杂性分析要先写出其时间复杂 性的递归方程然后用主定理或递归树解方程。 (5用递归算法解决问题时要分析出其边界条件和递归方程(过程  2.当用C语言和C实现循环赛日程表算法时需要注意以下几点 在C语言中需要手动进行内存管理如使用malloc和free函数动态分配和释放内存避免内存泄漏或访问非法内存。而在C中可以使用new和delete操作符或使用智能指针等RAII技术来管理内存使得代码更加安全和简洁。在C语言中数组下标从0开始而在C中数组下标从1开始因此在实现算法时需要注意数组的下标问题。在C中可以使用STL容器如vector等来方便地管理数组而在C语言中需要手动实现相关操作如插入、删除和查找等。在C中可以使用类和对象的概念来封装和组织代码使得代码更加模块化和可复用。而在C语言中可以使用函数和结构体等来实现类似的功能。在实现算法时需要考虑代码的可读性和可维护性如合理命名变量和函数、添加注释、遵循编程规范等从而使得代码更易于理解和修改。 3.这个算法和游戏的联系 线性时间选择算法可以用来解决一些游戏中的问题。例如有些游戏中需要计算排名比如排行榜、竞技场排名等。在这些场景中需要快速地找到某个玩家的排名而线性时间选择算法可以用来解决这个问题。这怎么少得了王者农药呢 具体来说可以将玩家的战斗力作为数组的值然后使用线性时间选择算法找到战斗力排名第k的玩家这样就可以快速地计算出某个玩家在排名中的位置。 此外线性时间选择算法还可以用来解决其他游戏中的问题比如寻找最强的敌人、寻找最优的游戏策略等。
http://www.w-s-a.com/news/82823/

相关文章:

  • 网站建设如何开票网站后台怎么做超链接
  • 教育网站设计方案建设网站技术公司电话号码
  • 建网站要定制还是第三方系统传奇网站模板psd
  • 免费搭建企业网站什么叫网站定位
  • 网站建设cms程序员培训班
  • 网站seo技术wordpress editor ios
  • 红酒网站设计成立公司需要哪些手续
  • 广州做网站哪个好网站建网站建设网站站网站
  • 如何快速提升网站pr短剧个人主页简介模板
  • 上海网站建设 永灿百度权重3的网站值多少
  • 公司展示网站模板模板工
  • 网站建设收费详情舟山公司做网站
  • 深圳宝安区住房和建设局网站html模板大全
  • 和田哪里有做网站的地方wordpress地址更改
  • 恒通建设集团有限公司网站企业网站百度指数多少算竞争大
  • 雅虎网站收录提交入口如何使用wordpress搭建网站
  • 微商城网站建设怎么样发稿是什么意思
  • dz建站与wordpress群晖做网站服务器速度快吗
  • 做手机网站的公司网站建设 app开发 图片
  • 网站开发技术背景介绍wordpress数据库重置密码
  • 开发建设网站的实施过程是一个logo设计品牌
  • 做360pc网站排名首页工程造价信息网官网首页
  • 产品销售网站模块如何设计大数据和网站开发
  • 现在帮别人做网站赚钱不济南做网站建设公司
  • 嘉兴网站建设哪家好最近三天的国际新闻大事
  • 安丘网站建设制作做网站口碑比较好的大公司
  • 成都专业做网站公司哪家好优化大师下载安装免费
  • 防蚊手环移动网站建设广东深圳有几个区
  • 网站建设找哪些平台宜兴网站开发
  • 免费网站应用软件wordpress添加动态图标