1

我想就基于原始分数为团队获得调整分数的最佳/最有效方法提出建议。让我解释。

这些球队是合同桥牌球队,获胜者的原始分数是从 0(平局)到任意数字,但很少有超过 100 的情况。原始分数称为 IMPS,调整后的分数称为 VPs,但这只是为了清楚起见。

调整表为:

IMPs          VPs
1 thru 2      16 to 14
3 thru 4      17 to 13
5 thru 7      18 to 12
8 thru 11     19 to 11
12 thru 15    20 to 10
16 thru 20    21 to 9
21 thru 26    22 to 8
27 thru 33    23 to 7
34 thru 41    24 to 6
42 thru 50    25 to 5
51 thru 60    26 to 4
61 thru 71    27 to 3
72 thru 83    8 to 2
84 thru 95    29 to 1
96+       30 to 0

这是我的代码。它工作正常:

PHP

$teamArawScore = 20;  //Actual result will come from form input
if ($teamArawScore >95 )
{
   $teamAadjScore = 30;
   $teamBadjScore = 0;
}
else
{
   $adjustmentArray = array
         (15,
         16,16,
         17,17,
         18,18,18,
         19,19,19,19,
         20,20,20,20,
         21,21,21,21,21,
         22,22,22,22,22,22,
         23,23,23,23,23,23,23,
         24,24,24,24,24,24,24,24,
         25,25,25,25,25,25,25,25,25,
         26,26,26,26,26,26,26,26,26,26,
         27,27,27,27,27,27,27,27,27,27,27,
         28,28,29,29,28,28,28,28,28,28,28,28,
         29,29,29,29,29,29,29,29,29,29,29,29);


 $teamAadjScore = $adjustmentArray[$teamArawScore];
 $teamBadjScore = 30 - $teamAadjScore;
}

echo "TeamA won by $teamArawScore so it won $teamAadjScore VPs and TeamB won $teamBadjScore VPs.";

我的方法似乎效率低下。由于数组很小,我怀疑是否存在任何性能问题,但我想尽可能高效地进行转换。

你有什么建议?

4

3 回答 3

2

由于您描述的表中没有一致性,您将始终填充包含实际逻辑的查找数组。您也可以采用不同的结构,使用较短的数组包含导致给定分数的连续点数等,但最终这些都将导致必须遍历数组以查看最终的位置 - 将内存交换为CPU 周期。

实际上,无论如何您都需要一个查找表,因为似乎没有算法可以可靠地映射查找表的内容,并且您的实现现在O(1)采用大 O 表示法。因此,根据定义,它不能变得更有效率。

有关查找表的参考(在引号中添加了重点)

在计算机科学中,查找表是一个数组,它用更简单的数组索引操作代替了运行时计算。处理时间方面的节省可能是显着的,因为从内存中检索值通常比进行“昂贵”的计算或输入/输出操作要快。这些表可以预先计算并存储在静态程序存储中,作为程序初始化阶段(记忆)的一部分计算(或“预取”),甚至存储在特定应用平台的硬件中。

使用它们并没有什么“坏习惯”。早在 CPU 没有板载浮点单元的时代,我们就会在程序中嵌入整个正弦表和 sqrt 表,以规避运行时计算成本高昂的计算。

于 2013-05-31T12:52:57.633 回答
0

我为你准备了一些东西。尽管我不确定它是否会真正优化执行速度

循环遍历一个数组,如果我们从 A 队获得正分数(高于 1),则知道基值为 16。

这根本没有优化(主要是因为$a == 0条件),但这里是:

<?php
  $teamArawScore = 30;
  $a = $teamArawScore;
  $teamAfinalScore = 16;
  $scoreArray = array(3,5,8,12,16,21,27,34,42,51,61,72,84,10000000000);
  $count = 0;

  foreach($scoreArray as $elem)
  {
      if($a < $elem)
      {
          $teamAfinalScore += $count;

          break;
      }
      $count++;
  }
  if($a ==0)
  {
      $teamAfinalScore = 15;
      $teamBfinalScore = 30 - $teamAfinalScore;
  }

  echo "Team A: ".$teamAfinalScore. "<br />Team B:".$teamBfinalScore;

?>

于 2013-05-31T13:12:03.750 回答
0
<?php

$teamArawScore = 1000;  //Actual result will come from form input
if ($teamArawScore >95 )
{
   $teamAadjScore = 30;
   $teamBadjScore = 0;
}
else

{
   $adjustmentArray = array('1'=>16,'3'=>17,'5'=>18,'8'=>19,'12'=>20,'16'=>21,'21'=>22,'27'=>23,'34'=>24,'42'=>50,'51'=>60,'61'=>27,'72'=>83,'84'=>95);


   $base_score=array(1,3,5,8,12,16,21,27,34,42,51,61,72,84);

   $count=count($base_score);
   $adjustment_value=$adjustmentArray['1'];

   for($i=1; $i<$count-1; $i++){
       if($teamArawScore < $base_score[$i+1]){
       $adjustment_value=$adjustmentArray[$base_score[$i]];
       break;
       }
       else{
           $adjustment_value=$adjustmentArray[$base_score[$i]]; // for values greater than 84
       }
   }

 $teamAadjScore = $adjustment_value;
 $teamBadjScore = 30 - $teamAadjScore;
}

echo "TeamA won by $teamArawScore so it won $teamAadjScore VPs and TeamB won $teamBadjScore VPs." ;
于 2013-05-31T13:22:33.977 回答