64马8赛道取前4问题
64马8赛道问题
- 0. 问题描述
- 1. 解题思路
- 1.1 有计时的情况--8趟
- 1.2 无计时的情况
- 1.2.1 一般方法--15趟
- 1.2.2 优化方法--10至11趟
- 1.2.3 皮一下的方法--1趟
- 2. 总结
- 3. 更新
0. 问题描述
64马8赛道问题常常以以下形式被描述:
现有64匹马以及8条赛道,现在需要选出跑的最快的4匹马。
- 在有计时的情况下,需要跑几轮?
- 在无计时的情况下,需要跑几轮?
1. 解题思路
1.1 有计时的情况–8趟
有计时的情况十分简单。64匹马分8组测试,对每匹马分别计时。最后统计用时,按用时从少到多排列,取前4名即可。
1.2 无计时的情况
1.2.1 一般方法–15趟
Step1. 将64匹马分成8组,跑8趟,淘汰每组后4名。
Step2. 将剩余的32匹马分4组,跑4趟,淘汰每组后4名。
Step3. 将剩余的16匹马分2组,跑2趟,淘汰每组后4名。
Step4. 将最后8匹马编成1组,跑1趟,取前4名即可。
总结: 该方法共需跑15趟。思路比较简单,比较麻烦,还有优化的空间。
1.2.2 优化方法–10至11趟
Step1. 将64匹马分成8组,跑8趟,淘汰每组后4名 【此时已跑:8趟】
编号规则:XY,X=组号,Y=组内名次
Step2. 将每组第一名的马编成1组,跑1趟,淘汰最后4名所在的组【此时已跑:9趟】
编号规则:XY,X=组间名次,Y=组内名次
Step3. 此时可以确定11号是跑的最快的马,取出放置一旁。
编号规则:XY,X=组间名次,Y=组内名次
从图中可以看出,组1中越靠近11越快,4组间越靠近组1越快
Step4. 取位于蓝色阴影部分的马匹,除去41号外的另外8匹编成1组,跑1趟【此时已跑:10趟】
Step5. 判断
- 如果第10趟中位于第三名的马匹,Y位编号>=3,则可说明前三名,外加之前取到的11号,这4匹马就64匹马中跑的最快的4匹【此时结束:总趟数10趟】
- 如果本趟中位于第三名的马匹,Y位编号<3,则需淘汰第10趟中排名第8的马匹,将41号编入再跑1趟,即可确定64匹马中跑的最快的4匹【此时结束:总趟数11趟】
1.2.3 皮一下的方法–1趟
Step1. 将8条赛道均匀分成8等份,即获取64条子赛道。
Step2. 将64匹马分别分配在各个子赛道,同时起跑,取最先到达子赛道终点的4匹马即为64匹马中跑的最快的马【此时结束:总趟数1趟】
2. 总结
该问题要求尽可能充分的利用已知信息,在该题目中我们可以获知的信息分别是:
- 第一轮8趟中,我们可以知道马匹的
组内排名
- 第二轮1趟中,我们可以知道马匹的
组间排名
我们可以获知的控制条件分别是:
- 马匹
组内排名
,如果组内无法跑进前4,则必无法进入整体的前四。 - 马匹
组内排名
,如果本组排名相对靠后的马位于前4,则本组排名在它之前的马必在前4 - 马匹
组间排名
,如果本组最快的马无法跑进前4,则该组剩余的马必如法进入整体的前4。
充分利用这些信息我们即可在用最少的轮次筛选出最快的马匹
3. 更新
2020年2月18日 —— 针对 qq_41543660 评论区回复的更新
最少9次,https://blog.csdn.net/qq_41543660/article/details/104363646
该算法的基本思想为 挑选标杆马
与 待定数组
,标杆马参与下一轮比赛,名次高于标杆的马记入 待定数组
。
当标杆马落后时重新选举标杆马;并将名次在新标杆马之前的马匹记入待定数组。
比如挑选第一组第4名[马(1,4)]为标杆马,第一组前三名记入待定数组
更换标杆马的情况:下一组时马(1,4)落出前四,将马(2,4)选举为新标杆参与下一组比赛,以此类推
不更换标杆马的情况:下一组时马(1,4)仍在前4,则马(1,4)继续参加下一轮,以此类推
首先感谢您的回复,先说结论
你是对的,在最好的情况下9轮即可完成比赛
最好的情况(以第4名为标杆):
64匹马中随机抽取8匹,且 真TOP4
在这8匹中。这样该组的 第4名
即为 真第四名
,比剩余所有的马跑的都快。
剩下的8轮中,它必跑第一,也就印证了第一组的前四是 真TOP4
。这是一个非常巧妙的方法。
但是,我们可以进行一点简单的组合运算。这4匹马被分在一组中的排列组合有多少种呢,应当是
C 60 4 = 487635 C^4_{60}=487635 C604=487635即最好情况出现的概率约为 2.05 × 1 0 − 4 2.05\times10^{-4} 2.05×10−4
到此我们先按下不谈,再来看看最坏的情况:
最坏的情况莫过于每次都要重新选举标杆。这样 9轮
后在待定数组中会存留 TOP27
。TOP27
再次按照此规则进行比赛,13轮
后,待定数组内会存留 TOP12
,TOP12
比赛 2轮
后选出 真TOP4
,总过程 15轮
。
基于正态分布,该算法最后大约稳定在 12轮
后选出真 TOP4
,比文中算法多1轮
当然在你的算法中也提出了 标杆前移
的优化算法,但在这种情况下 无法得出
9轮的最优解,大约会稳定在10至12轮。与上文算法基本一致。
就我个人而言,我认为应用于生产环境的算法应当以稳定为大,即最优与最差的差距不应太大。因此我会选择我在文中阐述的方法应用于生产。
再次感谢您提出的宝贵意见,最后祝您身体健康,谢谢。
64马8赛道取前4问题相关推荐
- Hive中分组取前N个值
分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...
- oracle 取前10条记录
1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...
- mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园
-- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...
- c语言字符串提取第二个字符,c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例...
c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例.函数需引入的头文件:#include 定义strncpy()函数:char * strncpy(char *dest, const ...
- mysql根据排序取前百分之二十_MySQL 性能优化 MySQL常见SQL错误用法
1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样 ...
- oracle和sql server中,取前10条数据语法的区别
在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...
- matlab取中间的几位数,Excel中取前几位数、中间几位数、后几位数的方法
在Excel中,我们可能会遇到取一组数据前几位数,中间几位数,或者后几位数的问题,这该怎么办呢?今天就教大家在Excel中用left.mid.right函数分别取出前几位数.中间几位数和后几位数的方法 ...
- 如何从亚马逊抓取产品数据?
"为什么我们需要抓取亚马逊的数据?",也许这是您可能会问的第一个问题. 亚马逊是美国最大的电子商务公司,拥有世界上种类最多的产品.将产品数据抓取下来有很多有价值的用途.以下是为您列 ...
- 群聊头像 - 取前五个用户头像生成一个新的头像
仿微信九宫格(从1-9个头像) 取前五个用户头像生成一个新的头像(从1-5个头像) 可自定义算法做头像拼接 效果图如下 package com.example.demo.util;import jav ...
最新文章
- 转:经典论文翻译导读之《Google File System》
- 一维数组对象转成二维数组
- 1.NET 4.6.1向.NET core 2.0项目迁移(HelloWorld篇)
- 阿里云消息队列 2021 新功能新特性重要里程碑
- Fetcher类的工作流程
- 广东省计算机大赛设计什么时候,2017年广东省大学生计算机设计大赛
- java深度学习(一)Maven创建一个新的ND4J工程
- 在单独的WAR组件中对SPA资源和API实现进行分区
- linux 批量创建用户和删除用户
- 经常有职场上的朋友问我,要怎么去轻资产创业?
- Windows Server 2008R2 Web服务器
- matlab2c基础使用教程(实矩阵、复矩阵)
- 高并发之——并发测试工具ab
- Android微信代扣sdk无法拉起,微信JS-SDK选择图片遇到的坑
- idea如何实现修改代码即时生效
- JS-JavaScript_简介及基本使用
- windows html封装,怎样win7自带的sysprep封装系统
- Redis的发布订阅
- 五种蓝牙耳机,到底谁才是你的菜
- 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现