周伟明的专栏

<<软件测试实践>> 已上市

周伟明ID:drzhouweiming
185572次访问,排名377好友1人,关注者10
软件技术爱好及研究者
drzhouweiming的文章
原创 48 篇
翻译 0 篇
转载 0 篇
评论 315 篇
周伟明的公告
一书已上市, 欢迎大家提出意见!
最近评论
yongrending:这种技术在一般的家庭版电脑上使用的可能性不大,但在公司和网站的服务器中确是值得推荐和推广、研发的
drzhouweiming:因为sections语句后面有隐含的barrier
如果要将其变成并行的话,需要使用nowait子句
kuangxiangjie:这种方式和前面那种方式的区别是,两个sections语句是串行执行的,即第二个sections语句里的代码要等第一个sections语句里的代码执行完后才能执行。

您好,我对这句话不是很明白....parallel不是并行的么,怎么在它里面的两个ses会是串行的呢
algcfx:Wow gold
dimire:LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
……
文章分类
    收藏
      相册
      最近文章
      1、多核新观念-象使用内存一样使用CPU?
      2、多核编程中的任务随机竞争模式的概率分析
      3、OpenMP创建线程中的锁及原子操作性能比较
      4、多核编程中的任务分组竞争模式
      5、称球问题的测试解法
      90%程序员写不出无BUG的二分查找程序?
      C/C++代码检视实例
      多核编程中的负载平衡难题
      多核编程中的锁竞争难题
      微软过桥问题与测试人员素养
      接口关系稳定原理探索
      接口设计定理
      模块分解原理与三权分立
      模块分解原理的探索
      测试驱动需求分析
      筑一座坝治好中国的沙漠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 称球问题的测试解法收藏

      新一篇: 多核编程中的任务分组竞争模式 | 旧一篇: 接口重构定理与Open-Close原则

       
      称球问题十几年前就在深圳的一网情深BBS上成为热门问题,此后的十余年间不断有人提起此问题,前段时间还在网上看到有人重新提起此问题,已经成为了新网民的入门级必知必会问题之一。
      称球问题一般会有以下3种情况:
      1、M个球,其中有一个坏球,知道是轻还是重,用天平称出坏球来。
      2、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来。
      3、M个球,其中有一个坏球,不知是轻还是重,用天平称出坏球来,并告知坏球是轻还是重。
      现在要问对于上面3种情况,称k次,最多可以在几个球中找出坏球来?也就是要求出称k次的M的最大值来。
      1种情况,比较简单,1次可以称3个球,2次可称9个球,k次可以称3^k3k次方)个球。
      2种情况就比第1种情况复杂多了,对第3种情况,和第2种情况类似,知道了第2种的解法后,第3种自然也就解出来了。
      任意个数球的称法
      假设有足够正常重量球的情况下称k次可以从最多F(k)个球里找出不知轻重的坏球(称多次的情况下,称完第一次就会有若干正常重量的球了),现在来计算称k+1次的F(k+1)最大可以到多少,在有足够正常重量球的情况下,0次可以称出1个球,1次可以称出2个球。因此F(0)=1,F(1)=2。
      按照测试用例设计的元素分析法,先找出其中的元素:天平,若干球
      先分析一下这些元素的属性,天平有两端托盘可以放东西,可以根据天平平衡情况判断天平两端放的东西重量是否相等。球的属性主要是重量,正常球重量都相等,坏球重量和正常球不相等。
      再用测试用例设计的分类推理法来进行分类,按球的属性是无法分类的,因为每个球的重量都不知道,因此按天平属性来进行分类,可以将球分为三类,放在天平左端托盘中的,放在天平右端托盘中的,没有放入天平托盘的。
      任何一个球最终都可以归结到上面分成的三类中,不论将球分成多少堆,最终都可以将其看成只有三堆,一堆要放入天平左端托盘中,一堆要放入天平右端托盘中,一堆不放入天平托盘中。所以分成了XYZ三堆(某堆可以为空)可以看成是唯一的分法。
      将F(k+1)个球分成X,Y,Z三堆,先将X,Y放入天平的两端称一下,由于对成性,只需要考虑两种情况:
      1XY一样重
      此时只要在Z堆中找出坏球就可以了,Z=F(k)
      2XY
      在称完第1次后,此时可以再次使用元素分析法,找出四个元素:天平,XYZ
      和前面一样可以采用分类推理法根据天平元素的属性将X分成X1X2X3Y分成 Y1Y2Y3Z分成Z1Z2Z3。由于对称性,可以按以下进行放置:
      天平左端放置 X1Y1Z1
      天平右端放置 X2Y2Z2
      G(k) = X+Y
      X1+Y1+Z1 X2+Y2+Z2重时,无法判断是Y2中有坏球还是X1中有坏球,由于对称性,可以假定Y20(球个数为0),那么就可以判断出X1中有坏球,且坏球比正常球重,此时X1+Y2=3^(k-1) 。如果X1Y2都不为0时,可以得到X1+Y2=G(k-1)
      X1+Y1+Z1 X2+Z2重量相等时,表明坏球在X3+Y3+Z3中,由于此时无法判断坏球是在X3还是Y3中,如果令其中一个为0,那么另一个则为已知重量情况下称k1次的最大个数,因此X3+Y3最大值为3^(k-1),如果不为0,则X3+Y3=G(k-1)
      X1+Y1+Z1 X2+Z2轻时,由于此时无法判断坏球是在Y1还是X2中,并且X2Y1重,这和XY重的情况是一样的,那么可以得出X2+Y1G(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堆中球的最大个数是在XY一样重的情况下来求解的,因此这里Z1Z2Z3中的球的个数并不重要,前面已经讲过 Z = F(k)
      这样可以得到F(k1) = 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次可以称出的最大值为maxk(3^k 1) / 2
      这样3次可以称出13个球,4次可以称出40个球….
       
      根据以上的推理过程,可以得出以下的称法:
      2次称5个球的称法(有标准球参照,F(2) = F(1)+3 = 2+3 = 5
      有标准球时2次称5个球的称法
      将球编号为12345,标准球记为S
      12放入天平的一端,3S放入天平的另一端
      如果12 3S,表明坏球在123中,此时将12放入天平两端称一下,如果重量相等则3为坏球,如果不相等则重的那个是坏球。
      同理如果123S轻时,将12放入天平两端称一下,相等则3为坏球,不相等则轻的那个为坏球。
      如果123S一样重,表明坏球在45里面,取4S一起称一下,相等则5为坏球,不相等则4为坏球。
       
      3次称13个球的称法(无标准球做参考)
      将球分为(1234),(5678),(910111213)三组
      将(1234)和(5678)放入天平两端称一下
      如果重量相等则转换为有标准球做参考在(9101112135个球里找坏球的问题,上面已经给出了。
      如果重量不等,由对称性不妨设1234为重的一端
      将(1567 891011)一起称一下
      如果(1567)重,则表明坏球在18里面,只要拿一个标准球和18称一下就可以找出坏球
      如果两边一样重,那么坏球在234里,且坏球为重球,称一次就可以称出
      如果(1567)轻,那么坏球在567里面,且坏球为轻球,称一次就可以找出。
        
       

      发表于 @ 2007年05月17日 20:13:00|评论(loading...)|编辑

      新一篇: 多核编程中的任务分组竞争模式 | 旧一篇: 接口重构定理与Open-Close原则

      评论

      #drzhouweiming 发表于2007-05-17 20:18:30  IP: 220.249.249.*
      不好意思,昨天晚上发文章时,一个细节的地方推导有错,可能给大家带来误导,今天将文章更新了一下,结果更新时出了问题,无法将新内容更新上去,今天只好将文件删掉重新将更新的内容贴一下。

      给大家带来的不便还请多多海涵。
      #whyned 发表于2007-06-01 01:38:48  IP: 58.33.26.*
      周伟明先生:
      看了在<<程序员>>第5期上的<<软件问题定位常见方法>>一文深受启发,感谢您能提供这么好的文章.我会将您的这些方法运用到我的强类型编译型脚本csm中,来检查内存泄漏和越界问题.另外由于我在栈上产生的对象使用的是stacknew算子,所以应该也可以用来检测在堆栈上内存的越界访问问题.
      #algcfx 发表于2008-07-01 09:38:51  IP: 124.162.65.*
      Wow gold
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 周伟明