Php 优化洗牌阵列-我需要遍历整个阵列吗?

Php 优化洗牌阵列-我需要遍历整个阵列吗?,php,performance,random,Php,Performance,Random,我会尽力解释我的问题。我正在尝试用PHP创建一个chessengine(只是为了好玩:-),代码中的整数只返回有效的移动(为了简单起见,在真实代码中,它的对象和移动模式取决于它是关于哪个片段的) 我正在寻找一种有效搜索数组的方法。有效是指尽可能快的搜索。请看我在下面代码中的评论“是否有可能在不遍历所有1000个值的情况下打破循环?”我希望这些评论能够解释我想要实现的目标。我只是在寻找优化以下代码的想法,而不是完整代码:-) 如果我说我会从一开始就产生有效的移动(基于下面的评论) 跳出循环的

我会尽力解释我的问题。我正在尝试用PHP创建一个chessengine(只是为了好玩:-),代码中的整数只返回有效的移动(为了简单起见,在真实代码中,它的对象和移动模式取决于它是关于哪个片段的)


我正在寻找一种有效搜索数组的方法。有效是指尽可能快的搜索。请看我在下面代码中的评论“是否有可能在不遍历所有1000个值的情况下打破循环?”我希望这些评论能够解释我想要实现的目标。我只是在寻找优化以下代码的想法,而不是完整代码:-)



如果我说我会从一开始就产生有效的移动(基于下面的评论)


跳出循环的最佳方式是什么?

在正常情况下,您可能遇到的有效移动的最大数量约为100。如果你有9个皇后,你可能会得到200个。不过,1000太大了

生成有效移动列表意味着您甚至不需要检查它们是否有效。但是,我想象你正在生成一个所有组合的列表,即使它们涉及到传递另一个工件,用你自己的工件降落在正方形上,或者降落在板域之外

我会说,在你的第一代人中进行这些检查:

  • 对于每个棋子,检查4个可能的移动并存储有效的移动

  • 对于每个城堡或主教,检查14个可能的顺序,从 在工件位置,向4个方向移动,直到碰到一个 无效空间(击中自己的部分意味着你走得太远了。 击中对手棋子意味着你击中了最后一个可能的棋子)

  • 对于皇后区,与城堡或主教相同,但8个方向而不是4个方向
  • 对于骑士,检查8种可能的移动是否有效
  • 对于king,请检查8 有效性的可能举措
  • 检查两个城堡是否移动 有可能
对于每一个动作,你还需要确保它不会让你处于受控状态。该功能可能会得到优化,因此您只能从国王的位置向外看

一旦你完成了所有的动作,最多16个,你的动作列表应该只包含有效的动作

事情变得昂贵的地方是你的未来。您希望模拟未来的多少移动?你如何衡量每次移动的价值/风险


然后是个人资料。你需要一个好的采样分析器来优化和找到你的热点。注意像_array中的
这样昂贵的方便功能,如果可以,尽量避免使用。循环中的循环将破坏性能。

foreach(范围(11000)为$nr)$moves\u可能有效[]=$nr
只是
$moves\u maybe\u valid=范围(11000)lol:P@RoboRobok-哈哈。符合事实的对不起:-)你是说,
break?我无法想象如果你没有检查移动是否有效,你怎么会知道没有更多有效的移动。你为什么不首先生成有效的移动呢?一个优化就是你可能不需要在数组中检查
。除非原始列表中有重复项,否则不可能多次添加相同的移动。in_数组非常昂贵,从O(n)到O(n^2)
//This is for demonstrating
//1000 values to go through
$moves_maybe_valid = range(1,1000);
shuffle($moves_maybe_valid);

//Go through possible values
$move_checked = [];
$nr=0;
foreach($moves_maybe_valid as $mmv) {
    $move_is_valid = check_move($mmv);

    //Check if not in checked array
    if ($move_is_valid === false && !in_array($mmv, $move_checked)) {

        //Add to checked move array
        $move_checked[] = $mmv;
    }

    //IS it possible to break out of loop without 
    //going through all 1000 values?
    //When all valid moves are true I want to break here
    //but I don't know when that is.

}

//for demonstration purpose only
//numbers (5,6) that returns true are unknown until an
//an actual check is done in this function
function check_move($nr) {
    if ($nr == 5 || $nr == 6) {
        return true;
    }
    return false;
}
$valid_moves = [5,6];