我想根据原始分数获得最佳/最有效的方法来获得团队调整分数的建议。让我解释一下。
团队是合约桥梁团队,获胜者的原始分数从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
这是我的代码。它工作正常:
$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.";
我的做法似乎效率低下。由于阵列很小,我怀疑是否有任何性能问题,但我希望尽可能高效地进行转换。
你有什么建议?
答案 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." ;