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. 判断

  1. 如果第10趟中位于第三名的马匹,Y位编号>=3,则可说明前三名,外加之前取到的11号,这4匹马就64匹马中跑的最快的4匹【此时结束:总趟数10趟】
  2. 如果本趟中位于第三名的马匹,Y位编号<3,则需淘汰第10趟中排名第8的马匹,将41号编入再跑1趟,即可确定64匹马中跑的最快的4匹【此时结束:总趟数11趟】

1.2.3 皮一下的方法–1趟

Step1. 将8条赛道均匀分成8等份,即获取64条子赛道。
Step2. 将64匹马分别分配在各个子赛道,同时起跑,取最先到达子赛道终点的4匹马即为64匹马中跑的最快的马【此时结束:总趟数1趟】

2. 总结

该问题要求尽可能充分的利用已知信息,在该题目中我们可以获知的信息分别是:

  1. 第一轮8趟中,我们可以知道马匹的 组内排名
  2. 第二轮1趟中,我们可以知道马匹的 组间排名

我们可以获知的控制条件分别是:

  1. 马匹 组内排名,如果组内无法跑进前4,则必无法进入整体的前四。
  2. 马匹 组内排名,如果本组排名相对靠后的马位于前4,则本组排名在它之前的马必在前4
  3. 马匹 组间排名,如果本组最快的马无法跑进前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轮 后在待定数组中会存留 TOP27TOP27 再次按照此规则进行比赛,13轮后,待定数组内会存留 TOP12TOP12 比赛 2轮 后选出 真TOP4,总过程 15轮

基于正态分布,该算法最后大约稳定在 12轮 后选出真 TOP4,比文中算法多1轮

当然在你的算法中也提出了 标杆前移 的优化算法,但在这种情况下 无法得出 9轮的最优解,大约会稳定在10至12轮。与上文算法基本一致。

就我个人而言,我认为应用于生产环境的算法应当以稳定为大,即最优与最差的差距不应太大。因此我会选择我在文中阐述的方法应用于生产。

再次感谢您提出的宝贵意见,最后祝您身体健康,谢谢。

64马8赛道取前4问题相关推荐

  1. Hive中分组取前N个值

    分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...

  2. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  3. mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园

    -- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...

  4. c语言字符串提取第二个字符,c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例...

    c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例.函数需引入的头文件:#include 定义strncpy()函数:char * strncpy(char *dest, const ...

  5. mysql根据排序取前百分之二十_MySQL 性能优化 MySQL常见SQL错误用法

    1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引.这样 ...

  6. oracle和sql server中,取前10条数据语法的区别

    在sql server中,取数据中前10条语句,我们可以用top 10 这样语句,但是oracle就没有这个函数,接下来介绍它们之间的区别 1.sql server 取前10语句和随机10条的语法 - ...

  7. matlab取中间的几位数,Excel中取前几位数、中间几位数、后几位数的方法

    在Excel中,我们可能会遇到取一组数据前几位数,中间几位数,或者后几位数的问题,这该怎么办呢?今天就教大家在Excel中用left.mid.right函数分别取出前几位数.中间几位数和后几位数的方法 ...

  8. 如何从亚马逊抓取产品数据?

    "为什么我们需要抓取亚马逊的数据?",也许这是您可能会问的第一个问题. 亚马逊是美国最大的电子商务公司,拥有世界上种类最多的产品.将产品数据抓取下来有很多有价值的用途.以下是为您列 ...

  9. 群聊头像 - 取前五个用户头像生成一个新的头像

    仿微信九宫格(从1-9个头像) 取前五个用户头像生成一个新的头像(从1-5个头像) 可自定义算法做头像拼接 效果图如下 package com.example.demo.util;import jav ...

最新文章

  1. 转:经典论文翻译导读之《Google File System》
  2. 一维数组对象转成二维数组
  3. 1.NET 4.6.1向.NET core 2.0项目迁移(HelloWorld篇)
  4. 阿里云消息队列 2021 新功能新特性重要里程碑
  5. Fetcher类的工作流程
  6. 广东省计算机大赛设计什么时候,2017年广东省大学生计算机设计大赛
  7. java深度学习(一)Maven创建一个新的ND4J工程
  8. 在单独的WAR组件中对SPA资源和API实现进行分区
  9. linux 批量创建用户和删除用户
  10. 经常有职场上的朋友问我,要怎么去轻资产创业?
  11. Windows Server 2008R2 Web服务器
  12. matlab2c基础使用教程(实矩阵、复矩阵)
  13. 高并发之——并发测试工具ab
  14. Android微信代扣sdk无法拉起,微信JS-SDK选择图片遇到的坑
  15. idea如何实现修改代码即时生效
  16. JS-JavaScript_简介及基本使用
  17. windows html封装,怎样win7自带的sysprep封装系统
  18. Redis的发布订阅
  19. 五种蓝牙耳机,到底谁才是你的菜
  20. 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现

热门文章

  1. Java开发技巧!整理了3家面试问题:美团+字节+腾讯,工作感悟
  2. java web 蓝牙打印_android 蓝牙打印机示例
  3. IOS APP资源网站汇总
  4. 【UE4】联网游戏开发的正确姿势
  5. RFSoC应用笔记 - RF数据转换器 -04- RFSoC关键配置之RF-ADC内部解析(二)
  6. 又一次算法作业hhhhhh
  7. 程序员面试阿里、腾讯、京东等大公司,这些套路你知道吗?
  8. 【钉钉-场景化能力包】会展入场
  9. Linux tac命令
  10. apt gives “Unstable CLI Interface” warning