分治算法-找假币问题-2分法VS3分法

找假币问题-2分法 VS 3分法

问题:有k枚硬币,其中有一枚假币,假币与真币无外观差异,只是假币的重量稍微大一些。现有一个无砝码称重天平,通过称重的方式找出假币,求最小称重次数

解题思路

暴力求解
求解过程:拿一枚硬币放在天平一头,再不断往另一头放硬币,每次放一枚,直到找出那一枚偏重的硬币
计算次数:n = k-1 (k>=2)

2分法
求解过程:(1)将所有硬币整除2进行分组(硬币分成2组,总数为奇数时,多出的一个硬币单独一组);(2)比较两组硬币重量,重量大的组别中含有假币,若两组硬币重量相同则单独一组的那一个硬币为假币。重复(1)(2)两个步骤。
计算次数:n≈log2kn \approx log_2{k}n≈log2​k次(k>=2)

3分法
求解过程:(1)将所有硬币整除3进行分组(硬币分成3组,前2组硬币数量相同,第3组数量大于前2组);(2)比较第1、2两组硬币重量,重量大的组别中含有假币,若两组硬币重量相同则假币在第3组中。重复(1)(2)两个步骤;当硬币数量小于3则分为2组,重量大的组别中含有假币
计算次数:n≈log3kn \approx log_3{k}n≈log3​k次(k>=2)

效果对比


也不用我哔哔,这个对比很明显了。

自己的逗逼想法
用4分法、5分法、6分法。。。。。。能让求解步骤更少吗?
想了挺久的,发现并不能,原因在于天枰只有2头可以放硬币。优化方向应该是”让每次不用称重就可做判断的硬币数量“尽量大,而3分法在这个场景下已经是最优了。4分即是2分,6分可以当成2个3分、3个2分,5分可以可以当成是2分与3分的组合,更高分,也类似。比较一下要么等价于3分法,要么求解次数大于3分法。
用数学的方式表达一下,求解次数n,硬币k个,k = a + b

n=log⁡3a+log⁡2bn = \log_3{a} + \log_2{b} n=log3​a+log2​b

代码

2分法

import numpy as npdef compare_group(group_list):'''比较各组别的硬币总重量,返回重量最大的组别param : 例如[[1.0,1.0],[1.0,1.0],[1.0]]'''if sum(group_list[0]) > sum(group_list[1]):return group_list[0]elif sum(group_list[0]) < sum(group_list[1]):return group_list[1]else :return Nonedef group(coin_list):'''分组并返回重量最大的组别param : 例如[1.0,1.0,1.0,1.0,1.1,1.0,1.0]'''coin_num = len(coin_list)if coin_num >= 2 :group_1 = coin_list[0:coin_num // 2]group_2 = coin_list[coin_num // 2:coin_num//2 * 2]group_3 = coin_list[coin_num // 2 * 2:]compare_value = compare_group([group_1,group_2])if compare_value :return compare_valueelse :return group_3def weighed(coin_list):'''循环执行分组、取最大重量组别param : 例如[1.0,1.0,1.0,1.0,1.1,1.0,1.0]'''weighed_coin_list = coin_list.copy()weighed_num = 0while True :if len(weighed_coin_list) < 2 :breakweighed_coin_list = group(weighed_coin_list)weighed_num = weighed_num + 1return weighed_num,weighed_coin_list[0]if __name__ == '__main__':list1 = [1.15] #定义假币ones1 = list(np.ones(20000))coin_list = ones1 + list1 + ones1weighed_num,fake_money_weight = weighed(coin_list)print("weighed_num:",weighed_num,"fake_money_weight:",fake_money_weight)

3分法

import numpy as npdef compare_group(group_list):'''比较各组别的硬币总重量,返回重量最大的组别param : 例如[[1.0,1.0],[1.0,1.0],[1.1,1.0,1.0]]'''if sum(group_list[0]) > sum(group_list[1]):return group_list[0]elif sum(group_list[0]) < sum(group_list[1]):return group_list[1]else :return group_list[2]def group(coin_list):'''分组并返回重量最大的组别param : 例如[1.0,1.0,1.0,1.0,1.1,1.0,1.0]'''coin_num = len(coin_list)#print(coin_num)if coin_num >= 3 :group_1 = coin_list[0:coin_num // 3]group_2 = coin_list[coin_num // 3:coin_num//3 * 2]group_3 = coin_list[coin_num // 3 * 2:]return compare_group([group_1,group_2,group_3])elif coin_num == 2 :group_1 = coin_list[0:coin_num // 2]group_2 = coin_list[coin_num // 2 :]return compare_group([group_1,group_2])def weighed(coin_list):'''循环执行分组、取最大重量组别param : 例如[1.0,1.0,1.0,1.0,1.1,1.0,1.0]'''weighed_coin_list = coin_list.copy()weighed_num = 0while True :if len(weighed_coin_list) < 2 :breakweighed_coin_list = group(weighed_coin_list)weighed_num = weighed_num + 1return weighed_num,weighed_coin_list[0]if __name__ == '__main__':list1 = [1.15] #定义假币ones1 = list(np.ones(20000))coin_list = ones1 + list1 + ones1weighed_num,fake_money_weight = weighed(coin_list)print("weighed_num:",weighed_num,"fake_money_weight:",fake_money_weight)

找假币问题-2分法 VS 3分法相关推荐

  1. 主表的引用字段中找不到唯一的索引_不用找了,大厂在用的分库分表方案,都在这里!...

    作者:尜尜人物 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连 ...

  2. 硬币(计算n分有几种表示法)

    硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5输出:2解释: 有两种方 ...

  3. 7-27 冒泡法排序 (20 分)

    7-27 冒泡法排序 (20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的 ...

  4. 范寶興:3分法、4分法在12階穿越界面的浪漫

    范寶興:3分法.4分法在12階穿越界面的浪漫 ※※※※※※ 來稿時間:2017年3月26日下午4:49分. 貼博時間:2017年4月16日復活節. ※※※※※※ 欣賞導航:在修飾范寶興先生今次12階作 ...

  5. 5-27 冒泡法排序 (20分)

    5-27 冒泡法排序   (20分) 将NN个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最 ...

  6. powerworld电力系统仿真,潮流计算,短路计算,电力系统分析。潮流计算对比,牛拉法,PQ分解法对比

    powerworld电力系统仿真,潮流计算,短路计算,电力系统分析.潮流计算对比,牛拉法,PQ分解法对比 编号:1710662437866344电气女博士

  7. PTA习题7-1 选择法排序 (20 分)

    习题7-1 选择法排序 (20 分) 本题要求将给定的n个整数从大到小排序后输出. 输入格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格. 输入样例: 4 5 1 7 ...

  8. 【中级软考】什么是“敏捷过程的开发方法(敏捷方法agile)“(极限编程XP、特征驱动开发FDD、并列争球法Scrum、水晶法Crystal、开放源码法、自适应软件开发 ASD方法)

    文章目录 敏捷方法 1 极限编程 XP 1.四大价值观 2.十二个最佳实践 2 特征驱动开发 FDD 1.FDD 角色定义 2.核心过程 3.最佳实践 3 并列争球法 Scrum 1.Scrum 的五 ...

  9. 武大计算机系雷军,马化腾739分、雷军700分系湖北状元!大佬们的高考成绩让人敬畏!...

    2021年高考正在进行时,高考虽然不是改变命运的唯一渠道,但它仍是莘莘学子们人生中一个重要的转折点. 今年全国有1078万学子报名参加高考,在这1078万考生中,一定会出现改变中国未来的人才. 上世纪 ...

最新文章

  1. WPF ,listbox,平滑滚动的2种方式。
  2. 开放下载!解锁 Serverless 从入门到实战大“橙”就
  3. matlab负荷分配程序,利用MATLAB工具箱进行机组负荷优化分配
  4. Delphi插件创建、调试与使用应用程序扩展
  5. TigerGraph入门
  6. WorkList-Dicom字段定义
  7. 数据结构1800题-错题集-第二章
  8. 为什么正常单据记账没有数据_正常单据记账中找不到记账单据
  9. Excel2013函数公式大全(一)
  10. 韩国NF功放芯片在音频音响领域的应用
  11. PaddleOCR详解和识别图片中文字
  12. 简单自定义MVC优化
  13. 微型计算机接口课程设计报告,《微机接口技术》课程设计报告(范文).doc
  14. 2020高中计算机会考成绩查询,2020会考成绩查询网站入口 学业水评考试成绩查询方法...
  15. 经典的W2kXP添加删除硬件
  16. 上海亚商投顾:创业板指高开高走 ChatGPT概念卷土重来
  17. 【博学谷学习记录】超强总结,用心分享 | 狂野大数据 | 环境 | hive搭建
  18. 产品经理——java学习之路
  19. 渗透测试之后台查找,如何查找网站后台
  20. 汇编语言编写方法及程序分析

热门文章

  1. 15 款 Python 编辑器/ IDE 详细攻略,总有一款适合你
  2. 算术公理化的发明人—格拉斯曼
  3. 电脑网络看不到其它计算机,怎么找不到共享电脑,详细教您局域网中共享电脑找不到怎么办...
  4. 关于Range()函数的理解及代码解释
  5. HTML自闭合(self-closing)标签
  6. 05.内存管理:动态申请和释放内存
  7. javaw运行jar
  8. 如何利用IP地址确定地理位置
  9. “科技体系如何驱动苏宁智慧零售业务发展” ——1200十八期体系业务交流
  10. html标题和段落一样大,HTML标题和段落