Php 优化洗牌阵列-我需要遍历整个阵列吗?
我会尽力解释我的问题。我正在尝试用PHP创建一个chessengine(只是为了好玩:-),代码中的整数只返回有效的移动(为了简单起见,在真实代码中,它的对象和移动模式取决于它是关于哪个片段的)Php 优化洗牌阵列-我需要遍历整个阵列吗?,php,performance,random,Php,Performance,Random,我会尽力解释我的问题。我正在尝试用PHP创建一个chessengine(只是为了好玩:-),代码中的整数只返回有效的移动(为了简单起见,在真实代码中,它的对象和移动模式取决于它是关于哪个片段的) 我正在寻找一种有效搜索数组的方法。有效是指尽可能快的搜索。请看我在下面代码中的评论“是否有可能在不遍历所有1000个值的情况下打破循环?”我希望这些评论能够解释我想要实现的目标。我只是在寻找优化以下代码的想法,而不是完整代码:-) 如果我说我会从一开始就产生有效的移动(基于下面的评论) 跳出循环的
我正在寻找一种有效搜索数组的方法。有效是指尽可能快的搜索。请看我在下面代码中的评论“是否有可能在不遍历所有1000个值的情况下打破循环?”我希望这些评论能够解释我想要实现的目标。我只是在寻找优化以下代码的想法,而不是完整代码:-)
如果我说我会从一开始就产生有效的移动(基于下面的评论)
跳出循环的最佳方式是什么?在正常情况下,您可能遇到的有效移动的最大数量约为100。如果你有9个皇后,你可能会得到200个。不过,1000太大了 生成有效移动列表意味着您甚至不需要检查它们是否有效。但是,我想象你正在生成一个所有组合的列表,即使它们涉及到传递另一个工件,用你自己的工件降落在正方形上,或者降落在板域之外 我会说,在你的第一代人中进行这些检查:
- 对于每个棋子,检查4个可能的移动并存储有效的移动
- 对于每个城堡或主教,检查14个可能的顺序,从 在工件位置,向4个方向移动,直到碰到一个 无效空间(击中自己的部分意味着你走得太远了。 击中对手棋子意味着你击中了最后一个可能的棋子)
- 对于皇后区,与城堡或主教相同,但8个方向而不是4个方向
- 对于骑士,检查8种可能的移动是否有效
- 对于king,请检查8 有效性的可能举措
- 检查两个城堡是否移动 有可能
然后是个人资料。你需要一个好的采样分析器来优化和找到你的热点。注意像_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];