用数组来优化算法
主要思路 :在所需数据中存在相对简单且数据量稳定的情况下,利用 PHP 数组 (Array) 的下标 (Index) 可以为字符串 (String) 的特点,巧妙的将数据临时存放到数组中。这样可以通过下标 (Index) 快速获取所需值,从而降低对数据库的查询次数,进而降低算法的时间复杂度。
[方法 3 ]从 Classes 表中获取 ClassID 和 ClassName 的对应关系存放到 ClassArray 一维数组中,从 Students 表中获取 SID 和 StuName 以及 ClassID 的对应关系存放到 StuArray 二维数组中。之后从 Scores 表中找出满足条件的学生学号,从 StuArray 数组中读取学生的姓名和班级编号,从 ClassArray 中读取班级的名称。PHP 算法描述如下:
清单 3. 方法 3
$ClassArray = Array();
$StuArray = Array();
$classstr = "select ClassID,ClassName from Classes";
$classdata = $db2handle->query( $classstr);
while( $class=$classdata ->fetchRow(DB_FETCHMODE_ASSOC) ){
// 生成 ClassArray 数组,下标 Index 以 ClassID 命名,对应的值为 ClassName
$ClassArray[$class[ ' ClassID ' ]] = $class[ ' ClassName ' ];
}//end while $ClassArray
$stustr="select SID,StuName,ClassID from Students";
$studata = $db2handle->query( $stustr);
while( $stu=$studata ->fetchRow(DB_FETCHMODE_ASSOC) ){
// 生成 StuArray 数组,下标 Index 以 SID 命名,对应的值为 StuName 和 ClassID
$StuArray[$stu [ ' SID ' ]][ ' StuName ' ] = $stu[ ' StuName ' ];
$StuArray[$stu [ ' SID ' ]][ ' ClassID ' ] = $stu[ ' ClassID ' ];
}//end while $StuArray
$scorestr = "select distinct SID from Scores where Course= '数学' and Score>90";
$scoredata = $db2handle->query( $scorestr );
// 从数据库中获取满足条件的学生学号
while( $score=$scoredata->fetchRow(DB_FETCHMODE_ASSOC) ){
// 读取学生的学号,并从 StuArray 中读取学生的姓名,从 ClassArray 中读取班级名称
echo "StudentName=".$StuArray[ $score[ ' SID ' ] ][ ' StuName']."\t ";
echo "ClassName=".$ClassArray[ $StuArray[ $score[ ' SID ' ] ][ ' ClassID ' ] ]."\n";
}//end while for getting each student ' s ID. Done
改进后方法的时间复杂度仍为 T(n)=O(1)。和方法 1 相比,方法 3 不必担心因某一个表中的记录增加而引起的数据库查询代价的成倍增加。和方法 2 相比,时间复杂度降低的同时,也没有影响算法空间复杂度。可谓一举两得。