一道小算法题-随机取出一首诗-算法剖析

上周,主管出了一道题,从唐诗三百首(如下图,一个txt文档)里随机输出一首诗



下面把算法上了逐个分析

算法1:
$ts300 = file_get_contents("300.txt");
preg_match_all('/\d\d\d(.*?)(?=\d)/ms', $ts300, $match);
$shi = array_rand($match[1]);
 
echo "
";
echo $match[1][$shi];
echo "
";
file_get_contents 复杂度为O(n),
preg_match_all 复杂度为O(n),
array_rand复杂度会单独开篇讲,
所以算法1的复杂度 为O(2n)
=========================================================================================================================================
算法2:
$file_handle = fopen("300.txt", "r");
$i = 1;
while (!feof($file_handle))
{
    $line = fgets($file_handle);
    if (preg_match('/\d+/', $line))
    {
        $arrPre[$i]['content'] = preg_replace('/[0-9]*/', '', $line);
        $i++;
    } else
    {
        if ($line != '')
        {
            $arrPre[$i - 1]['content'] .= $line;
        }
    }
}
$data = $arrPre[rand(1, count($arrPre))];
echo "
";
echo $data['content'];
fclose($file_handle);
=====================================================================================================
算法3:
echo quick_read_file("300.txt");
function quick_read_file($filename,$offset = false)
{
    $handle = fopen($filename, "r");
    if($offset === false)
    {
        $size = filesize($filename);
        $location = mt_rand(0, $size);              //文件指针随机位置
    }
    else
    {
        $location = $offset;                        //文件指针从头开始
    }
    fseek($handle, $location,SEEK_SET);             //定位文件指针
    while (($buffer = fgets($handle, 128)) !== false)
    {
        if($title && preg_match("/\d/", $buffer))   //如果已经读过标题,并且这行又有标题,则说明上一首诗已经读完,直接break
        {
            break;
        }
        if($title)                                  //如果已经读过标题 则直接存字符串 没读过title则不存
        {
            $str .= $buffer.'
'
;
        }
        elseif(preg_match("/\d/", $buffer))         //如果这行有标题存在,则title设为true,并把标题存字符串
        {
            $title = true;
            $str .= substr(trim($buffer),3).'
'
; //去掉标题中的数字
        }
    }
    if(!$title)             //如果while循环结束了还是没有title,说明fseek的位置是文件的最后几行了,那么就读从第一行开始读
    {
        quick_read_file($filename,0);
    }
    return $str;
}

你可能感兴趣的:(一道小算法题-随机取出一首诗-算法剖析)