编程任务:
1、我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。 
  要求如下: 
  1)/myworks/example/bbe.txt,98版本英文圣经一本 
  2)输入部分要求如下:php ./example.php [单词] 
  3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列... 
  说明: 
  1)此文本4MB之巨... 
  2)单词的含义:由英文字母(大小写),数字(0-9)组成的串 
  3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的 
  4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册 
  5)算法复杂度要求不能大于O(N^2)(就是N的平方) 
  6)什么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++] 4.1 
我自己到是写出来了,但是不知道理没理解对,总觉得貌似性能不够好。$file = file('1.txt');
$m = 'wanderer';//搜索的单词
$str = '';
foreach ($file as $line => $v) {
    $arr = explode(' ', $v);
    $key = array_search($m, $arr);
    if ($key !== false) {
        $str .= ($line + 1) . ',' . ($key + 1) . ' ';
    }
}
var_dump($str);
var_dump(memory_get_usage()); //输出占用内存
/*结果为:
string '94,22 96,25 ' (length=12)
int 3049936
*/不知道各位高手们还有更优化的方法没,多多指教

解决方案 »

  1.   

    我认为的几个关键点:
    1、把圣经(bbe.txt)背熟 (预处理数据)
    2、飞快的回答出这个单词在第几行第几个单词位置 (从预处理的数据中能够很快的获取相关单词的信息)预处理数据的想法:
    将文本数据的单词转到key/value的形式。key为单词,value为所在的行列信息。这样每个单词都可以通过key值快速索引。算法的简单思路:
    循环读取文件,每次读取一行,然后计算这一行的所有单词,已经存在的key,追加value,不存在的key,记录key/value。最后就能形成key/value的集合。因为元操作只是循环读取每一行,所以算法复杂度应该是O(n),而每次读取一行,能避免占用大量内存。
      

  2.   

    此文本4MB之巨——你用file函数,能跑起来么!!!
      

  3.   

    2楼主张的思路有道理。我想可能也得应用索引,指针读取文件来准确查找吧。
    有一款程序《162100帖吧》采用的是关系型文本数据库,可能用得上,它的说明为:1、程序采用关系型文本数据库技术:
    2、定位读取记录——运行快捷,第100000条记录与第100条记录的读取速度是一样的
    3、精密存储数据——精密计算数据存放位置,定位写入,只写该写的地方,而不是全写数据,从而不会出现损失数据的情况
    4、空间毫不浪费——被删除记录遗留的空闲空间被详细记载、优化分配、充分利用,超级超强承载地址为:http://download.162100.com/。建议看一看,有没有帮助。