算法简化

时间:2014-05-08 08:14:31

标签: php algorithm optimization

这个问题是关于其他人先前发布的另一个问题:

PHP: Determining Grid Count Between 2 Grids

注意:对于这个问题,不需要理解上述问题;我只想提供它以供参考和附加上下文。

我能够解决问题,但我不喜欢我的解决方案 - 它显然是重复的,我知道它可以简化,但我的大脑现在太炒了,看不到它。在得到解决方案之前,我无法放弃并上床睡觉。

这是我当前的工作解决方案(至少是与我的问题相关的部分):

// Note: $col_diff and $row_diff will always be integers between 0 and 4

if ($col_diff==4) {
    $d = 5;
}
elseif ($col_diff==3) {
    if ($row_diff==4) 
        $d = 5;
    else
        $d = 4;
}
elseif ($col_diff==2) {
    if ($row_diff==4)
        $d = 5;
    elseif ($row_diff==3)
        $d = 4;
    else
        $d = 3;
}
elseif ($col_diff==1) {
    if ($row_diff==4)
        $d = 5;
    elseif ($row_diff==3)
        $d = 4;
    elseif ($row_diff==2)
        $d = 3;
    else
        $d = 2;
}
elseif ($col_diff==0) {
    if ($row_diff==4)
        $d = 5;
    elseif ($row_diff==3)
        $d = 4;
    elseif ($row_diff==2)
        $d = 3;
    elseif ($row_diff==1)
        $d = 2;
    else
        $d = 1;
}

echo $d; // Correct!

如何简化此操作并删除冗余?

这就是我设想的优化结构,但显然存在缺陷:

for ($i=4;$i>=0;$i--) 
    if ($col_diff==$i) 
        for ($j=$i;$j>=0;$j--)
            if ($row_diff==$j)
                $d = $j+1;

echo $d; // NOT Correct!

1 个答案:

答案 0 :(得分:2)

我从你的代码中创建了一个表:

    col 4   3   2   1   0
row                     
4       5   5   5   5   5
3       5   4   4   4   4
2       5   4   3   3   3
1       5   4   3   2   2
0       5   4   3   2   1

这里有一个模式:一个单元格的值等于它与0,0的距离(请参阅数字形式'正方形'以右下角为中心)。 / p>

或者:

cell = Max( x, y ) + 1

......有点简单,嗯?

将此视为证明:

cell4,4 = Max( 4, 4 ) + 1 == 5
cell2,3 = Max( 2, 3 ) + 1 == 4

对于您的PHP,这是:

$d = max( $col_diff, $row_diff ) + 1;

就这么简单!

如果您的域名限制在4-0范围内,则添加一个钳位:

$d = max( max( min( $col_diff, 4 ), 0 ), max( min( $row_diff, 4 ), 0 ) + 1;