从原始数量调整的最佳方法

时间:2013-05-31 12:44:27

标签: php arrays

我想根据原始分数获得最佳/最有效的方法来获得团队调整分数的建议。让我解释一下。

团队是合约桥梁团队,获胜者的原始分数从0(领带)到任何数字,但大于100将是罕见的。原始分数称为IMPS,调整后的分数称为VP,但这只是为了清晰起见。

调整表是:

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.";

我的做法似乎效率低下。由于阵列很小,我怀疑是否有任何性能问题,但我希望尽可能高效地进行转换。

你有什么建议?

3 个答案:

答案 0 :(得分:2)

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

实际上,无论如何都需要一个查找表,因为似乎没有可以可靠地映射查找表内容的算法,现在你的实现是以big-O表示法O(1)。因此,根据定义,它不能提高效率。

For reference on lookup tables (emphasis added in quote)

  

在计算机科学中,查找表是一个替换运行时的数组   使用更简单的数组索引操作进行计算。 节省的费用   由于检索值,处理时间的条件可能很重要   来自内存通常比进行“昂贵”计算更快   或输入/输出操作。表格可以预先计算和   存储在静态程序存储中,计算(或“预取”)为   程序初始化阶段(memoization)的一部分,甚至存储   在特定于应用程序的平台中的硬件中。

使用它们并没有“不良做法”。回到CPU没有浮点单元的日子里,我们在程序中嵌入了整个正弦和sqrt表,以避免在运行时计算成本昂贵的计算。

答案 1 :(得分: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;

&GT;

答案 2 :(得分: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." ;