称球问题的测试解法

news/2024/7/6 1:08:50
 
称球问题十几年前就在深圳的一网情深BBS上成为热门问题,此后的十余年间不断有人提起此问题,前段时间还在网上看到有人重新提起此问题,已经成为了新网民的入门级必知必会问题之一。
称球问题一般会有以下 3 种情况:
1 、M个球,其中有一个坏球,知道是轻还是重,用天平称出坏球来。
2、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来。
3、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来,并告知坏球是轻还是重。
现在要问对于上面3种情况,称k次,最多可以在几个球中找出坏球来?也就是要求出称k次的M的最大值来。
1 种情况,比较简单, 1 次可以称 3 个球, 2 次可称 9 个球, k 次可以称 3^k 3 k 次方)个球。
2 种情况就比第 1 种情况复杂多了, 对第 3 种情况,和第 2 种情况类似,知道了第 2 种的解法后,第 3 种自然也就解出来了。
任意个数球的称法
假设有足够正常重量球的情况下称k次可以从最多F(k)个球里找出不知轻重的坏球(称多次的情况下,称完第一次就会有若干正常重量的球了),现在来计算称k+1次的F(k+1)最大可以到多少,在有足够正常重量球的情况下,0次可以称出1个球,1次可以称出2个球。因此F(0)=1,F(1)=2。
按照测试用例设计的元素分析法,先找出其中的元素:天平,若干球
先分析一下这些元素的属性,天平有两端托盘可以放东西,可以根据天平平衡情况判断天平两端放的东西重量是否相等。球的属性主要是重量,正常球重量都相等,坏球重量和正常球不相等。
再用测试用例设计的分类推理法来进行分类,按球的属性是无法分类的,因为每个球的重量都不知道,因此按天平属性来进行分类,可以将球分为三类,放在天平左端托盘中的,放在天平右端托盘中的,没有放入天平托盘的。
任何一个球最终都可以归结到上面分成的三类中,不论将球分成多少堆,最终都可以将其看成只有三堆,一堆要放入天平左端托盘中,一堆要放入天平右端托盘中,一堆不放入天平托盘中。所以分成了 X Y Z 三堆(某堆可以为空)可以看成是唯一的分法。
将F(k+1)个球分成X,Y,Z三堆,先将X,Y放入天平的两端称一下,由于对成性,只需要考虑两种情况:
1 X Y一样重
此时只要在 Z 堆中找出坏球就可以了, Z=F(k)
2 X Y
在称完第 1 次后,此时可以再次使用元素分析法,找出四个元素:天平, X Y Z
和前面一样可以采用分类推理法根据天平元素的属性将 X 分成 X1 X2 X3 Y 分成 Y1 Y2 Y3 Z 分成 Z1 Z2 Z3 。由于对称性,可以按以下进行放置:
天平左端放置 X1 Y1 Z1
天平右端放置 X2 Y2 Z2
G(k) = X+Y
X1+Y1+Z1 X2+Y2+Z2 重时 ,无法判断是 Y2 中有坏球还是 X1 中有坏球,由于对称性,可以假定 Y2 0 (球个数为 0 ),那么就可以判断出 X1 中有坏球,且坏球比正常球重,此时 X1+Y2=3^(k-1) 。如果 X1 Y2 都不为 0 时,可以得到 X1+Y2=G(k-1)
X1+Y1+Z1 X2+Z2 重量相等时 ,表明坏球在 X3+Y3+Z3 中,由于此时无法判断坏球是在 X3 还是 Y3 中,如果令其中一个为 0 ,那么另一个则为已知重量情况下称 k 1 次的最大个数,因此 X3+Y3 最大值为 3^(k-1) ,如果不为 0 ,则 X3+Y3=G(k-1)
X1+Y1+Z1 X2+Z2 轻时 ,由于此时无法判断坏球是在 Y1 还是 X2 中,并且 X2 Y1 重,这和 X Y 重的情况是一样的,那么可以得出 X2+Y1 G(k-1) 或者 3^(k-1)
这时有 G(k) X+Y = 3^k
或者 G(k) X+Y = 3 × G(k-1)
对后面那个等式,可以求出 G(k) 3^(k-1) × G(1) ,由于 G(1) 的最大值不可能超过 3
综合上面两种情况, G(k) 取最大值 3^k
由于 Z 堆中球的最大个数是在 X Y 一样重的情况下来求解的,因此这里 Z1 Z2 Z3 中的球的个数并不重要,前面已经讲过 Z = F(k)
这样可以得到 F(k 1) = X+Y+Z = X1+X2+X3+Y1+Y2+Y3+Z
= F(k) +G(k)
=F(k) + 3^k
解出 F(k) = (3^k 1) / 2 F(1) - (3 - 1)/2 = (3^k 1) / 2 1
这样求出了有足够标准球情况下称 k 次可以称出的最大值,在没有标准球的情况下,由于称 2 次只能称 4 个球,比有标准球时少一个,因此可以得出称 k 次可以称出的最大值为 max k (3^k 1) / 2
这样 3 次可以称出 13 个球, 4 次可以称出 40 个球 ….
 
根据以上的推理过程,可以得出以下的称法:
2 次称 5 个球的称法(有标准球参照 ,F(2) = F(1)+3 = 2+3 = 5
有标准球时 2 次称 5 个球的称法
将球编号为 1 2 3 4 5 ,标准球记为 S
1 2 放入天平的一端, 3 S 放入天平的另一端
如果 1 2 3 S ,表明坏球在 1 2 3 中,此时将 1 2 放入天平两端称一下,如果重量相等则 3 为坏球,如果不相等则重的那个是坏球。
同理如果 1 2 3 S 轻时 ,将 1 2 放入天平两端称一下,相等则 3 为坏球,不相等则轻的那个为坏球。
如果 1 2 3 S 一样重 ,表明坏球在 4 5 里面,取 4 S 一起称一下,相等则 5 为坏球,不相等则 4 为坏球。
 
3 次称 13 个球的称法(无标准球做参考)
将球分为( 1 2 3 4 ),( 5 6 7 8 ),( 9 10 11 12 13 )三组
将( 1 2 3 4 )和( 5 6 7 8 )放入天平两端称一下
如果重量相等 则转换为有标准球做参考在( 9 10 11 12 13 5 个球里找坏球的问题,上面已经给出了。
如果重量不等 ,由对称性不妨设 1 2 3 4 为重的一端
将( 1 5 6 7   8 9 10 11 )一起称一下
如果( 1 5 6 7 )重,则表明坏球在 1 8 里面,只要拿一个标准球和 1 8 称一下就可以找出坏球
如果两边一样重 ,那么坏球在 2 3 4 里,且坏球为重球,称一次就可以称出
如果( 1 5 6 7 )轻,那么坏球在 5 6 7 里面,且坏球为轻球,称一次就可以找出。
  
相关文章链接:
l        微软过桥问题与测试人员素养
l        等价类分法新解
l        测试用例设计中的NP难题
l        C/C++代码检视实例
l        90%程序员写不出无BUG的二分查找程序?
l        测试驱动需求分析
 



http://www.niftyadmin.cn/n/3657771.html

相关文章

多核编程中的任务分组竞争模式

多核编程中的任务分组竞争模式在多核编程中,锁竞争导致的CPU饥饿现象是引起多核CPU性能无法发挥的最重要原因之一,在多核编程中的锁竞争难题一文中已经讲过锁竞争对性能的影响,如何消解锁竞争导致的CPU饥饿现象成了迫切需要解决的问题。目前业…

多核编程中的任务随机竞争模式的概率分析

多核编程中的任务随机竞争模式的概率分析前一篇多核编程中的任务分组竞争模式中谈到了让任务分组竞争以解决多核CPU遇到的锁竞争导致的饥饿问题。但是并不是任意的共享数据都能够设计成进行分组竞争的模式,比如最常用的需要用于查找的数据结构,当数据结构…

向github上传代码

(1)git init (2)git add . (3)git commit -m jvj (4)git remote add origin https://github.com/t20134297/file_arrange.git 如果出现错误: fatal: remote origin already exists 则执行以下语句: git remote rm origin 再执行git remote add…

OpenMP创建线程中的锁及原子操作性能比较

OpenMP创建线程中的锁及原子操作性能比较相关文档连接:多核编程中的任务随机竞争模式的概率分析 多核编程中的任务分组竞争模式 多核编程中的负载平衡难题 多核编程中的锁竞争难题 多核编程的几个难题及其应对策略(难题一)OpenMP并…

多核新观念-象使用内存一样使用CPU?

多核新观念-象使用内存一样使用CPU?多核时代,很重要的一点就是要将多个CPU核同时运转起来,提高CPU的利用率,说得专业一点就是要提高多核CPU的加速比系数。但是并不是任何时候都可以同时将多个核运转起来,比…

多核系统中三种典型锁竞争的加速比分析

多核系统中三种典型锁竞争的加速比分析目录1.1 引言... 11.2 任务粒度因子与锁粒度因子... 21.3 固定式锁竞争中的加速比分析... 31.4 随机锁竞争中的加速比分析... 31.5 分布式锁竞争的加速比分析... 41.6 结论... 51.7 参考文献&#xff…

Python 字典update

x1 {q:12, w:13, e:14} x2 {q:22, w:77} x1.update(x2) print(x1) 上面的是一个程序例子,x1.update(x2), 代表如果x2中的键和x1中有相同的部分,则将x1中对应的键所对应的值更新为x2中的这个键值。上述程序的运行结果为: {q: 2…

无锁编程与分布式编程那个更适合多核CPU?

无锁编程与分布式编程那个更适合多核CPU?前一篇文章多核系统中三种典型锁竞争的加速比分析讲过了三种典型锁竞争情况下的加速比情况,特别是分布式锁竞争的加速比和CPU核数成正比,有很好的加速比性能。由于近些年在学术界中,无锁编…