关闭

用组合提高软件测试用例的生成

发表于:2010-4-02 14:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:山天大畜(cnblogs)    来源:51Testing软件测试网采编

  一个较好的方法计算Choose(n,k)可以用下面的等价公式:

Choose(n,k) = (n * (n-1* (n-2* ... * (n-k+1)) / ( 1 * 2 * ... * k) 

  下面的代码是一个例子:

Choose(7,3= (7 * 6 * 5/ (1 * 2 * 3)

  这样就避免了直接计算n的阶乘,在运算中,你也可以先做一部分除法以减小运算量,例如Choose(7,3),你可以先计算7*6,再除以2,得到24,然后*5在除以3,得到最终结果35。

  第二个优化是利用下面的等价公式:

Choose(n,k) = Choose(n, n-k).

  例如Choose(10,8)=Choose(10,2)。这个关系可能不容易想象,但是你可以自己举几个简单的例子计算,结果确实如此。计算Choose(10,8)需要计算7次乘法以及7次除法,而Choose(10,2)则只需1次乘法和1次除法。

  把这些想法结合起来,我们便可以优化以前的Choose(n,k)方法,如图5。在Choose函数中,我判断了如果n等于k则直接返回1。这在之前的理论并没有提到,但是这可以有效提高程序的性能。

  图5 优化的Choose方法:

public static long Choose(long n, long k)
{
  
if (n < 0 || k < 0)
    
throw new Exception("Invalid negative parameter in Choose()"); 
  
if (n < k) return 0;
  
if (n == k) return 1;

  
long delta, iMax;

  
if (k < n-k) // ex: Choose(100,3)
  {
    delta 
= n-k;
    iMax 
= k;
  }
  
else         // ex: Choose(100,97)
  {
    delta 
= k;
    iMax 
= n-k;
  }

  
long ans = delta + 1;

  
for (long i = 2; i <= iMax; ++i)
  {
    
checked { ans = (ans * (delta + i)) / i; } 
  }

  
return ans;
}

64/6<123456>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号